本帖最后由 liangzhou1988 于 2024-6-30 00:06 编辑
1 Simple FOC控制原理 核心其实就是SVPWM调制,由三相功率逆变器的六个功率开关元件组成的特定开关模式产生的脉宽调制波,能够使电机电流波形尽可能接近于理想的正弦波形。
SVPWM子程序(为了让代码看起来更简洁,所以程序中没有约束条件,参数设置一定要按要求范围输入): void setPhaseVoltage(float Uq, float Ud,float angle_el) {
intsector = (angle_el / _PI_3) + 1; //find the sector we are in currently float T1 = _SQRT3*_sin(sector*_PI_3 - angle_el) *Uq/driver.voltage_limit; float T2 = _SQRT3*_sin(angle_el - (sector-1)*_PI_3) *Uq/driver.voltage_limit; float T0 = 1 - T1 - T2;
float Ta,Tb,Tc; switch(sector){ case 1: Ta = T1 + T2 + T0/2; Tb = T2 + T0/2; Tc = T0/2; break; case 2: Ta = T1 + T0/2; Tb = T1 + T2 + T0/2; Tc = T0/2; break; case 3: Ta = T0/2; Tb = T1 + T2 + T0/2; Tc = T2 + T0/2; break; case 4: Ta = T0/2; Tb = T1+ T0/2; Tc = T1 + T2 + T0/2; break; case 5: Ta = T2 + T0/2; Tb = T0/2; Tc = T1 + T2 + T0/2; break; case 6: Ta = T1 + T2 + T0/2; Tb = T0/2; Tc = T1 + T0/2; break; default: // possible error state Ta = 0; Tb = 0; Tc = 0; } //calculate the phase voltages and center float Ua = Ta*driver.voltage_limit; float Ub = Tb*driver.voltage_limit; float Uc = Tc*driver.voltage_limit;
driver.setPwm(Ua,Ub,Uc); }
2 调试方法
1、开环控制,只能使用电压模式,电流模式需要采样电流,那就是闭环了, 2、一般设置Ud=0,所以只需设置Uq。在SimpleFOC中voltage_limit最终赋值Uq, 3、Uq设置太大,电机发热严重,Uq设置太小,电机没劲转不动或者转不快,所以一定要根据电机相电阻设置大小, 4、θ不是当前的角度,是目标角度,就是下次计算时的角度。
3 移植完成工程截图
4 参考意义: A 软件意义:HC32F460 FOC电机基础驱动参考(主频,GPIO, TMR4触发ADC,PWM,SVPWM,PARK逆变换); B 硬件意义:可用于验证基础硬件的好坏,选择合适的目标转速和Uq,可以让电机实现较小电流的慢速旋转,则基础硬件正常,否则需要排查驱动电路的故障。
5硬件参考详见附件;欢迎讨论。软件附件超过10M,传不上去,详询18688968198;
|