赞
踩
本文先阐述FOC控制算法的最后一步——SVPWM,即空间矢量脉宽调制。本文将结合理论从代码角度去分析SVPWM算法,逐步解析其如何将输入的目标电压值Uout转化为PWM占空比的。FOC控制库中SVPWM的实现函数是PWMC_SetPhaseVoltage,在源代码文件pwm_curr_fdbk.c中。
网络上有很多关于SVPWM算法原理的讲解,但很少有结合实际代码实现去讲解的,大多数文章跟实际并不相关。本文结合代码,加上一些个人理解,为大家梳理一下SVPWM,让大家能够对算法有更深一步的理解。
如图1所示,UVW三相电压颜色为别为红色、绿色和蓝色,合成的电压矢量为黑色,左图为电压矢量合成示意图,右图为电压的模长随时间ωt变化示意图
uint16_t PWMC_SetPhaseVoltage( PWMC_Handle_t * pHandle, alphabeta_t Valfa_beta )
2*sqrt(3)
,暂时忽略掉入参wUAlpha
和wUBeta
中的PWM周期Ts和电压分量,只把它当作角度来分析,则wUAlpha为:2*sqrt(3)*α
,wUBeta为:-2*β
int32_t wUAlpha = Valfa_beta.alpha * ( int32_t )pHandle->hT_Sqrt3;
int32_t wUBeta = -( Valfa_beta.beta * ( int32_t )( pHandle->PWMperiod ) ) * 2;
#define SQRT3FACTOR (uint16_t) 0xDDB4 /* = (16384 * 1.732051 * 2)*/
int32_t wX = wUBeta;
int32_t wY = ( wUBeta + wUAlpha ) / 2;
int32_t wZ = ( wUBeta - wUAlpha ) / 2;
由此得到:
如图4所示,根据中学学过的线性区域规划的知识,可以得到:红色部分为wX>0的区域,绿色区域为wY>0的区域,蓝色区域为wZ>0的区域,由此可以得到表1的结果。代码中先按照wX,wY和wZ的值进行扇区判断,并计算PWM占空比
扇区号 | wX | wY | wZ |
---|---|---|---|
1 | >0 | >0 | <0 |
2 | XX | >0 | >0 |
3 | >0 | <0 | >0 |
4 | <0 | <0 | <0 |
5 | XX | <0 | <0 |
6 | <0 | >0 | <0 |
比如wY < 0,wZ < 0
即可判断出目标矢量落在扇区5(SECTOR_5)
内
if ( wY < 0 )
{
if ( wZ < 0 )
{
pHandle->Sector = SECTOR_5;
}
}
我们来分析第6扇区的空间矢量合成情况,SVPWM波形是7段式,根据代码可以看出三相占空比大小是A>B>C,即第六扇区7段式为:0-4-5-7-5-4-0。波形如图6所示
FOC库中配置的定时器工作模式是中心对齐模式(定时器CNT计数值增加到等于定时周期时,再递减到0,如此往复循环),如此可以得到如图5的波形。从图中得出结论,T4=Tx
,T5=Ty
,T7=T0=(Ts-Tx-Ty)/2
。状态7和状态0合成的向量为零向量,不对电机做功
如图6,这里我们分析第六扇区的情况,U4为100,代表U相;U5为101,代表U相和W相的合成向量,Tx是U4的通电时间,Ty是U5的通电时间。同样这里我们把Uout正交分解,则有:
根据“空间矢量合成”中的结论二,可以将U4
和U5
替换为2*Udc/3
,将其带入上式,可以得到:
Uout在α轴上的分量为U_out*cos(Θ)
,在β轴上的分量是U_out*sin(Θ)
,这里写成Uα
和Uβ
。Udc/sqrt(3)
为合成的最大不失真电压,原因放到下一节讲,这里的Uα/(Udc/sqrt(3))
为alpha
,Uβ/(Udc/sqrt(3))
为beta
,alpha
和beta
这两个值为SVPWM函数的入参
在“六个扇区划分”开始时,我们知道Uα和Uβ除了角度外还乘了一个PWM周期Ts(pHandle->PWMperiod),结合代码,wUAlpha
多乘了2*sqrt(3)
,wUBeta
多乘了-2
因此可以进一步简化上述式子:
回忆一下代码中wX
,wY
与wZ
三个变量和wUAlpha
和wUBeta
两个变量的关系:
至此,可以计算UVW三相占空比了,因为FOC库定时器模式是中心对齐模式,所以计算占空比时只计算一半就可以了:
FOC库的变量格式是Q15格式,所以计算时要除以32768:
第6扇区计算占空比的代码
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wY - wX ) / ( >int32_t )262144 );
wTimePhC = wTimePhA - wY / 131072;
wTimePhB = wTimePhC + wX / 131072;
至此SVPWM算法的原理与代码便可以联系起来了
如图7所示,外圆的大小为2*Udc/3
,内圆的大小为Udc/sqrt(3)
。根据图5所示,状态0和7合成的电压矢量为0,故当TX=T=Ts/2
时,合成的电压矢量最大,此时合成的电压矢量边界为图7中的正六边形。为了保证合成的电压矢量不会失真,合成的电压矢量不能超过图7中的内圆,此时的电压矢量为Uref=2*Udc/3*sin(π/3)=Udc/sqrt(3)
,这正是在之前推导过程中把sqrt(3)/Udc
这个分量约掉的原因
SVPWM算法分析到这就算完成了,这是FOC库中比较难以理解的一部分,涉及到的计算转换比较多,把原理和代码对应起来属实不容易,耗费了很久时间才整理出来这篇文章。知其然,也要知其所以然,只会用是远远不够的,我们需要进一步挖掘其背后的原理,才能真正的灵活多变的解决产品问题,希望这篇文章能给喜欢研究原理的小伙伴带来帮助
FOC5.4源代码:https://pan.baidu.com/s/1VIDh37emlCNvsngC9-Nhuw?pwd=g6ac
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。