1、限制圆的缩小比例算法
由ST的FOC控制系统框图可知,Vd,Vq是由两个PID调节器单独计算的,为了使Vd,Vq合成的电压矢量小于等于单位圆 (
即
V
d
2
+
V
q
2
≤
s
16
(
32767
)
即\sqrt{V_{d}^{2}+V_{q}^{2}} \leq s16 (32767)
即Vd2+Vq2≤s16(32767)) 防止出现矢量电压过调制,ST给出了具有物理意义很明确的计算方法,就是把矢量按比例拉回来,如下图:
这里需要说明下,图中的
V
d
∗
V_{d}^{*}
Vd∗
V
q
∗
V_{q}^{*}
Vq∗指的是由两个PID输出的,Vd,Vq 就是把矢量按比例拉回来的。这里为什么不是拉到单位矢量圆r1上呢,因为由于电调的开关噪声,需要的PWM死区时间,当然还有控制的PWM载波频率对AD采样时间的影响,使得PWM得最大占空比不能达到100%,最大调制比不能达到1。所以MMI 要小于1。所以就要拉回来到r2上。 那么怎么拉回来呢?
void RevPark_Circle_Limitation(Volt_Components Stat_Volt_q_d)
{
s32 temp;
temp = Stat_Volt_q_d.qV_Component1 * Stat_Volt_q_d.qV_Component1
+ Stat_Volt_q_d.qV_Component2 * Stat_Volt_q_d.qV_Component2; // min value 0, max value 2*32767*32767
if( temp > (u32)(( MAX_MODULE * MAX_MODULE) ) ) // (Vd^2+Vq^2) > MAX_MODULE^2
{
u16 index;
temp /= (u32)(512*32768);
temp -= START_INDEX ; // min value 0, max value 127 - START_INDEX
index = circle_limit_table[(u8)temp];
temp = (s16)Stat_Volt_q_d.qV_Component1 * (u16)(index);
Stat_Volt_q_d.qV_Component1 = (s16)(temp/32768);
temp = (s16)Stat_Volt_q_d.qV_Component2 * (u16)(index);
Stat_Volt_q_d.qV_Component2 = (s16)(temp/32768);
}
}
2、算法中的circle_limit_table的制作和 START_INDEX确定
2.1、START_INDEX的确定
由电调开关噪声,需要的PWM死区时间,和PWM的载波频率等因素影响而又要保证AD的采用时间,可以确定一个最大的调制比,这里假设为98%,在程序中有宏定义则:
#ifdef MAX_MODULATION_98_PER_CENT
#define MAX_MODULE 32111
#endif
MAX_MODULE = 0.98 * 32767=32111,这样程序中的 MAX_MODULE 就确定了。即确定了上式中的MMI*S16_MAX。我们现在取 temp > (u32)( MAX_MODULE * MAX_MODULE)成立时temp的最小值,即temp=32111 * 32111,则 START_INDEX= 32111 * 32111/(512 * 32768)=61;
2.2、circle_limit_table的制作
我们现在取 temp > (u32)( MAX_MODULE * MAX_MODULE)成立时temp的最大值,
即 temp=32767 * 32767 * 2,则 START_INDEX= 32767 * 32767 * 2/(512*32768)=;127;
所以表格的大小为 128-61=67;这样就把 32111 * 32111 到 32767 * 32767 * 2 之间的数分成了
67份,每份 = (32767 * 32767 * 2 - 32111 * 32111 )/ 67 。那么表中的第一个元素怎么计算呢?
第一个元素 = sqrt(32111 * 32111 / (32111 * 32111 + 每份) ) * 32767;第二个元素 = sqrt(32111 * 32111 / (32111 * 32111 + 2 * 每份) ) * 32767 ; 以此类推类推就可以得到 circle_limit_table 表了。
这用excel表计算就比较快了。等下把表格上传下。
结语:通过上面制作出来的表格,可能和ST官方的有出入,如果发现上面的理解有问题的话,还请不吝指正。