matlab/simulink二阶线性自抗扰控制器(LADRC)仿真模型,已经封装完成,响应速度快,抗扰能力相较于传统pi更优秀。 采用线性ADRC相较于非线性ADRC大大减少了调参难度,已成功用于电机速度环替代传统pi。
最近在搞电机控制的朋友应该都遇到过这个难题——传统PI调节器在速度环上遇到负载突变就跟喝高了似的,响应慢还容易振荡。上个月我把实验室那台直流电机的PI换成二阶线性自抗扰(LADRC),效果立竿见影。
先看这个Simulink模型结构(贴模型截图怕被说营销,直接说关键部分吧)。核心就三个模块:跟踪微分器TD、线性扩张状态观测器LESO、误差反馈控制律。重点说下观测器部分:
function [z1, z2, z3] = LESO(u, y, h, beta1, beta2) % h:采样时间 beta:观测器带宽参数 persistent z_old if isempty(z_old) z_old = [0;0;0]; end e = z_old(1) - y; z_old = z_old + h*[z_old(2) - beta1*e; z_old(3) - beta2*e + u; -beta3*e]; z1 = z_old(1); z2 = z_old(2); z3 = z_old(3);这个观测器牛在能实时估算出系统总扰动(包括模型误差和外部干扰),代码里z3就是专门吃干扰的。相比非线性ADRC需要调5个参数,线性版只要调两个带宽参数,新手友好度直接拉满。
matlab/simulink二阶线性自抗扰控制器(LADRC)仿真模型,已经封装完成,响应速度快,抗扰能力相较于传统pi更优秀。 采用线性ADRC相较于非线性ADRC大大减少了调参难度,已成功用于电机速度环替代传统pi。
实际调试时发现个骚操作:先把观测器带宽ωo设为控制器带宽ωc的3-5倍,然后微调就行。比如电机模型里我设ωc=50,ωo=200,效果比之前调了三天三夜的PI参数强多了。抗扰测试时突然给电机轴加载,速度回落不到2%就立刻恢复,传统PI这时候早就超调10%以上了。
看个对比波形更直观(想象这里有两个响应曲线图)。传统PI的上升时间大概0.15秒,LADRC直接干到0.08秒,关键是波形平滑得跟德芙似的。最惊喜的是参数鲁棒性——同一组参数换到功率差30%的电机上居然还能用,这要是放在以前PI时代,早被老板骂摸鱼了。
现在这套模型已经封装成Simulink模块(带mask的那种),双击直接输带宽参数就行。要代码的兄弟注意观测器离散化方法,用欧拉法会出幺蛾子,建议改成龙格库塔法。下次试试在三相异步电机上移植,搞成了再来分享。