
简介磁悬浮球系统的线性自抗扰控制LADRC资源面向自动控制、机电一体化方向的研究者与工程师可用于理解先进控制策略在非线性、欠驱动系统中的抗扰设计与仿真验证。压缩包内共3个文件包含一篇关于磁悬浮球系统线性自抗扰控制与参数整定的PDF论文、一个可运行的Simulink仿真模型.mdl以及一个参数整定脚本.m整体体积约1.79MB结构紧凑便于快速对照学习。已有366人浏览学习该资源适合具备一定现代控制理论基础、希望掌握LADRC实战应用的读者。通过这份资料读者不仅能梳理LADRC的状态观测器与控制律设计思路还能直接打开Simulink模型观察磁悬浮球位置跟踪、干扰补偿等动态特性借助tuning1.m脚本调整参数进一步分析超调量、上升时间等性能指标为后续硬件实现或扩展到其他高精度工业控制场景提供有力参考。1. 磁悬浮球系统线性自抗扰控制把“调不动”的对象变成“看得见”的对象磁悬浮球系统线性自抗扰控制这个题目第一次在实验台上调过的人都会有同感一个看起来只是靠电磁铁吸住小球的装置却能让人在 PID 参数里泡上两三天。球要么被吸死在电磁铁上发出清脆的撞击声要么刚松手就自由落体稳定悬浮的窗口往往只有几个毫米。换用线性自抗扰控制LADRC之后情况才真正好转——不需要精确测量电磁力曲线把非线性磁力、参数偏差、外部扰动全部当作“总扰动”实时估计并抵消。这套组合适合正在做悬浮装置验证、或者想找一个能跑通自抗扰路线的实物载体的人。它解决的不仅是怎么悬浮更是怎么让一个开环不稳定、模型不准的系统变得容易整定。2. 对象先立住磁悬浮球的模型与 LADRC 的三个关键参数2.1 磁悬浮球的非线性模型与那个“天生不稳”的开环极点常见的磁悬浮球结构是电磁铁在顶部球在下方位置传感器测量气隙 x。电磁吸力近似为 F k·(i/(xa))²其中 k 由线圈匝数和铁芯截面决定a 是磁路等效偏移防止 x 趋近 0 时力无穷大。取 x 向下为正球的动力学是 m·x m·g − k·(i/(xa))²。在平衡点 (x₀, i₀) 附近做线性化m·Δx (2·k·i₀²/(m·(x₀a)³))·Δx − (2·k·i₀/(m·(x₀a)²))·Δi。注意第一项系数是正的对应开环特征根有一个在右半平面。这就是为什么球不可能靠开环稳定电磁力随距离增大而减小等效成“负刚度”任何偏离平衡点的扰动都会被放大。这个线性化模型的价值不是用来设计控制器而是用来估算控制通道增益 b₀。按照 x f b₀·u 的形式u 取电流 i则有 b₀ −2·k·i₀/(m·(x₀a)²)。负号是因为电流加大、电磁力加大而 x 向下为正所以 x 减小。很多人第一次在实物上把 b₀ 符号搞反控制器第一拍输出方向就是反的球直接拍在磁铁上。我一般会在接线前先用恒流源手动给一个平衡电流确认“电流增加→球向上运动”的方向再把这个方向写进符号约定里。2.2 线性自抗扰控制把非线性、误差、干扰全装进“总扰动”LADRC 的核心思路是不去精确建模非线性磁力而是把它和模型误差、外部扰动一起定义为总扰动 f然后设计一个扩张状态观测器LESO在线估计 f。对于二阶对象系统被写成x₁ x₂x₂ f b₀·ux₃ f作为扩张状态LESO 的离散形式是一个三阶观测器z₁ z₂ β₁·(y − z₁)z₂ z₃ b₀·u β₂·(y − z₁)z₃ β₃·(y − z₁)这里 z₁ 跟踪位移z₂ 跟踪速度z₃ 跟踪总扰动 f。三个观测器增益用带宽参数化配置β₁3ω₀β₂3ω₀²β₃ω₀³ω₀ 是观测器带宽。控制器输出为 u (u₀ − z₃)/b₀其中 u₀ kp·(r−z₁) − kd·z₂kpωc²kd2ωc。当 z₃ 估计得准原系统就被补偿成近似积分器串联型闭环特性由 ωc 决定。为什么叫“线性”自抗扰因为 LESO 和控制器都是线性时不变结构只有对象是非线性的。相比完整 ADRC 里的非线性函数这种形式在嵌入式平台就是一个三阶递推加一个比例微分不涉及复杂运算。这也是它适合作为磁悬浮球这类快速不稳定对象的落地原因采样周期做到 1ms 甚至更短时计算量依然很轻松。2.3 带宽参数化ωc、ωo、b₀ 怎么配对LADRC 名义上有三个参数实际主要是两个半。b₀ 允许有误差甚至 30% 的偏差都可以被 LESO 当作扰动补偿掉前提是符号不能错。ωc 决定闭环响应快慢ωo 决定扰动估计速度和噪声放大幅度。一组常用的配对经验是 ωo 取 ωc 的 3 到 5 倍再根据传感器噪声情况微调。下表是我在磁悬浮球上整定时的参考参数作用异常表现调整方法b₀控制通道增益符号错则发散偏差大则动态变慢或震荡按模型估算现场用阶跃超调微调ωc闭环带宽太小则响应迟钝太大则抖动从 10 rad/s 开始每次加 5ωo观测器带宽太小则总扰动估计滞后太大则噪声灌入取 ωc 的 3~5 倍噪声大时下调整定顺序不必先固定哪两个再调第三个。我习惯先把 b₀ 按物理参数估算出来然后 ωc 取一个保守值 15 rad/sωo 取 4 倍也就是 60 rad/s跑通闭环后再逐步加压。整个过程没有黑匣子每一步异常都能对上表找到对应关系。3. 仿真先行用 MATLAB 把 LADRC 跑通的最小闭环3.1 被控对象与控制器的离散化代码直接在 MATLAB 脚本里把对象和控制器都写出来方便观察内部状态。下面这段代码对应一个工作点球重 20g、气隙 20mm、线圈常数 k1.5e-4控制器周期 1ms。对象用欧拉法推进连续模型。% 磁悬浮球系统 LADRC 闭环仿真离散控制器 连续对象欧拉推进 clear; clc; close all; %% 物理参数 m 0.02; % 球质量 kg g 9.81; % 重力加速度 kf 1.5e-4; % 电磁力系数 N*m^2/A^2 a 0.010; % 磁路等效偏移 m x0 0.020; % 工作点气隙 m i0 sqrt(m*g*(x0a)^2/kf); % 工作点电流 A disp([工作点电流: , num2str(i0), A]); %% LADRC 参数 b0 -2*kf*i0/(m*(x0a)^2); % 控制通道增益电流-位置二阶导 wc 30; % 控制器带宽 rad/s wo 100; % 观测器带宽 rad/s Ts 1e-3; % 控制周期 s beta1 3*wo; beta2 3*wo^2; beta3 wo^3; kp wc^2; kd 2*wc; %% 状态初始化 x 0.030; % 初始气隙比参考点大 10mm模拟静止释放 v 0.0; % 初始速度 u i0; % 上一拍输出电流 z1 x; z2 v; z3 0; % LESO 初值 N 10/Ts; % 仿真 10 秒 t (0:N-1)*Ts; xLog zeros(1,N); uLog xLog; z3Log xLog; %% 闭环主循环 for k 1:N % 1) 测量当前气隙 y x; % 2) LESO 更新u 用上一拍实际输出到被控对象的电流 e y - z1; z1 z1 Ts*(z2 beta1*e); z2 z2 Ts*(z3 b0*u beta2*e); z3 z3 Ts*(beta3*e); % 3) LADRC 控制律 u0 kp*(x0 - z1) - kd*z2; u (u0 - z3)/b0; u max(0, min(1.5, u)); % 电流限幅 0~1.5A % 4) 被控对象欧拉推进 F kf * (u/(xa))^2; x_ddot g - F/m; v v x_ddot*Ts; x max(0.005, x v*Ts); % 机械限位 xLog(k) x; uLog(k) u; z3Log(k) z3; end %% 绘圖 plot(t, xLog*1000, b); hold on; plot(t, x0*1000*ones(1,N), r--); grid on; xlabel(时间 [s]); ylabel(位置 [mm]); legend(实际位置, 参考位置); title(磁悬浮球 LADRC 闭环响应);这段代码的关键在循环顺序先采样、再更新 LESO、再算控制量、最后推进对象。LESO 里的 u 是上一拍输出到对象的电流不是本拍刚算出来的值。实际系统中控制器输出到执行器需要一拍观测器也必须用同一个信号否则会产生一拍的相位差在 ωo 较高时表现为持续振荡。参数说明b₀ 在工作点附近近似为 −18.1按上述代码给出的物理参数可以自行核算。ωc 先取 30 rad/s 对应上升时间约 0.1sωo 取 100 rad/s 大约是 ωc 的 3.3 倍。如果把 b₀ 乘以 1.3 或 0.7 再运行系统仍然稳定这是 LADRC 容忍模型误差的典型表现。3.2 整定顺序先把观测器调稳再收紧控制带宽不要一上来就同时加 ωc 和 ωo。我推荐的顺序是先把 LESO 单独跑起来断开控制器输出给对象一个固定的平衡电流让 LESO 只工作在观测模式。此时观察 z₁ 是否跟得上实际位移z₃ 是否稳定在某个常值附近。如果 z₁ 明显滞后或者 z₃ 漂移说明 ωo 太小或者初值设错。随后闭合控制ωc 从 10 rad/s 起步每次增加 5 rad/s同时保证 ωo 维持在 ωc 的 4 倍左右。观察球从 30mm 初始位置拉回到 20mm 的阶跃响应。第一次尝试时如果球来回摆动两三次才稳住属于观测器补偿还没完全建立的现象不用急着改参数。等 z₃ 的曲线在扰动事件后回到同一水平线说明总扰动估计已经收敛再继续提升 ωc。这一步最容易踩的坑是看到 z₃ 数值很大就以为观测器坏了。实际上如果 b₀ 有 30% 误差真实扰动里会包含一部分未补偿的模型残差z₃ 的数值会相应变大这是正常的。判断标准不是 z₃ 的绝对大小而是它是否随扰动同步收敛。3.3 从仿真看鲁棒性模型误差下 LADRC 表现如何把代码里 b₀ 改成 b0 -2kfi0/(m*(x0a)^2) * 0.7也就是低估控制增益 30%重新运行。球的稳态位置不会因此偏移只是过渡过程稍微变慢、超调略微增加。原因在于 LESO 会把 b₀ 误差引起的残差一并归入总扰动并在下一拍补偿。这个特性在实物上是宝贵的线圈发热导致电感变化、球质量略微改变、磁路饱和都不需要重新整定参数。更极端一点把球质量在仿真里改成 25g增大 25%但控制器仍用 20g 的 b₀。系统依然能悬浮只是 z₃ 曲线的幅值明显抬升因为它要补偿真实重力与模型重力之间的偏差。这验证了 LADRC 在设计工作点附近有足够的鲁棒区间。实物上我一般建议先做这个仿真实验确认自己的 b₀ 估算偏差在正负 30% 内再上机调试能省掉大量现场时间。4. 从仿真到实物传感器标定、电流内环与 b₀ 的现场辨识4.1 位置传感器与距离反演别拿线性近似跑全场实物上常用的位置传感器是红外反射或激光三角测距输出电压与气隙距离的关系在近距离段明显弯曲。如果直接用出厂线性关系做距离反演工作点处的增益可能偏差 20% 以上这会被 LESO 当作一个缓慢变化的扰动补偿掉但动态响应会变得奇怪。正确的做法是做一次多点标定用已知厚度的垫片把球顶在固定位置记录传感器电压。% 传感器标定5点法拟合 距离-电压 的二次多项式 % 示例数据实际测量时球要放在已知厚度的垫片上 d [5 10 15 20 25]*1e-3; % 已知气隙 m V [3.12 2.41 1.98 1.56 1.23]; % 传感器电压 V p polyfit(V, d, 2); % 二次多项式拟合 d_est polyval(p, V); plot(V, d*1e3, o, V, d_est*1e3, -); grid on; xlabel(电压 [V]); ylabel(距离 [mm]);用二次多项式而不是线性拟合的原因在于近距离段传感器趋于饱和线性近似会在工作点附近产生明显的斜率误差。标定完成后把多项式系数烧进控制器之后每次采样电压直接换算成位移。这个步骤是实物和仿真最大的分水岭仿真里 y 就是真实 x实物里 y 是标定出来的估计值标定误差会直接影响 z₁ 的精度。4.2 电流内环与执行周期LADRC 带宽要低于电流环实物上不能直接用位置控制器输出一个“电流值”就完事电磁铁线圈有电感电流响应需要时间。常见做法是加一个电流内环PWM 斩波驱动采样电阻测电流用 PI 把实际电流快速跟踪电流指令。电流环带宽一般做到 2kHz 以上位置环LADRC的采样频率可以取 500Hz 到 1kHz。一个重要的经验位置环的 ωc 不要超过电流环带宽的 1/5。比如电流环带宽 2kHz换算成角频率约 12500 rad/sωc 可以取到 100~200 rad/s 之间但再高就会把电流环的相位滞后引入位置环LESO 看到的总扰动包含执行器动态补偿效果迅速变差。PWM 频率如果取 20kHz建议把位置采样点放在 PWM 周期中点避开开关噪声最剧烈的时间窗口这样位置信号的毛刺会小很多。4.3 b₀ 的现场辨识不必追求精确模型估算的 b₀ 在实物上往往要修正因为线圈电感、铁芯磁滞、球体材料都会影响等效增益。我不推荐花时间做精确系统辨识常见做法是在闭环已经稳定的基础上做小范围扫参保持 ωc 和 ωo 不变把 b₀ 分别乘以 0.8、1.0、1.2记录阶跃响应的超调量。超调最小、调节时间最短的一组就是最合适的值。还有一种更快的粗估方法在球稳定悬浮时手动把电流指令叠加一个 0.5Hz、幅值 0.05A 的小正弦记录位置响应同频分量的幅值比。这个低频增益再结合当前的 ωc 做反推得到的 b₀ 足够作为初值。整个过程用示波器就能完成不需要额外软件。现场辨识的意义不是让 b₀ 更准而是确认符号和量级没跑偏剩下的事 LADRC 自己会处理。4.4 限幅与积分饱和LESO 的状态会不会被带飞电流限幅是实物上绕不开的问题。电磁铁只能单向吸电流范围通常是 0 到某个最大值。当控制器输出被限幅时对象实际执行的控制量与控制器计算的理想值不一致如果观测器仍按理想值更新z₃ 会持续积分产生“虚假扰动”。处理办法是让观测器使用限幅后的控制量也就是把执行器模型放进回路。u_cmd (u0 - z3)/b0; u_plant max(0, min(Imax, u_cmd)); % 对象实际执行的电流 % LESO 更新时必须使用 u_plant而不是 u_cmd此外给 z₃ 本身加一个合理的限幅也很有必要。传感器在球超出量程时会输出饱和电压换算出的位移是假的这时候 z₃ 会看到巨大的误差信号并一路积分。给 z₃ 设一个物理上合理的上限比如按最大扰动对应的加速度换算能防止异常工况下观测器状态飞出。等球重新回到量程内观测器在几个周期内就能拉回来。5. 磁悬浮球 LADRC 调试避坑5 个高频现象的排查记录5.1 现象一上电球直接吸死在电磁铁上或者直接掉下去原因b₀ 符号反了或者 LESO 初值与实际状态偏差过大。符号反时控制器第一拍输出方向反了正反馈把球推出稳定区。解决先用恒流源给线圈一个平衡电流手动移动到平衡点附近确认“电流增大→球向上”的方向。然后检查代码里 b₀ 的符号约定是否与位移方向定义一致。再检查 LESO 的 z₁ 初值是否设为当前实际位移z₂ 是否为 0。如果 z₁ 初值差很远观测器需要一段时间收敛这段时间内控制律基于错误的 z₁ 输出很容易把球打飞。我一般会在闭环前先让 LESO 跑 100ms 再切入控制。5.2 现象球悬浮后持续高频抖动能听到嗡嗡声原因ωo 太高传感器的高频噪声被观测器放大并送入控制量。位置信号每经过一次观测器相当于在噪声基础上再做一次微分放大ωo 越高放大越严重。解决先看位置传感器的原始波形记录噪声峰峰值。把 ωo 降到 ωc 的 3 倍以内试一次抖动通常会明显减弱。如果还想保留高 ωo则需要在采样后加一阶低通滤波器截止频率至少 10 倍 ωc 以上避免滤波器相位滞后吃掉相位裕度。注意滤波器要加在进入 LESO 之前滤波后的延时会被 LESO 当作扰动的一部分但延时过大会影响稳定。5.3 现象球浮住了但稳态位置偏离参考点一到两毫米原因传感器标定零漂或者 b₀ 偏差太大导致总扰动补偿不全。LADRC 理论上能消除常值扰动但前提是 z₃ 能准确收敛到真扰动如果 b₀ 偏差过大补偿力度就不够剩余误差表现为稳态偏移。解决先校准传感器零点用垫片实测 0mm 和 20mm 两点。如果传感器没错就按 4.3 的方法重新扫 b₀。一个快速判断方法把位置参考降低 2mm看稳态偏移是否随参考量变化。如果不变化说明是传感器零点问题如果跟着变说明是 b₀ 或观测器增益问题。5.4 现象仿真里稳定的参数实物一加扰动就摔球原因仿真里没有建模执行器限幅和传感器量程限制。实物上电流到限幅后控制量被截断观测器还在按理想值工作总扰动估计在一段时间内失真恢复后球已经飞出去。解决把 4.4 里的 u_plant 反馈写进 LESO 更新并给 z₃ 加限幅。再看位置传感器量程如果球摆出量程位置反馈变假再好的控制器也没用需要加机械限位或扩大传感器量程。实物调试时我习惯先在小扰动下验证扰动幅度逐步加大每级都观察 z₃ 是否在扰动结束后回到原值。5.5 现象z₃ 数值很大控制量频繁打饱和原因b₀ 估算值偏小很多或者存在未建模的强非线性比如球体进入磁路饱和区。LESO 会把模型误差全部归入总扰动z₃ 就需要用很大的数值去补偿。解决检查工作点是否选在电磁力曲线的线性区电流是否接近饱和。把 b₀ 往大调试试一般能看到 z₃ 幅值显著下降。另一种情况是机械安装问题——球不在磁路中心侧向力导致等效增益和模型差很多这时需要先调整机械对中而不是调参数。6. 最后一步让球沿正弦轨迹走以及验证 LADRC 的三组实验6.1 从镇定到跟踪给 LADRC 接一条参考轨迹镇定到跟踪控制律只需要改一行。镇定时的参考是常量所以 u₀ kp·(r−z₁) − kd·z₂跟踪时参考在变化需要把参考速度项补上变成 u₀ kp·(r−z₁) kd·(r−z₂)。注意符号变化原来是减去 z₂现在是加上参考速度减去 z₂差别就在这一个符号上很多人在这里翻车。% 正弦参考轨迹r 与一阶导数 dr 解析给出不需要微分器 r x0 0.002*sin(2*pi*0.5*t); dr 0.002*2*pi*0.5*cos(2*pi*0.5*t); % 控制律 u0 kp*(r(k) - z1) kd*(dr(k) - z2); u (u0 - z3)/b0;参考轨迹为什么要解析给出因为对测量信号做数值微分噪声太大而对参考信号做解析微分是精确的。如果参考轨迹来自上位机不是解析式就先通过一个二阶低通或跟踪微分器生成平滑的参考及其导数再送入控制律。6.2 三组实验确认参数边界跟踪调试完成后做三组实验验证参数边界实验输入关注指标合格线阶跃位置参考从 20mm 跳到 22mm超调量、调节时间超调 5%调节时间 0.5s正弦跟踪0.5Hz、幅值 2mm 的正弦参考幅值衰减、相位滞后幅值衰减 10%相位滞后 20°抗扰球上放 10g 砝码或气流吹扰最大偏移、恢复时间最大偏移 2mm恢复 1s阶跃实验对应 ωc 的合理性正弦实验衡量闭环带宽是否够用抗扰实验则验证总扰动估计是否真的起作用。三组实验做完这套磁悬浮球 LADRC 方案就算真正落地。我之前在实物上吃过亏总想靠压 ωo 把扰动压下去结果位置噪声被观测器放大球抖得像筛糠。后来养成的习惯是先量传感器噪声地板再回头定 ωo。这算是这台装置教给我最值钱的一件事。希望帮到你。本文还有配套的精品资源点击获取