无感FOC启动,定位之后需要强拖,使电机运行到一定速度,产生反电动势后,使用观测器得到反向电动势,然后根据反向电动势计算当前转子的角度和速度。
强拖要使能电流闭环,Iqref设定为额定电流。Iq恒定能保证输出力矩恒定,转速会以恒定加速度上升,设定转速上升到500RPM时,强拖结束切速度闭环。
在强拖过程中,电角度以固定加速度增加。扭矩一定的情况下,速度越快,电压越高,因为电流环的作用,电流保持恒定。波形如下图所示。
那么如何计算强拖过程中的电角度呢?参考micorchip AN1078代码,整体思路是这样的:
如果PWM频率为16K,强拖时间设为2S,电机速度达到500RPM时结束强拖,电机极对数为2。确定好这几个参数就可以开始计算电角度了。
if (Startup_Ramp < EndSpeed)
{
Startup_Ramp += DletaRamp;//每个PWM周期,电角度增加DELTA_STARTUP_RAMP
ParkParm.qAngle += (u16)(Startup_Ramp >> 16);//Startup_Ramp扩大了65536倍,所以这里要减小65536倍,
}
EndSpeed表示速度达到500RPM时,每个PWM周期转子增加的电角度。
500RPM,极对数为2,那么1分钟,电机转1000电周期,1S转1000/60电周期,1S有16K个PWM周期,FOC中以65535表示360度电角度。所以
EndSpeed=500*2*65535/(60*16k)=68
假设定位结束时,电角度为0,Startup_Ramp初始值为0,转子电角度ParkParm.qAngle为0。
强拖时间2S有2/(1/16K)=32000个PWM周期,因为转子以恒定加速度增加,那么每个PWM周期转子增加的角度是相等的。这个值就是DletaRamp。
在第32000个PWM周期,转子增加的电角度是68,用68/32000即得到每个PWM周期增加的电角度,因为这个值太小,所以扩大65536倍,程序中使用移位计算减少计算时间。
DletaRamp= EndSpeed*65536/(2*16K)
每个PWM周期Startup_Ramp累加DletaRamp,当Startup_Ramp大于EndSpeed时,就表示电机速度达到了500RPM,强拖结束,准备切入速度闭环。
每个PWM周期,ParkParm.qAngle累加Startup_Ramp就得到了转子当前的电角度,因为DletaRamp扩大了65536倍,Startup_Ramp也扩大了65536倍,所以Startup_Ramp要先右移16位缩小65536倍,再进行累加得到ParkParm.qAngle。ParkParm.qAngle的范围是
-32768-32767。