三阶ADRC在永磁同步电机位置伺服中的建模与仿真 这两年做永磁同步电机伺服控制我越来越觉得选型才是最大的技术活。前阵子我在一个高性能位置伺服项目里需要把定位精度和抗负载突变能力同时往上提一档项目组里有人推荐模型预测控制有人坚持滑模控制也有人提了自抗扰。我把这三种方案分别搭了仿真模型跑了一圈对比最后留下来的是三阶自抗扰控制ADRC位置环和速度环都跑在这套控制律上实测效果确实好。这篇东西把我从选型、建模、调参到落地的完整过程写出来重点讲清楚三阶ADRC仿真模型是怎么搭的、参数怎么整、效果具体好在哪里也把MPC和SMC的优缺点一并说一下给正在做同样选型的朋友一个参考。1. 三个控制方案摆在面前我为什么最后选了自抗扰伺服控制的本质问题就两个跟踪要快、干扰要扛得住。PMSM本身是一个强耦合、多变量、参数随温度变化的非线性对象无论用哪种控制策略都得先回答模型精度不够这个问题。1.1 模型预测控制前景很好但伺服实时性这关不好过模型预测控制的思想很直接用被控对象的数学模型预测未来一小段窗口内系统的输出然后在每个控制周期求解一个带约束的优化问题把第一个控制量输出出去下一周期再滚动一次。理论上它能做约束优化能把电流、转矩、电压限制全部写进优化目标里对PMSM这种强耦合对象非常有吸引力。但我实际搭下来发现几个硬伤。首先是计算量。伺服系统的位置环控制周期通常是1ms速度环是100us电流环更短。在这个时间窗口里要解一个预测时域内的二次规划问题普通MCU跑起来非常紧张。我当时在一颗150MHz的主控上试过MPC计算占用的时间超过40%留给其他保护逻辑和通信的时间就捉襟见肘了。其次是对模型精度的依赖。MPC的性能上限取决于预测模型和真实对象的偏差。电机运行中定子电阻随温度变化、转动惯量随负载变化一旦模型失配预测出来的状态就不准滚动优化就成了基于错误预测的优化。我试过把转动惯量参数偏差拉到20%MPC的动态响应明显变差甚至有小幅超调振荡。还有一个工程上的痛点MPC的权重矩阵Q/R、预测时域Np、控制时域Nc这些参数没有直观物理意义调试起来全凭感觉。现场工程师很难接受一个要靠玄学调参的控制器。1.2 滑模控制鲁棒性确实强但抖振是绕不开的坎滑模控制的思路是设计一个滑模面比如取位置误差和误差变化率的线性组合s e c·ė然后用切换控制把系统状态强行拉到滑模面上滑动。一旦进入滑动模态系统对匹配扰动和参数摄动完全不敏感理论上非常漂亮这也是滑模控制吸引人的原因。但工程实现中问题来了不连续切换必然带来抖振。理想滑模面要求控制切换频率无穷大实际离散系统里根本做不到于是控制量在滑模面附近高频来回切换电机转矩波动、电流噪声都会变大。更麻烦的是抖振不是软件层面随便滤一下就能消掉的它直接影响执行机构和编码器反馈。我试着用边界层法削弱抖振把符号函数换成饱和函数边界层厚度一加大高频抖振确实小了但跟踪精度也跟着下降等于拿性能换平滑。高阶滑模理论上是更优解但算法复杂度和参数数量都上去了。一个本来以简单著称的控制器工程上反而变得不好调。1.3 选型结论ADRC恰好击中了这几个痛点最后让我下定决心选ADRC的是它对待扰动的态度完全不同。MPC想通过精确模型预测扰动SMC想通过强切换抵抗扰动而ADRC的出发点是不管扰动长什么样我直接把它估计出来然后在控制量里反向抵消掉。ADRC不依赖精确模型。它把被控对象内部建模误差、外部负载扰动、摩擦力矩、未建模动态全部打包成一个总扰动用一个扩张状态观测器ESO实时观测这个总扰动再在控制律里补偿掉。我对PMSM的转动惯量、磁链参数只需要知道一个大致量级剩下的偏差交给观测器处理。对位置伺服来说位置环被控对象从物理本质上看是位置→速度→加速度的双积分器结构再加上一个需要实时观测的总扰动状态正好构成三个状态位置、速度、总扰动。所以我采用的是三阶ADRC架构位置环不再需要传统的位置PI和速度PI级联一个ADRC控制器就同时完成了位置跟踪、速度估计和扰动补偿。从计算量、抗扰能力、调参复杂度这几个维度看它是最均衡的选择。2. 从PMSM运动方程到三阶ADRC总扰动是这样被看穿的如果你以前只调过PID第一次接触ADRC可能会觉得扩张状态这个概念有点难啃。我用大白话解释一下PID只关心误差有多大然后根据误差的大小来给控制量ADRC除了关心误差还会像一个经验丰富的操作员那样把外部到底有什么力量在干扰系统也估计出来然后提前把这个干扰力道抵消掉。2.1 从PMSM运动方程到积分串联型标准型先看PMSM在dq同步旋转坐标系下的机械运动方程J·dω/dt Te - TL - B·ω Te 1.5·p·ψf·iq其中J是转动惯量ω是机械角速度Te是电磁转矩TL是负载转矩B是阻尼系数p是极对数ψf是永磁磁链iq是q轴电流。在矢量控制中通常采用id0策略在电流环带宽远高于位置环带宽的前提下可以认为实际iq快速跟踪给定值iq_ref。把转矩公式代入运动方程并整理成dω/dt (1.5·p·ψf / J)·iq_ref - TL/J - B·ω/J这里令控制增益估计值b0 ≈ 1.5·p·ψf / J令总扰动f -TL/J - B·ω/J (b - b0)·iq_ref这个f把所有我说不清楚、测不准、算不对的东西全装进去了负载转矩变化、摩擦阻尼、转动惯量摄动、模型参数偏差。于是运动方程简化为dω/dt b0·iq_ref f再补上位置与速度的关系 dθ/dt ω定义三个状态x1 θ位置 x2 ω速度 x3 f总扰动就得到一个标准的三阶状态方程x1_dot x2 x2_dot b0·u x3 x3_dot h其中h是总扰动的变化率它本身是未知的也没必要精确知道因为后面由观测器去估计。这一步是整个建模的关键把一个真实的PMSM位置伺服系统化简成一个双积分器扰动项的标准型。之所以能这么干不是因为我们忽略了物理特性而是因为ADRC把建模时吃不准的部分全部挪进了扰动项f由观测器兜底。2.2 三阶ESO的构建观测器增益怎么选有了标准型接下来要设计扩张状态观测器。观测器的任务就是通过测量到的位置信号x1把另外两个状态x2、x3也实时估计出来。线性扩张状态观测器LESO的方程如下z1_dot z2 β1·(x1 - z1) z2_dot z3 b0·u β2·(x1 - z1) z3_dot β3·(x1 - z1)其中z1、z2、z3分别是位置、速度、总扰动的估计值。三阶ESO与二阶ESO最大的区别就在这里二阶ESO只有z1、z2两个状态只能估计出位置和总扰动三阶ESO多了一个z3_dot通道等价于把扰动本身也作为被观测对象因此对变化中的扰动比如斜坡形式的负载转矩变化有更好的跟踪能力。观测器的增益β1、β2、β3怎么选最常用的方法是带宽法。把观测器的特征多项式配置成s³ β1·s² β2·s β3 (s ωo)³展开得到β1 3·ωo β2 3·ωo² β3 ωo³ωo就是观测器带宽也是唯一的整定参数。这个方法的物理意义很清楚只要扰动变化率h是有界的观测误差就有界而且随着ωo增大估计误差会进一步缩小。实际使用时ωo一般取控制器闭环带宽的3到10倍保证观测器比控制器反应更快但又不会因为带宽过高把测量噪声放大到不可接受。有个容易忽略的细节观测器方程里的b0会直接影响z2_dot的形式。这个b0是控制增益的估计值不是精确值。它取值不准时ESO会把(b - b0)·u这一部分误差也当作扰动f的一部分去估计和补偿相当于ESO自动兜底了一部分模型误差。这也是ADRC对模型参数不敏感的根源之一。2.3 控制律设计与闭环参数映射ESO给出了位置、速度、总扰动的实时估计之后控制律设计就非常简单了。先做扰动补偿u (u0 - z3) / b0把它代入状态方程x2_dot b0·u x3理想情况下z3≈x3得到x2_dot ≈ u0。也就是说经过扰动补偿之后原来的二阶对象变成了一个纯净的双积分器。这时只需要对双积分器设计一个PD控制器u0 kp·(θ_ref - z1) kd·(ω_ref - z2) θ_ref_ddot其中θ_ref是位置指令ω_ref是位置指令的一阶微分θ_ref_ddot是二阶微分前馈。忽略前馈项时闭环特征方程为s² kd·s kp 0为了得到临界阻尼特性把闭环极点配置在s -ωc则kp ωc² kd 2·ωcωc就是控制器带宽。这样整个三阶ADRC的设计参数就收敛成三个b0控制增益估计值根据电机额定参数估算ωc控制器带宽决定跟踪响应的快慢ωo观测器带宽决定扰动估计的快慢这种三个参数管全局的特性正是ADRC在工程上极具吸引力的原因。3. 仿真模型搭建与参数整定一步步照着搭就行原理说完了下面是实操部分。我用的仿真环境是MATLAB/Simulink这也是做电机控制仿真最常用的工具。项目代号就叫模拟项目X整个模型搭建过程和参数整定方法我在下面详细展开。3.1 总体架构电流环PI加位置环三阶ADRC很多人一开始容易犯的错是恨不得把电流环、速度环、位置环全部换成ADRC。实际上没这个必要三层全换会给仿真和调试带来大量额外变量而且电流环本身是一个快速内环传统PI配合SVPWM已经非常成熟性能也够。我在模拟项目X里的架构是这样设计的控制环控制算法说明电流环PI带宽约1000 rad/sid0控制速度反馈三阶ADRC内置ESO估计不需要额外速度传感器或速度环PI位置环三阶ADRC同时完成位置跟踪、速度估计、扰动补偿注意这里有个关键点因为三阶ADRC的状态z2本身就是速度估计值位置环天然包含了速度反馈信息所以整个外环只需要一个ADRC就替代了传统位置PI速度PI的级联结构。这也是结构上的一个优势。电流环的PI参数我直接用传统的工程设计法计算。对于表贴式PMSMdq轴电感近似相等电流环被控对象等效为一阶惯性环节加逆变器延迟按带宽需求配置PI增益即可。3.2 关键子系统搭建细节整个仿真模型里最重要的部分是ESO子系统。我用积分器和增益搭建这个三阶观测器核心连线逻辑就是前面给出的LESO方程组。在仿真里需要注意三个细节。第一积分器初值要设合理。如果仿真开始前电机已经停在一个初始位置ESO的z1初值应该设置为该初始位置z2和z3设为0否则观测器需要一个收敛过程前几十毫秒的观测误差会被直接反映到控制量上。第二ESO的状态限幅不能省。尤其是在仿真初始阶段或控制量饱和时z3很容易出现巨大跳变可能导致仿真发散。我给z3加了限幅限幅范围根据电机最大等效加速度来估算。第三离散化方式会影响稳定性。连续域下仿真调试好之后换成离散域一定要重新校核。ESO的离散化我用的是一阶前向欧拉这在采样周期足够小的时候是没有问题的。采样周期T_s和观测器带宽ωo的乘积通常控制在0.3以内比较稳。控制律部分相对简单u0按照PD公式计算然后与z3做减法再除以b0。如果是位置阶跃指令前馈项θ_ref_ddot为零ω_ref在阶跃瞬间理论上是一个冲激实现时我直接置零靠PD的微分项来约束动态过程。3.3 参数整定顺序与经验范围参数整定我建议按照先b0再ωc最后ωo的顺序来这个顺序能让每一步的影响都隔离出来。第一步是估算b0。以模拟项目X所用的电机为例额定功率1.5kW极对数p4永磁磁链ψf0.12Wb转动惯量J0.001 kg·m²那么b0 ≈ 1.5 × 4 × 0.12 / 0.001 720注意b0的量纲是 rad/(s²·A)表示单位电流能让转子获得多大的角加速度。实际运行时J会随负载变化b0偏差在±20%以内时ADRC都能扛住。如果转动惯量标称值不确定宁可把b0取小一点也不要把b0取得过大因为b0偏大会让控制量计算偏小系统响应变肉还有可能因为补偿不足留下稳态误差。第二步整定ωc。我一开始取ωc20 rad/s观察位置阶跃响应的快速性然后逐步加大一直到40 rad/s左右。需要注意的是ωc加大到一定程度后响应速度的提升不再明显但控制量会明显变大电流噪声也变多这就是带宽接近系统物理极限的信号。第三步整定ωo。先取ωo5×ωc运行仿真看z3对突加负载的估计速度。如果z3在负载突变后要很长时间才跟上就增大ωo如果z3波形出现高频毛刺说明ωo太大把噪声也当作扰动估计进去了。模拟项目X最终整定结果如下参数数值经验范围b0720按额定参数计算±20%微调ωc30 rad/s伺服位置环常用 20~60 rad/sωo180 rad/s通常取 (3~10)×ωc整套参数整定下来不超过半天比调MPC权重矩阵快得多这是ADRC工程友好的一个重要体现。4. 仿真结果实测位置跟踪和抗扰能力到底强在哪参数整定完之后我把三阶ADRC模型分别做了位置跟踪测试、抗负载扰动测试又跟MPC、SMC的仿真结果做了横向对比。下面这些数据都是模拟项目X仿真模型里跑出来的。4.1 位置跟踪性能阶跃与正弦指令先看最基础的阶跃响应。给位置环一个90°的阶跃指令整定好的三阶ADRC响应曲线特点是几乎没有超调调节时间大约120ms稳态误差小于0.02°。之所以能接近无超调是因为ESO把残余扰动补偿得很干净闭环系统退化为临界阻尼的双积分器加PD控制器PD参数落在临界阻尼点上。再看正弦轨迹跟踪。给一个幅值30°、频率2Hz的正弦位置指令三阶ADRC的跟踪误差在0.5°以内相位滞后约15ms。这个相位滞后主要是控制器带宽决定的如果想要更小的滞后可以增大ωc或者把前馈项θ_ref_ddot加上。这里有一个值得说的观察阶跃响应时如果不加前馈系统在启动瞬间控制量会比较猛ESO会把这个过程当作扰动的一部分去估计导致z3在启动瞬间有一个脉冲。这不会影响稳定但会让控制量峰值偏大。解决办法是给位置指令安排一个平滑的过渡过程或者直接用跟踪微分器生成缓变的参考轨迹。4.2 抗扰性能突加负载时的表现抗扰能力是ADRC的看家本领我单独做了一个工况电机保持在90°位置不动0.5s时刻突加额定负载转矩持续0.2s后撤掉。结果如下三阶ADRC位置最大偏移约0.8°撤载后约150ms恢复到稳态传统位置PI速度PI级联位置最大偏移约2.5°恢复时间约400ms二阶ADRC位置最大偏移约1.2°恢复时间约200ms这个对比很直观。三阶ADRC之所以比二阶ADRC表现更好是因为负载突变后扰动变化率h本身就很大三阶ESO多出来的z3状态能够更快跟上扰动的一阶变化趋势补偿更及时。我还做了一个斜坡扰动的实验负载转矩从0开始在1秒内线性增加至额定值。这种渐变扰动对传统PI来说是个大麻烦速度环会有明显的稳态估计偏差。三阶ADRC几乎无感位置偏差始终小于0.05°这就是多一个扰动状态的价值所在。4.3 方案对比ADRC vs MPC vs SMC的核心差异三套方案我在同一台PMSM模型上都做了完整仿真横向对比表如下对比维度模型预测控制滑模控制三阶ADRC模型依赖度高模型失配性能下降明显低低只需b0计算量高实时性压力大低低抗扰能力中等受限于模型精度强但有抖振代价强主动观测并补偿调参直观性差Q/R/Np/Nc抽象中等边界层参数难选好ωc/ωo/b0物理意义明确位置伺服适用性一般适合对计算资源宽容的场景需要额外消抖处理推荐横向比下来三阶ADRC在伺服控制这个场景下确实是性价比最高的方案。MPC适合算力充足、模型精度有保证的场合SMC适合对抗扰要求极高、对抖振容忍度高的场合而伺服驱动大多数时候需要的恰恰是调参简单、抗扰可靠、算力适中的平衡方案。5. 从仿真到工程落地这几个坑最好在模型阶段就避开仿真里跑得再漂亮最终也得落到实际的MCU和驱动器上。很多坑如果只在仿真时想过而没在模型阶段提前处理到了工程阶段会多走很多弯路。下面这几个问题是我在模拟项目X推进过程中真实踩过的。5.1 离散化连续域参数直接搬过去会怎样第一个坑就是离散化。在Simulink里用连续积分器调好的参数搬到离散模型后性能会退化原因在于ESO的极点分布和采样周期有关。前向欧拉离散后系统极点会随采样周期偏移采样周期越大离散化误差越明显。最直接的判断依据是ωo·Ts ≤ 0.3超过这个范围观测器就容易因为离散误差而振荡。我在模拟项目X里位置环采样周期取1msωo180rad/s算下来ωo·Ts0.18还在安全范围内。如果你把ωo加大到300rad/s采样周期仍然是1ms那乘积就到了0.3的临界线这时候就必须提高采样率或者改成零阶保持离散化再重新整定参数。实际工程中还要考虑主控芯片的中断开销。位置环和速度环的任务如果挤在同一个中断里采样时间抖动也会影响ESO性能。建议给位置环单独分配一个固定优先级的中断不要和通信任务混在一起。5.2 测量噪声与量化误差对ESO的影响第二个坑是测量噪声。仿真模型里的位置反馈是理想值但实际编码器都有量化误差哪怕是17位的编码器在高速运行时位置微分得到的转速也有明显噪声。这些噪声会直接灌进ESO输入端然后被放大。我用过两种解决办法。一种是在ESO前面加低通滤波但要注意滤波相位延迟会抵消一部分观测器带宽收益。另一种更推荐的做法是用跟踪微分器来安排位置指令同时从跟踪微分器的输出取平滑的位置和速度信号送给ESO这样实测的噪声敏感性会低很多。还有一个小技巧ESO对z3的限幅一定要结合执行机构最大能力来设定。如果限幅值太大噪声会通过z3进到控制量里如果限幅值太小扰动估计不足。我的经验是取电机最大等效加速度的1.5倍左右作为z3限幅兼顾快速性和平滑性。5.3 b0失配与输出饱和的边界问题第三个坑是b0失配和输出饱和的交互。前文说过b0偏差在±20%以内没问题但如果你把b0偏差拉到±50%以上会出现什么情况我试过把b0设置为实际值的50%结果扰动估计和实际补偿之间出现明显相位差负载突变时位置动态超调明显变大。另一个更容易被忽略的是输出饱和。ADRC的控制量计算式u(u0-z3)/b0里如果b0取小了同样的u0会被放大很多导致控制量频繁打到限幅值。一旦控制量饱和ESO还在按未饱和的状态去积分就会出现观测器跑偏的现象撤掉饱和后控制量剧烈反向调整。处理办法是在控制器里加入抗饱和逻辑当控制量输出达到限幅时暂停ESO的积分更新或者把实际输出值反算回等效的u0再参与观测器状态更新。这一步必须在仿真模型阶段就实现而不是等到硬件调试发现振荡了才想起来。说到这我个人的体会是三阶ADRC的仿真模型确实不难搭真正决定最后性能的是你能不能把ESO当成一个软传感器去理解而不是当作一个调参黑盒。如果读者后续还想继续深挖可以把这套三阶ADRC框架往两个方向扩展一是把电流环也替换成ADRC形成全ADRC的伺服控制架构二是在位置前馈通道加上模型预测的轨迹规划让三阶ADRC在极端轨迹下的表现更进一步。这个框架的扩展空间非常大。