在电机控制中矢量输出主要由三部分构成,一是速度控制块;二是角度控制块,三是矢量计算输出。

速度控制结构

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代码与软件测试相关推荐

  1. R语言统计代码运行耗时实战:计算代码运行时间、使用proc.time函数计算代码运行时间

    R语言统计代码运行耗时实战:计算代码运行时间.使用proc.time函数计算代码运行时间 目录

  2. c语言分手代码大全,C语言代码大全

    从今天开始,我将C语言的代码实例从发表在博客上.供技术交流.比较基础,遵循循序渐进的原则,由简单到复杂,为以后的程序员生涯打好基础. 1.编写一个C程序输出以下信息. **************** ...

  3. aes算法的C语言实现代码,AES加密算法c语言实现代码

    AES加密算法c语言实现代码 #include "stdio.h" #include "memory.h" #include "time.h" ...

  4. WPF第一章(XAML前台标记语言(Chapter02代码讲解))

    XAML前台标记语言(Chapter2代码讲解)     很不好意思,工作有点忙,博客停了两天.相对于一门语言的学习,理论知识和实践必不可少,大多数时间我们要用,对于代码也是,一边不行可以看两遍,实在 ...

  5. C语言初学者代码中的常见错误与瑕疵(9)

    题目 字母的个数 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个. 输入:第一行输入一个正整数T(0<T<25) 随后T ...

  6. 嵌入式编程C语言提高代码效率的14种方法

    嵌入式编程C语言提高代码效率的14种方法 1.在可能的情况下使用typedef替代define.当然有时候你无法避免define,但是typedef更好. typedef int* INT_PTR; ...

  7. C语言工程代码查看神器 SourceInsight

    C语言工程代码查看神器 SourceInsight 安装 默认安装即可 链接:https://pan.baidu.com/s/14CD9RK3yXJ7e43Lf3hxe4A 提取码:12lw 安装完毕 ...

  8. 一些可运行的C语言数据结构代码

    网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h>#de ...

  9. 第21届国际C语言混乱代码大赛获奖作品

    小行踪 2012-10-22 14:10 第21届国际C语言混乱代码大赛(IOCCC)正式发布了获奖源代码.IOCCC要求参赛者写出最有创意且最让人难以理解的C语言代码,大小限制在4 kb以内,因此每 ...

最新文章

  1. python操作neo4j
  2. php读取文件内容不全,php读取文件内容的三种方法
  3. Docker增强Container的安全性
  4. 健康的身体是一切的保证 - 保护偶的颈椎!
  5. python画图中文显示_解决Linux系统中python matplotlib画图的中文显示问题
  6. linux sudo命令错误 is not in the sudoers file
  7. 全链路监控方案概述与比较
  8. IDA的函数操作,与导航操作;
  9. 百练OJ:2760:数字三角形
  10. R pdf大小_「福昕PDF助手」12个常用的Word快捷键,一看就会,你值得拥有!
  11. 使用docker在CentOS7上搭建WordPress
  12. 我学Flash/Flex(2):AS3读取XML文件内容
  13. OpenCV python Calibration
  14. GPIO的翻转操作方法
  15. wdr7660虚拟服务器设置,TL-WDR7660千兆版路由器怎么设置密码?
  16. ps和php有什么关系,lr和ps有什么区别
  17. 818打响,家电第一渠道苏宁下一步目标是什么?
  18. 简单好玩的vue小游戏,网页小游戏
  19. mysql双一参数_mysql的双1设置
  20. Vscode markdown 添加、粘贴、导入图片

热门文章

  1. openGL库的简单配置
  2. 游戏服务器内三类线程池的划分与使用
  3. WebViewJavascriptBridge
  4. MBA-day13数学-年龄问题-应用题
  5. java框体怎么添加背景图,文本框添加背景图片,文本框背景图片,public class
  6. Android 系统简单介绍
  7. 量子计算机游戏,第3章 量子计算机中的游戏
  8. Ubuntu16.04黑屏问题·搜狗拼音输入法无法显示·重装失败·修改密码失败·caffe安装错误
  9. 竞赛题-6283. 正整数和负整数的最大计数
  10. 开发润乾报表过程:因为内容过多分页导致的这条线