双极式控制直流pwm-m可逆调速系统建模与仿真 (1)整流器采用两相桥臂,pwm驱动,spwm (2)采用双闭环控制,转速外环ASR与电流内环ACR均采用pi控制 (3)可逆调速,可实现正反转,直流电机,他励直流电机。 有参考资料
先说核心武器:两相桥臂整流器配SPWM。这货的代码实现比硬件电路更带劲,先看PWM中断服务函数:
void TIM1_UP_IRQHandler(void){ static uint16_t duty = 500; //初始占空比50% static float theta = 0; //相位累加器 //SPWM波形生成 float mod_signal = arm_sin_f32(theta) * 0.9; //90%调制比 uint16_t cmp_val = (uint16_t)(duty * (1 + mod_signal)); TIM1->CCR1 = cmp_val; //更新比较寄存器 TIM1->CCR2 = PWM_PERIOD - cmp_val; theta += 0.0628f; //50Hz基波,1kHz载波时步进量 if(theta > 6.28f) theta -= 6.28f; TIM_ClearITPendingBit(TIM1, TIM_IT_Update); }这段代码的骚操作在于实时计算正弦调制波。用armsinf32这个DSP库函数比查表法更省内存,theta的自增量决定输出频率。注意PWM死区得在硬件层面配置,软件里直接怼互补对称波形就行。
双闭环控制才是重头戏。ASR(转速环)和ACR(电流环)这对CP必须配合默契。上Simulink模型的核心配置:
ASR = pidtune(sys_speed,'PID2'); ASR.OutputLimits = [-100, 100]; //限幅防积分饱和 ACR = pidtune(sys_current,'PI'); ACR.Tf = 0.001; //低通滤波防高频振荡这里有个坑爹细节:转速环带宽得比电流环低一个量级。实测中,把ASR的积分时间调成ACR的5-8倍效果最稳。调参时先怼电流环,响应时间控制在10ms内,再调转速环让超调不超过5%。
双极式控制直流pwm-m可逆调速系统建模与仿真 (1)整流器采用两相桥臂,pwm驱动,spwm (2)采用双闭环控制,转速外环ASR与电流内环ACR均采用pi控制 (3)可逆调速,可实现正反转,直流电机,他励直流电机。 有参考资料
正反转切换要玩得6,得在H桥驱动上做手脚。上示波器实测的PWM时序逻辑:
always@(posedge clk) begin case(direction) 2'b01: //正转 {A_H, A_L} <= {PWM_out, ~PWM_out}; 2'b10: //反转 {A_H, A_L} <= {~PWM_out, PWM_out}; default: //刹车 {A_H, A_L} <= 2'b00; endcase end注意这里必须保证同一桥臂的上下管信号严格互锁,死区时间建议取载波周期的1/20。电机反转时的电流冲击可以通过在ACR中设置双向限幅来抑制,别让电流超过额定值1.5倍。
仿真时遇到最魔幻的bug是电机堵转时转速环发疯。解决办法是在ASR输出后加个陷波器:
def notch_filter(speed_error): global prev_error filtered = 0.9*prev_error + 0.1*speed_error prev_error = filtered return filtered这个一阶低通滤波能把突变的转速误差滤平,相当于给控制环踩了脚刹车。实测下来系统反转时的过渡过程能从2秒缩短到0.8秒,而且没有明显超调。
玩转这套系统后你会发现,电机控制就是个平衡艺术——整流器要足够浪,控制环要足够稳。最后甩个彩蛋:在ACR前级加个负载观测器,系统抗扰动性能直接起飞,具体实现咱们下回分解。