本文主要是介绍【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程
文章目录
- 前言
- 一、simplefoc——通过角度找扇区
- 1.通过角度找扇区理论
- 1.通过角度找扇区
- 2.矢量作用时间计算
- 3.矢量切换时间计算——七段式
- 2.simplefoc代码
- 3.解读simplefoc代码
- 1.通过角度找扇区
- 2.矢量作用时间计算
- 二、TI——通过Uα、Uβ找扇区
- 1.通过Uα、Uβ找扇区理论
- 2.TI代码
- 3.解读TI代码
- 1.ABC赋值
- 2.找扇区
- 3.矢量作用时间计算
- 4.矢量切换时间计算——七段式
- 三、参考文章
- 总结
前言
【电机控制】直流有刷电机、无刷电机汇总——持续更新
使用工具:
1.得力万用表
提示:以下是本篇文章正文内容,下面案例可供参考
一、simplefoc——通过角度找扇区
1.通过角度找扇区理论
1.通过角度找扇区
2.矢量作用时间计算
Udc表示电源电压(在代码中是voltage_limit),Uref表示设置的力矩大小(在代码中是target_voltage),Ts表示PWM周期(代码中没有把Ts体现出来,代码中的T1、T2是周期的百分比)。
3.矢量切换时间计算——七段式
与下列TI计算的七段式相同,不同的是TI做了优化处理
2.simplefoc代码
sector = (angle_el / _PI_3) + 1;T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) * Uout;T2 = _SQRT3*_sin(angle_el - (sector-1.0)*_PI_3) * Uout;T0 = 1 - T1 - T2;// calculate the duty cycles(times)switch(sector){case 1:Ta = T1 + T2 + T0/2;Tb = T2 + T0/2;Tc = T0/2;break;case 2:Ta = T1 + T0/2;Tb = T1 + T2 + T0/2;Tc = T0/2;break;case 3:Ta = T0/2;Tb = T1 + T2 + T0/2;Tc = T2 + T0/2;break;case 4:Ta = T0/2;Tb = T1+ T0/2;Tc = T1 + T2 + T0/2;break;case 5:Ta = T2 + T0/2;Tb = T0/2;Tc = T1 + T2 + T0/2;break;case 6:Ta = T1 + T2 + T0/2;Tb = T0/2;Tc = T1 + T0/2;break;default: // possible error stateTa = 0;Tb = 0;Tc = 0;}TIM_SetCompare1(TIM2,Ta*PWM_Period);TIM_SetCompare2(TIM2,Tb*PWM_Period);TIM_SetCompare3(TIM2,Tc*PWM_Period);
3.解读simplefoc代码
1.通过角度找扇区
sector = (angle_el / _PI_3) + 1;
2.矢量作用时间计算
T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) * Uout;T2 = _SQRT3*_sin(angle_el - (sector-1.0)*_PI_3) * Uout;T0 = 1 - T1 - T2;switch(sector){case 1:Ta = T1 + T2 + T0/2;Tb = T2 + T0/2;Tc = T0/2;break;case 2:Ta = T1 + T0/2;Tb = T1 + T2 + T0/2;Tc = T0/2;break;case 3:Ta = T0/2;Tb = T1 + T2 + T0/2;Tc = T2 + T0/2;break;case 4:Ta = T0/2;Tb = T1+ T0/2;Tc = T1 + T2 + T0/2;break;case 5:Ta = T2 + T0/2;Tb = T0/2;Tc = T1 + T2 + T0/2;break;case 6:Ta = T1 + T2 + T0/2;Tb = T0/2;Tc = T1 + T0/2;break;default: // possible error stateTa = 0;Tb = 0;Tc = 0;}
二、TI——通过Uα、Uβ找扇区
1.通过Uα、Uβ找扇区理论
若A、B、C、任意一个不等式大于0,则为1,反之则为0
2.TI代码
void SVPWM_Gen(SVGEN *v)
{v->tmp1= v->Ubeta; v->tmp2= _IQdiv2(v->Ubeta) + _IQmpy(_IQ(0.866),v->Ualpha); 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 if(v->VecSector==3 || v->VecSector==6) { v->Ta= v->tmp3; v->Tb=-v->tmp3; v->Tc=-(v->tmp1+v->tmp2); } else{v->Ta=0;v->Tb=0;v->Tc=0;}
}
3.解读TI代码
1.ABC赋值
v->tmp1= v->Ubeta; v->tmp2= _IQdiv2(v->Ubeta) + _IQmpy(_IQ(0.866),v->Ualpha); v->tmp3= v->tmp2 - v->tmp1;
这里TI开始进行优化,将传统的ABC稍作修改,
其中,A不变,为Uβ;
B为二分之根号三Uα+二分之一Uβ;
C为二分之根号三Uα-二分之一Uβ
2.找扇区
找扇区的方式也与传统的N=4C+2B+A
不一样
先将其赋值为3再做判断
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;
若A<0,则7-N,反之不变
若B>0,则N-1,反之不变
若C>0,则N-1,反之不变
3.矢量作用时间计算
这里也与传统的计算不同,舍弃掉了根号三*Ts/Udc
我们只看第一扇区与第四扇区,将画圈部分舍弃
4.矢量切换时间计算——七段式
将剩余部分的Tx与Ty代入到下列公式,下列公式也需要将Ts去掉,除以4去掉,再取反
例如:
第一扇区
Sa=Tx+Ty=根号三/2Uα+1/2Uβ=B
Sb=-Tx+Ty=3/2Uβ-根号三/2Uα=A-B
Sc=-Tx-Ty=-B
第四扇区
Sa=-Tx-Ty=根号三/2Uα+1/2Uβ=B
Sb=-Tx-Ty=3/2Uβ-根号三/2Uα=A-B
Sc=Tx+Ty=-B
此时,我们会发现,第一扇区与第四扇区的矢量作用时间的计算是一样的,也就是说,TI工程师是将ABC处赋值做了处理,对算法进行了优化。
我在这里举例第一扇区与第四扇区,同理可得第二扇区与第五扇区,第三扇区与第六扇区。
if(v->VecSector==1 || v->VecSector==4) { v->Ta= v->tmp2; v->Tb= v->tmp1-v->tmp3; v->Tc=-v->tmp2; }
三、参考文章
SVPWM分析、各个扇区详细计算以及Matlab仿真
FOC - SVPWM扇区判断
如何在TI官网上寻找DSP的例程
[问答] F28335电机矢量控制例程,svpwm生成中的一个问题如何解答
基于TMS320F28335的五段式和七段式SVPWM实现方法
总结
本文仅仅简单介绍了【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程,评论区欢迎讨论。
这篇关于【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!