当前位置:   article > 正文

ST-FOC2.0库中的 circle limitation

circle limitation
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 s1632767) 防止出现矢量电压过调制,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);  
   }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在这里插入图片描述

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
  • 1
  • 2
  • 3

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官方的有出入,如果发现上面的理解有问题的话,还请不吝指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/247961
推荐阅读
相关标签
  

闽ICP备14008679号