C语言SVPWM代码与软件测试
在电机控制中矢量输出主要由三部分构成,一是速度控制块;二是角度控制块,三是矢量计算输出。
速度控制结构
typedef struct {
s32 TargetValue; // Input: Target input (pu)
u32 RampDelayMax; // Parameter: Maximum delay rate (Q0) - independently with global Q
s32 RampLowLimit; // Parameter: Minimum limit (pu)
s32 RampHighLimit; // Parameter: Maximum limit (pu)
u32 RampDelayCount; // Variable: Incremental delay (Q0) - independently with global Q
s32 SetpointValue; // Output: Target output (pu)
u32 EqualFlag; // Output: Flag output (Q0) - independently with global Q
s32 Tmp; // Variable: Temp variable
} RMPCNTL;
定义一个速度控制块
RMPCNTL rap_cntl = RMPCNTL_DEFAULTS;
RMPCNTL *p_rap_cntl = &rap_cntl;
调用速度控制函数,设置目标速度:
p_rap_cntl->TargetValue = SpeedRef;//目标速度 此处目标速度采用Q15定标 即#define Q15 32768 最大速度对应32768
RC_Cal(p_rap_cntl);//加减速控制块
线性加减速函数实现,在该函数中可以实现不同的加减速曲线,使得运行曲线更为平滑
void RC_Cal(RMPCNTL *v)
{v->Tmp = v->TargetValue - v->SetpointValue; //Q15/* 0.0000305 is resolution of Q15 */if (abs_1(v->Tmp) >= Q4)//最小速度误差 Q4 即 #define Q4 16{v->RampDelayCount++ ; if (v->RampDelayCount >= v->RampDelayMax)//速度给定延时{if (v->TargetValue >= v->SetpointValue)//线性加减速v->SetpointValue += Q4;elsev->SetpointValue -= Q4;v->SetpointValue=SatLimit(v->SetpointValue,v->RampHighLimit,v->RampLowLimit);//速度上线限定v->RampDelayCount = 0;}}else v->EqualFlag = 0x7FFFFFFF;
}
角度生成模块
角度模块为速度模块的积分,其实现结构如下:
typedef struct {s32 Freq; // Input: Ramp frequency (pu)
s32 StepAngleMax; // Parameter: Maximum step angle (pu)
s32 Angle; // Variable: Step angle (pu)
s32 Gain; // Input: Ramp gain (pu)
s32 Out; // Output: Ramp signal (pu)
s32 Offset; // Input: Ramp offset (pu)
s32 Angle_L; // Variable: Step angle (pu)
} RAMPGEN;
定义
RAMPGEN rg1 = RAMPGEN_DEFAULTS;
RAMPGEN *p_rg1 = &rg1;
调用
p_rg1->Freq = p_rap_cntl->SetpointValue;
RG_Cal(p_rg1); //angle
实现
void RGInit(RAMPGEN *v)
{v->StepAngleMax = 2*Q14*F1Max/F2Set;//最大步进角度 F1Max是最大电气频率,F2Set为载波频率,Q14为角度定标 #define Q14 16384 对应180度,比如载波频率1K,最大电频率100Hz,那么最大步进叫度则为360/(1K/100) = 36度 归一化之后则是Q14*(360/(F2Set/F1Max))/180 =>Q14*(2*F1Max/F2Set);v->Angle_L = 0;
}void RG_Cal(RAMPGEN *v)
{/* Compute the angle rate */
/*此处即求余也求商目的是防止积分累计时舍去误差过大,将余数累计避免余数舍去时造成较大误差*/v->Angle += (v->StepAngleMax*v->Freq)/32768;v->Angle_L += (v->StepAngleMax*v->Freq)%32768;if(v->Angle_L > 32768 ){v->Angle+=1;v->Angle_L -= 32768;} \
/* Saturate the angle rate within (-1,1) 控制角度范围*/if(v->Angle > Q14){v->Angle = v->Angle - Q14;}else if(v->Angle < -Q14){v->Angle = Q14- v->Angle;}
}
加入dq值之后进行坐标变换
p_ipark1->Angle = p_rg1->Angle;
p_ipark1->Sine = SinQ14(p_rg1->Angle); //Q15
p_ipark1->Cosine = CosQ14(p_rg1->Angle);
p_ipark1->Ds = VdTesting = Q15;//Q15
p_ipark1->Qs = VqTesting = Q15;
p_ipark1->Sine= p_ipark1->Sine;
p_ipark1->Cosine= p_ipark1->Cosine;
IPARK_Cal(p_ipark1);
p_svgen1->Ualpha = p_ipark1->Alpha/Q15;
p_svgen1->Ubeta = p_ipark1->Beta/Q15;
SVPWM处理结构
SVPWM处理结构
typedef struct {
s32 Ualpha; // Input: reference alpha-axis phase voltage
s32 Ubeta; // Input: reference beta-axis phase voltage
s32 Ta; // Output: reference phase-a switching function
s32 Tb; // Output: reference phase-b switching function
s32 Tc; // Output: reference phase-c switching function
s32 tmp1; // Variable: temp variable
s32 tmp2; // Variable: temp variable
s32 tmp3; // Variable: temp variable
s32 VecSector; // Space vector sector
} SVGEN;
输入alpha beta轴参数,计算三个矢量的作用时间(Ta,Tb,Tc)
void SvTimeCal(SVGEN *v)
{v->tmp1= v->Ubeta;v->tmp2= v->Ubeta/2 + 866*v->Ualpha/1000;v->tmp3= v->tmp2 - v->tmp1;v->VecSector=3;v->VecSector=(v->tmp2> 0)?( v->VecSector-1):v->VecSector;v->VecSector=(v->tmp3> 0)?( v->VecSector-1):v->VecSector;v->VecSector=(v->tmp1< 0)?(7-v->VecSector) :v->VecSector;if(v->VecSector==1 || v->VecSector==4){v->Ta= v->tmp2;v->Tb= v->tmp1-v->tmp3;v->Tc=-v->tmp2;}else if(v->VecSector==2 || v->VecSector==5){v->Ta= v->tmp3+v->tmp2;v->Tb= v->tmp1;v->Tc=-v->tmp1;}else{ v->Ta= v->tmp3;v->Tb=-v->tmp3;v->Tc=-(v->tmp1+v->tmp2);}
}
调用函数产生波形并输出到文件
int main()
{u32 SpeedRef = Q15;u32 TIME = 10000;u32 i=0;s32 VdTesting = 10;s32 VqTesting = 10;file = fopen("01.txt","w");RcInit(p_rap_cntl);RGInit(p_rg1);for (i=0;i<TIME;i++){SvpwmGen(p_svgen1);fprintf(file ,"%d\n",p_svgen1->Ta );}fclose(file);return 0;
}
C语言SVPWM代码与软件测试相关推荐
- R语言统计代码运行耗时实战:计算代码运行时间、使用proc.time函数计算代码运行时间
R语言统计代码运行耗时实战:计算代码运行时间.使用proc.time函数计算代码运行时间 目录
- c语言分手代码大全,C语言代码大全
从今天开始,我将C语言的代码实例从发表在博客上.供技术交流.比较基础,遵循循序渐进的原则,由简单到复杂,为以后的程序员生涯打好基础. 1.编写一个C程序输出以下信息. **************** ...
- aes算法的C语言实现代码,AES加密算法c语言实现代码
AES加密算法c语言实现代码 #include "stdio.h" #include "memory.h" #include "time.h" ...
- WPF第一章(XAML前台标记语言(Chapter02代码讲解))
XAML前台标记语言(Chapter2代码讲解) 很不好意思,工作有点忙,博客停了两天.相对于一门语言的学习,理论知识和实践必不可少,大多数时间我们要用,对于代码也是,一边不行可以看两遍,实在 ...
- C语言初学者代码中的常见错误与瑕疵(9)
题目 字母的个数 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个. 输入:第一行输入一个正整数T(0<T<25) 随后T ...
- 嵌入式编程C语言提高代码效率的14种方法
嵌入式编程C语言提高代码效率的14种方法 1.在可能的情况下使用typedef替代define.当然有时候你无法避免define,但是typedef更好. typedef int* INT_PTR; ...
- C语言工程代码查看神器 SourceInsight
C语言工程代码查看神器 SourceInsight 安装 默认安装即可 链接:https://pan.baidu.com/s/14CD9RK3yXJ7e43Lf3hxe4A 提取码:12lw 安装完毕 ...
- 一些可运行的C语言数据结构代码
网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...
- 第21届国际C语言混乱代码大赛获奖作品
小行踪 2012-10-22 14:10 第21届国际C语言混乱代码大赛(IOCCC)正式发布了获奖源代码.IOCCC要求参赛者写出最有创意且最让人难以理解的C语言代码,大小限制在4 kb以内,因此每 ...
最新文章
- python操作neo4j
- php读取文件内容不全,php读取文件内容的三种方法
- Docker增强Container的安全性
- 健康的身体是一切的保证 - 保护偶的颈椎!
- python画图中文显示_解决Linux系统中python matplotlib画图的中文显示问题
- linux sudo命令错误 is not in the sudoers file
- 全链路监控方案概述与比较
- IDA的函数操作,与导航操作;
- 百练OJ:2760:数字三角形
- R pdf大小_「福昕PDF助手」12个常用的Word快捷键,一看就会,你值得拥有!
- 使用docker在CentOS7上搭建WordPress
- 我学Flash/Flex(2):AS3读取XML文件内容
- OpenCV python Calibration
- GPIO的翻转操作方法
- wdr7660虚拟服务器设置,TL-WDR7660千兆版路由器怎么设置密码?
- ps和php有什么关系,lr和ps有什么区别
- 818打响,家电第一渠道苏宁下一步目标是什么?
- 简单好玩的vue小游戏,网页小游戏
- mysql双一参数_mysql的双1设置
- Vscode markdown 添加、粘贴、导入图片
热门文章
- openGL库的简单配置
- 游戏服务器内三类线程池的划分与使用
- WebViewJavascriptBridge
- MBA-day13数学-年龄问题-应用题
- java框体怎么添加背景图,文本框添加背景图片,文本框背景图片,public class
- Android 系统简单介绍
- 量子计算机游戏,第3章 量子计算机中的游戏
- Ubuntu16.04黑屏问题·搜狗拼音输入法无法显示·重装失败·修改密码失败·caffe安装错误
- 竞赛题-6283. 正整数和负整数的最大计数
- 开发润乾报表过程:因为内容过多分页导致的这条线