永磁同步电机二阶线性/非线性自抗扰控制器(ADRC)matlab,simulink模型,三阶观测器,参数整定,参考资料和文献。
永磁同步电机控制玩ADRC就像打游戏开挂,关键得把观测器调教明白。三阶观测器是核心中的核心,这玩意儿能把系统内外扰动全给揪出来。先上硬货——Simulink模型里观测器的实现:
function [z1, z2, z3] = LESO(u, y, h, beta) persistent z1_prev z2_prev z3_prev if isempty(z1_prev) z1_prev = 0; z2_prev = 0; z3_prev = 0; end e = z1_prev - y; dz1 = z2_prev - beta(1)*e; dz2 = z3_prev - beta(2)*e + 1.5*u; // 1.5是电机参数相关项 dz3 = -beta(3)*e; z1 = z1_prev + h*dz1; z2 = z2_prev + h*dz2; z3 = z3_prev + h*dz3; z1_prev = z1; z2_prev = z2; z3_prev = z3; end这段线性扩张状态观测器(LESO)代码里beta参数组直接决定观测性能。beta的三个值建议按带宽法配置,比如beta=[3w, 3w², w³],w是观测器带宽。别傻乎乎地直接抄,w的取值得看电机转速范围——玩6000rpm的电机w至少得设到300以上才跟得上。
参数整定有门道,先调观测器再搞控制器。在Simulink里跑实时调参,建议把速度环ADRC的输出限幅设小点,先给±10%额定电流试试。看到波形震荡别慌,把TD环节的时间常数调大0.2秒,立马见效。遇到高频噪声干扰,在ESO后面串个低通滤波器,截止频率设成观测器带宽的1/5倍,代码实现就两行:
[num,den] = tfdata(c2d(tf(1,[0.002 1]),0.001),'v'); filter_out = filter(num, den, eso_output);非线性ADRC比线性的多两个参数——fal函数的α和δ。这俩参数别按论文推荐值硬套,实测发现α取0.5时抗负载扰动效果最佳,δ的取值要和转速采样周期挂钩。比如1kHz控制频率下,δ取0.03秒刚好能避开电流采样噪声。
说到参考资料,韩京清老师2001年那篇《从PID技术到自抗扰控制技术》必读。最新进展可以刷IEEE Trans. on Industrial Electronics上关于PMSM-ADRC的实验对比论文。Simulink建模有个坑要注意:别用默认的ode45求解器,换成Fixed-step的ode4,步长设成50us才能准确捕捉电流环动态。
最后甩个调参口诀:观测带宽要够快,控制增益别太嗨,滤波环节谨慎加,抗扰性能自然来。调完参数记得做突加负载实验,观测器输出要是能1ms内跟上实际扰动,这波就稳了。