FOC2.0 RevPark_Circle_Limitation函数分析

2019-12-18 18:46发布


最近开始着手将FOC2.0的库函数从头重写一遍,主要是为了了解FOC的各个技术细节,同时改写2.0库中一些自己不是很理解的函数。目前硬件驱动已全部完成,开始着手写算法部分。现在卡在RevPark_Circle_Limitation() 这个函数上。

纵观整个FOC算法,参与计算的参数中,只有Vd,Vq是进过PID调节得到的值,与实际物理量之间没有固定的倍数关系。所以要对Vd,Vq做归一化处理。然后就可以映射到你想映射的区间中。 这里面就涉及到SQRT(Vd² + Vq²) ,计算量比较大,2.0库中用RevPark_Circle_Limitation()来计算合成矢量模长,并查表,只是这个函数一直没看懂,希望有精通的大神指教一二,感谢!

函数如下:
void RevPark_Circle_Limitation(void)
{
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);  // min value START_INDEX, max value 127
   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);  
   }

}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
20061002838
2019-12-19 04:14
理解清楚为什么要做限制,限制的原理是什么,再看代码会容易很多
假设某一时刻Ud输出0.8,Uq输出0.8,单独计算,两个都没超过1.0,但是矢量和是超过了1.0的,所以需要做限制
具体怎么限制,总不能Ud不变uq减小,或者反过来吧,等比例方式带来的失真最小,所以采用这种方式
ST的代码非常巧妙,复杂的开方和除法运算通过查表的方式实现,效率提高 很多
它是用32768代表1.0的,Q15格式,研究的时候需要注意

一周热门 更多>