你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
è¿ä¸ªè¡¨æ ¼æ¯æä¹ç®åºæ¥ç
举报
卫博1234 发表于 2016-10-21 19:52 我也不是很懂,大概了解的回答一下。这个表是给RevPark_Circle_Limitation用的。 我把这个函数一点点注释如 ...
狂奔的蜗牛soyoa 发表于 2018-2-8 10:50 这个函数是为了将经过PID调节后的Vd,Vq映射到0-32767 相应的对应PWM占空比为0-100%, 那么就会涉及到合成 ...
我也不是很懂,大概了解的回答一下。这个表是给RevPark_Circle_Limitation用的。
我把这个函数一点点注释如下,我这里用的是MAX_MODULATION_98_PER_CENT,楼主的例子是100%最高调制比的。
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; //
if ( temp > (u32)(( MAX_MODULE * MAX_MODULE) ) ) // 如果(Vd1^2+Vq1^2) > MAX_MODULE^2成立。 //注意 在MAX_MODULATION_99_PER_CENT情况下 ==>
//MAX_MODULE=32111=32768*0.98,这个MAX_MODULE就是这么来的
{
u16 index; //为便于理解,下面的程序注释中都假设Vq1=x*32768, Vd1=y*32768,
//则(Vq1)^2+(Vd1)^2=(x^2+y^2)*32768^2
temp /= (u32)(512*32768); // =(Vq1^2+Vd1^2)/(512*32768) = (x^2+y^2)*32768^2/(512*32768)
//=64(x^2+y^2); 注意32768=512*64
temp -= START_INDEX ; // = 64(x^2+y^2) - 61; ==>
//最大值满足temp_max=128-61=67(实质上是66,
//因为32767才是最大值,到了32768才会是2,所以(x^2+y^2)<2),
//最小值temp_min=MAX_MODULE^2/(512*32768)-61=0,
//所以这埯可以看出来,那个对应98%最高调制比的表格里,只有67个数据
index = circle_limit_table[(u8)temp];
temp = (s16)Stat_Volt_q_d.qV_Component1 * (u16)(index);
//(Vq1)*MMI*S16_Max/V_mag, index = MMI*S16_Max^2/V_magnitude_index
Stat_Volt_q_d.qV_Component1 = (s16)(temp/32768);
//Vq=(Vq1)*MMI*S16_Max/(32768*V_mag)
temp = (s16)Stat_Volt_q_d.qV_Component2 * (u16)(index);
//(Vd1)*MMI*S16_Max/V_mag
Stat_Volt_q_d.qV_Component2 = (s16)(temp/32768);
//Vd=(Vd1)*MMI*S16_Max^2/(32768*V_mag)
}
}
这个函数是为了将经过PID调节后的Vd,Vq映射到0-32767 相应的对应PWM占空比为0-100%, 那么就会涉及到合成矢量取模的运算 即SQRT(Vd² + Vq²),这个运算量比较大,所以用查表的方式。 然而完全不理解是怎么算出合成矢量模长的。
纵观整个FOC算法,参与算法计算的参数中只有Vq,Vd是与实际物理量没有固定倍数关系的,所以必须在这里做归一化,思路是对的,我之前想的直接将Vd Vq映射到母线电压,这样可以直接映射到定时器的CNT值了,一步到位,但是都避不开要做开方运算。
不知道这个函数的原理你现在弄懂了没 跪求分享
楼主,你这个是哪一篇文档,我怎么没有看到?