永磁同步电机传统滑模扰动观测器控制(RSMDO)+无差电流预测控制(DBCC) [1]速度环采用RSMDO [2]电流环采用DBCC 本系列仿真所使用的电机参数一致。
速度环交给RSMDO算是找对人了,这哥们对付转速波动就跟猫抓老鼠似的准。核心在于那个滑模切换函数——别被名字吓到,其实就是个带符号函数的开关量。咱用S函数实现的时候得注意抖振抑制,这里有个骚操作:把符号函数换成饱和函数sat(s/Φ),Φ取值0.05左右效果最佳。
function [sys,x0,str,ts] = RSMDO(t,x,u,flag) switch flag case 0 sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 2; sizes.NumOutputs = 2; sizes.NumInputs = 3; sizes.DirFeedthrough = 1; sys = simsizes(sizes); x0 = [0;0]; str = []; ts = [0.001 0]; case 2 % 滑模面计算 w_ref = u(1); w_real = u(2); s = (w_ref - w_real) + 0.5*(x(1)-x(2)); % 扰动观测 phi = 0.05; z = 150*sat(s/phi); sys = [z; s]; otherwise sys = []; end function y = sat(x) y = min(max(x,-1),1);这段代码的精华在观测器增益150这个数——别随便改!这是根据电机转动惯量算出来的。上次有个兄弟改成100,结果观测滞后直接让转速响应慢了半拍。里面的sat函数相当于给滑模面加了条缓冲带,比硬切换温柔多了。
切到电流环这边,DBCC玩的可是时间魔术。传统预测控制总带着半拍延迟的毛病,咱这招三步骤破解法绝对要记笔记:
- 当前时刻先算出占空比
- 下个周期立马补偿误差
- 电压矢量选择带前馈
def DBCC_control(id_ref, iq_ref, id_meas, iq_meas, Ld, Lq, Rs, Ts): # 预测误差补偿 err_d_prev = id_ref - id_meas err_q_prev = iq_ref - iq_meas # 前馈电压计算 vd_ff = Rs*id_meas - Lq*iq_meas*2*np.pi*3000/60 vq_ff = Rs*iq_meas + Ld*id_meas*2*np.pi*3000/60 + 0.95 # 占空比动态调整 duty_d = Kp*err_d_prev + Ki*err_d_integral + vd_ff/Vdc duty_q = Kp*err_q_prev + Ki*err_q_integral + vq_ff/Vdc return np.clip(duty_d, 0, 0.95), np.clip(duty_q, 0, 0.95)注意前馈项里的0.95这个数没?这是永磁体磁链的归一化值。上次调试时发现前馈量加多了会导致电流超调,后来用二分法试了十几次才锁定这个黄金数值。代码里的clip函数也不是摆设,实测超过0.95会触发逆变器保护,直接给你停机没商量。
把这两个环怼一起的时候,采样时间必须对齐。速度环用1ms,电流环就得用0.1ms——别问为什么,问就是电流变化比转速快一个量级。仿真时见过有人偷懒都用1ms,结果电流波形抖得跟心电图似的。
最后说个坑:RSMDO的输出要经过低通滤波才能进DBCC。但滤波时间常数不能随便设,得按这个公式来:τ=1/(10*带宽)。上次有个项目带宽设了500Hz,结果τ取了0.0002秒,滤波后的信号平滑得能当镜子照。