ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

三阶自抗扰控制在永磁同步电机伺服中的仿真建模与调参指南

三阶自抗扰控制在永磁同步电机伺服中的仿真建模与调参指南

说句实在话,永磁同步电机伺服控制做到最后,比拼的不是谁会用模型预测控制或滑模控制,而是谁能在模型不确定、负载突变、参数漂移这些“脏活累活”面前,把系统的鲁棒性和动态响应同时照顾好。我做了一段时间三阶自抗扰(ADRC)伺服控制仿真,感受很深:这套方案不用依赖精确模型,却能把扰动估计和补偿做到位,仿真效果确实稳。本文就把整个项目从思路、原理、建模到调参踩坑的过程完整拆开,做成一份可以照着复现的实操记录。


1. 项目整体设计与思路拆解

1.1 为什么选择三阶自抗扰伺服控制

做位置伺服控制,很多人第一反应是“电流环加PI、速度环加PI、位置环再加个P”就完事了。这种经典级联结构在工况平稳时没有任何问题,但一旦遇到负载突变、转动惯量变化、摩擦力矩不规则等情况,位置环那个简单P控制器就会暴露出动态刚度不足的问题。伺服系统要求的是高精度、快响应、强抗扰,而经典PI在“跟踪快”和“超调小”之间往往需要手动折中,折中不好就会振荡。

我选三阶自抗扰,核心原因有三个:第一,ADRC不依赖精确的被控对象模型,把内部参数变化、外部负载力矩和未建模动态统一当作“总扰动”来估计并补偿;第二,三阶扩张状态观测器(ESO)不仅估计扰动,还估计位置和速度,自然形成一个完整的闭环反馈结构;第三,在仿真阶段,ADRC的模块化搭建和参数整定比MPC要直观得多,比滑模控制更少受抖振困扰。

所谓“三阶”,在实际位置伺服里通常指的是:被控对象为位置和速度构成的二阶系统,再把总扰动扩张成第三阶状态。也就是说ESO是三个状态——位置估计、速度估计、总扰动估计。这样设计的好处是,不需要额外接入速度传感器或速度观测器,位置反馈就够用了,观测器会把速度信息“顺带”重建出来,实际工程中还能省掉一支编码器或者减少对测速质量的依赖。

1.2 与模型预测控制、滑模控制的横向对比

在选择控制策略时,我同时考虑了模型预测控制(MPC)和滑模控制(SMC),但最终日常调试还是以ADRC为主线。下面这张对比表是我在项目中反复权衡之后整理的,基本反映了三者在伺服控制场景下的实际取舍。

对比维度三阶自抗扰(ADRC)模型预测控制(MPC)滑模控制(SMC)
模型依赖低,只需知道控制增益的粗略值高,需要较准确的机电模型中,保证匹配条件即可
扰动处理通过ESO实时估计并补偿依靠模型预测和反馈校正间接抑制依靠滑模面的开关切换抑制
动态响应快,可安排过渡过程快,带约束优化很快,但伴生抖振
参数整定难度中,带宽法思路清晰高,权重矩阵和预测时域难调中,滑模面参数和趋近率系数需要配合
计算复杂度低,离散化后每步计算很少高,每个周期要解优化问题低,但符号函数的执行容易高频抖动
对执行器饱和处理弱,需要额外限幅和抗积分措施强,约束直接进入优化目标弱,饱和时容易失稳
仿真调试友好度好,模块化并行一般,越复杂越容易跑飞一般,抖振会影响波形判断

从表格能看出,MPC在约束处理上有天然优势,但它在高速伺服周期下对算力有硬要求,仿真里能跑,实时硬件上就必须考虑求解器效率与延时;SMC的抗扰能力很强,但它那套“切换控制”在实际离散系统中非常容易激发机械谐振,仿真里看着响应曲线锐利,一旦加入采样延迟和电流环带宽限制,抖振就会把波形污染掉。ADRC正好在二者之间找到了一个平衡点:响应快、抗扰强、参数直观、实现简单。


2. 三阶自抗扰控制的核心原理

2.1 扩张状态观测器的物理含义

三阶ADRC的灵魂在扩张状态观测器。我们以位置环为例,假设电流环和速度环已经整定完成,位置控制的被控对象可以简化为二阶串联积分模型:

θ̈ = f(θ, θ̇, w, t) + b0 · u

其中θ是位置,b0是控制增益的估计值,f包含了转动惯量变化、负载力矩、摩擦、未建模动态等一切不确定项,也就是我们说的“总扰动”。传统控制对这部分的处理方式是靠积分器慢慢消除,或者靠大反馈增益硬压;ADRC则把总扰动扩张成一个新的状态变量,用ESO实时估计它,然后在控制量中反向补偿。

三阶ESO的状态方程可以写成:

ż₁ = z₂ + β₁ (θ - z₁)
ż₂ = z₃ + β₂ (θ - z₁) + b₀ u
ż₃ = β₃ (θ - z₁)

这里的z₁跟踪位置,z₂跟踪速度,z₃估计总扰动。β₁、β₂、β₃是观测器增益,工程上最常用的做法是通过观测器带宽ω₀来确定,取:

β₁ = 3ω₀
β₂ = 3ω₀²
β₃ = ω₀³

为什么这样取?因为这样可以把ESO的特征方程配置成 (s + ω₀)³,让三个状态收敛速度统一、无超调。整个ESO本质上就是一个带反馈增益的三阶观测器,输入是位置测量值和控制量,输出是“重建后的完整状态”。

从物理角度看,z₃边估计边补偿的过程就是系统自己给自己做“体检”:它不需要知道负载力矩是多大,不需要知道转动惯量变没变,只要位置反馈呈现偏差趋势,z₃就会自动调整估计值,并在控制端形成一个“负反馈扰动抵消”。这种设计显然比PI积分器更主动——PI只能对过去误差做积分,ESO则是在扰动刚出现时就通过状态估计给出前馈性质的补偿。

2.2 跟踪微分器与过渡过程安排

三阶ADRC里另一个关键模块是跟踪微分器(TD)。很多网友会问:ESO已经估计出速度和扰动,为什么还要TD?直接给个阶跃目标不行吗?

不行。位置伺服的核心矛盾之一是“目标阶跃很大”和“执行器不能瞬间暴力输出”之间的矛盾。你给位置环一个180度的阶跃,如果不加处理,控制量在初始时刻会非常大,电流环直接饱和,机械结构也会受到剧烈冲击,最后输出曲线要么严重超调,要么在饱和限幅中来回切换。ADRC的做法是用一个跟踪微分器把阶跃目标“整形”成一条平滑到达的过渡轨迹,同时顺便给出期望轨迹的速度信号:

TD的离散形式常用最速控制综合函数,核心思想就是让目标位置r跟踪成x₁,并得到x₂作为目标速度,x₂同时起到了前馈信号的作用。有了过渡过程,系统就不再跳变了。控制器的反馈项只需消除“实际位置与过渡轨迹之差”,而不是面对一个陡峭阶跃。

我当初第一次调ADRC时,直接去掉TD做阶跃响应,结果仿真波形超调量接近30%,ESO内部的扰动估计也被冲击成一个大尖峰。加回TD之后,超调几乎降到零,电流峰值也明显下降。所以TD不是辅助设计,它是ADRC能否“既快又稳”的隐藏功臣。

2.3 控制律与扰动补偿回路的形成

三阶ADRC的控制律在结构上是“线性状态误差反馈 + 扰动补偿”:

u₀ = kₚ (v₁ - z₁) + k_d (v₂ - z₂)
u = (u₀ - z₃) / b₀

这里v₁来自TD,是过渡位置;v₂是过渡速度。kₚ和k₀可以按控制器带宽ω_c配置:

kₚ = ω_c²
k_d = 2ω_c

配置完之后,闭环特征方程相当于 (s + ω_c)²,动态特性就由ω_c单一决定。整定这个系统的复杂度就降到了两个带宽参数上:观测器带宽ω₀和控制器带宽ω_c。工程上一般让ω₀是ω_c的3到5倍,这样扰动估计响应快,但又不至于放大测量噪声。

于是整体回路形成了这样的结构:TD安排目标轨迹,ESO负责状态和扰动估计,控制律负责在去除扰动之后对被“净化为”二阶积分器的对象进行镇定。每一个模块分工明确,逻辑非常清晰。我习惯用一句通俗的话概括:TD是安排路线的人,ESO是观察风力、坡度、车辆载荷变化的侦察员,控制器则是那个只管踩油门、把车稳在路线上的驾驶员;侦察员实时报告坡度和载荷,驾驶员提前把油门补偿到位,所以它不靠事后修正,而是靠实时补偿。


3. 仿真模型搭建全过程

3.1 整体拓扑与 Simulink 模块划分

我在仿真中采用MATLAB/Simulink环境搭建了整个永磁同步电机伺服控制系统。模型整体分为几个大块:PMSM本体模型、三相逆变器、SVPWM调制、坐标变换模块、电流环PI控制器、速度环PI控制器以及位置环三阶ADRC模块。

有人说,既然研究ADRC,为什么电流环和速度环还要用PI?这里要讲清楚:三阶ADRC在当前项目里是针对最外环的位置控制设计的。内环电流响应速度远快于位置环,如果强行把整个PMSM机电系统全部交给一个高阶ADRC去处理,控制带宽会非常难匹配,扰动扩张状态的数量也会急剧增加,这不仅没有简化系统,反而会让观测器陷入“谁都能估、谁都估不准”的局面。工程上更成熟的做法是“内环PI保带宽、外环ADRC抗扰动”。这种混合架构已经在很多高性能伺服产品里被验证过,仿真里也最容易复现出“效果很好”的波形。

Simulink模型的基本信号流这样走:位置给定值输入到三阶ADRC,ADRC输出作为速度环参考值,速度环PI输出作为q轴电流参考,电流环PI输出电压参考,再经过坐标反变换和SVPWM生成三相占空比信号,驱动逆变器给PMSM供电;电机输出的三相电流和编码器位置反馈再回到模型。整体闭环中,位置是唯一被ADRC观测的外反馈量,速度反馈只用在速度环PI内,仿真里可以加入编码器量化噪声来考验ESO的真实性能。

3.2 PMSM 数学模型与坐标变换

把PMSM模型写清楚是后续参数整定的基础,简单回顾一下核心关系。在dq旋转坐标系下,表贴式永磁同步电机的电压方程:

u_d = R_s i_d + L_s di_d/dt - ω_e L_s i_q
u_q = R_s i_q + L_s di_q/dt + ω_e L_s i_d + ψ_f ω_e

电磁转矩:

T_e = 1.5 p ψ_f i_q

机械运动方程:

J dω_m/dt = T_e - T_L - B ω_m

其中R_s是定子电阻,L_s是定子电感(表贴式L_d≈L_q),ψ_f是永磁磁链,p是极对数,ω_e是电角速度,ω_m是机械角速度。控制策略采用i_d=0,这样转矩与q轴电流线性相关,系统从“非线性转矩对象”变成了一个线性比例环节,极大简化了控制器设计。

坐标变换上需要一个绝对清晰的链路:采样得到三相电流i_a、i_b、i_c,先通过Clarke变换到αβ轴,再通过Park变换到dq轴。位置角使用编码器反馈的转子角度。给ADRC的输入是机械角度或电角度?我在这里吃过大亏。位置环输入用机械角度,但电机转速使用电角速度时要除以极对数,坐标变换里使用的则是电角度,两者差着一个p的关系。如果模型里没注意,仿真结果就会呈现“角度倍频”异常。

3.3 三阶 ESO 模块的实现

在实际建模时,我习惯用MATLAB Function模块封装三阶ADRC,外层用离散状态更新实现TD、ESO和控制律,这样便于查看中间变量,也不容易产生代数环问题。核心ESO离散更新逻辑可以写成如下形式。

function [u, z1, z2, z3, v1, v2] = adrc_update(r, pos, u_prev, dt, wo, wc, b0) persistent z1s z2s z3s v1s v2s if isempty(z1s) z1s = pos; z2s = 0; z3s = 0; v1s = pos; v2s = 0; end % TD 跟踪给定位置 v1s = v1s + dt * v2s; v2s = v2s + dt * ( -wc * (v1s - r) - 1.4 * v2s ); % 简化过渡形式 % ESO 状态更新 e = pos - z1s; z1s = z1s + dt * (z2s + 3 * wo * e); z2s = z2s + dt * (z3s + 3 * wo * wo * e + b0 * u_prev); z3s = z3s + dt * (wo * wo * wo * e); % 控制律 u = (wc * wc * (v1s - z1s) - 2 * wc * (v2s - z2s) - z3s) / b0; z1 = z1s; z2 = z2s; z3 = z3s; v1 = v1s; v2 = v2s; end

这里有一个细节:ESO更新需要使用上一周期的控制量u_prev,不能在同一个步长里使用当前时刻的u,否则会形成“u依赖z、z依赖u”的代数环。我把ADRC输出经过一个Unit Delay再回送到ESO,既保证了物理延迟特征,又规避了Simulink代数环报警。

3.4 参数整定流程与推荐初值

三阶ADRC的整定其实不需要玄学,核心是“先定内环、再定外环、带宽分层”。我的完整流程是这样:

第一步:整定电流环PI。内环带宽一般设为速度环带宽5到10倍。在仿真里先把电流环PI参数按零极点对消法设置:比例项取L_s的近似值乘以带宽,积分项取R_s乘以带宽,然后微调。电流环的目标是让iq快速跟踪参考值,同时不过分放大电流噪声。

第二步:整定速度环PI。速度环带宽一般设为位置环ADRC带宽的3到5倍。速度环PI的参数我习惯用小工程经验法:先设积分项为0,只调比例项让速度响应曲线临界稳定,再恢复积分项滤除稳态误差。速度环的PI输出直接对应iq参考。

第三步:确定b0。这是ADRC里唯一与被控模型直接相关的参数。在位置环等效对象中,b0近似等于电机转矩系数除以转动惯量,也就是1.5pψ_f/J。仿真中我会先按标称值设置,然后故意把b0增大或减少50%来测试ESO的补偿能力。

第四步:定控制器带宽ω_c。先给一个保守值,比如5至10 rad/s,跑阶跃响应,观察跟踪速度。在不超过电流环带宽的前提下,逐步加大ω_c。每加大一档,就观察位置波形是否出现振荡。

第五步:定观测器带宽ω₀。取ω₀=3ω_c起步,然后逐步提到5到7倍。观测器带宽越高,扰动估计越快,但噪声放大也越明显。如果在仿真中加入白噪声,会直观看到z₂和z₃的抖动程度随ω₀升高而加剧。

一个常用的推荐初值组合:ω_c=15、ω₀=75、b0=120。在某个模拟的轻载小惯量伺服对象上,这个组合就能给出不错的效果,再根据具体对象逐项微调。


4. 仿真效果分析与对比

4.1 位置阶跃、负载突变与正弦跟踪的波形表现

在我搭建的仿真模型上,三阶ADRC的表现可以分三个典型工况来说。

第一个工况是位置阶跃。给定一个单位阶跃位置指令,TD把阶跃平滑成一条先加速后减速的过渡轨迹,实际位置紧随其后,几乎没有超调。由于ESO实时补偿了模型误差,稳态精度可以进入一个极小范围。这里最明显的特点是“响应快且没有超调”,这与传统PD控制要牺牲超调才能换响应速度形成了鲜明对比。

第二个工况是负载突变。我在仿真中用阶跃信号模拟突加负载力矩,在t=0.05秒处从一个较小的负载跳到额定负载,然后观察位置跌落量。三阶ADRC因为ESO能迅速估计出总扰动的变化,位置跌落幅度远小于纯PI控制,恢复时间也短。波形上能看到z₃信号在负载突变后的响应:它是一个快速跟随负载变化的平滑曲线,几乎没有任何振荡和延迟,这正好反映了ESO对扰动的“观测”能力。

第三个工况是正弦跟踪。给定一个连续变化的正弦位置指令,比较跟踪误差。ADRC的相位滞后主要由过渡过程中的TD和对象动态共同决定,但通过调节ω_c可以把跟踪误差压得比较小。加扰后,MPC和SMC的误差会有明显凸起,而ADRC的误差变化要平缓得多,说明其扰动补偿在整个运动过程中都在持续工作。

4.2 控制器带宽与观测器带宽对性能的交互影响

仿真中最值得体会的是ω_c和ω₀之间的配合关系。光调大ω_c,系统动态响应加快,但如果ω₀跟不上,ESO对扰动的估计滞后就会导致控制量补偿出错,严重时会在高速指令下激发振荡。反向操作也一样:把ω₀调到极大,ESO的扰动估计非常“灵敏”,但位置反馈中的任何测量噪声都会被放大成失控的补偿信号,导致z₃曲线毛刺密集,负载突变时甚至出现反向过冲。

所以我把参数整定总结成一条交互规律:控制器带宽“决定系统的野心”,观测器带宽“决定系统的眼力”。野心可以大,但如果眼力不够,就会不看路乱踩油门;眼力如果过头,又会把路面的小石子当成大坑猛踩刹车。仿真里做出来的“效果很好”,本质就是这对组合恰到好处。实际调参时,我先用阶跃响应调ω_c,再用负载突变调ω₀,最后回到阶跃响应复查,通常两三轮就能收敛到一套满意参数。

4.3 与SMC、MPC在同一仿真工况下的差异

我在相同PMSM模型上分别实现了滑模控制器和模型预测控制器,结果差异相当直观。滑模控制的阶跃响应在快速性上表现突出,但控制量曲线里明显能看到高频切换痕迹。单纯看位置波形,SMC和ADRC都有很好的跟踪效果,但看iq电流或者电磁转矩波形时,SMC的抖振就暴露了。抖振反映在实际系统里就是电机噪声和传动机构磨损;仿真波形上虽然没有实际噪声,但控制量来回高频跳变的幅度已经足够说明问题。

模型预测控制的优势主要体现在带约束的工况,比如限制iq电流峰值。MPC可以在控制器内部直接处理这个约束,理论上做到“不超限的最快跟踪”。缺点也很明显:每个仿真步长都要做一次小型优化,仿真速度明显变慢;而且MPC的整定参数多,权重矩阵、预测时域、控制时域之间的耦合关系非常微妙。我在调试MPC的时候,一个不当的权重设置就能让位置响应在目标点附近出现缓慢蠕动,而这种问题在ADRC中很少出现,因为ESO已经完成了大部分扰动消除工作,底层的线性控制器行为更容易预测。

从综合效果看,三阶ADRC在“控制性能、实现成本、调试效率”三者之间取得了最好的平衡。这也是这个项目最终选择ADRC作为位置环主控策略的原因。


5. 常见问题与排查技巧

5.1 仿真一开始就发散,最先查哪些点

遇到Simulink仿真运行出去几毫秒就数值爆炸,大概率不是ADRC算法本身的问题,而是建模环节的细节出了错。根据我的经验,按以下顺序排查效率最高:先看采样时间设置,离散ADRC模块和电机模型如果步长不匹配,会产生伪振荡,尤其是速度环和位置环采样时间不一致时,波形会很“毛”;再看ESO更新里是否使用了当前周期的u,形成代数环;如果仿真日志出现“algebraic loop”提示,基本就是这个原因。

其次是b0符号和数量级。b0是对控制增益的估计,如果符号取反,整个回路从负反馈变成正反馈,必然发散;如果b0比实际值大几十倍,ESO估计的扰动项会被压低,控制补偿力度不足,系统虽然不一定发散,但会呈现严重的滞回和稳态误差。检查方法很简单:在仿真里把位置给定设为零,初始位置偏差给定一个小值,观察系统能否收敛回零,如果连这个静态镇定测试都过不了,优先检查b0。

5.2 ESO三个状态输出震荡,如何处理

ESO的z₃震荡通常有两个来源:观测器带宽过高,或者控制器带宽与观测器带宽过于接近。如果z₃波形像噪声一样高频抖动,先把ω₀降下来看看。很多人以为观测器带宽越大越好,但实际上当ω₀超过伺服系统机械谐振频率时,观测器会把高频机械模态也当作扰动估计进来,反而给控制端注入高频补偿,直接放大震荡。

第二个来源是位置反馈本身有噪声。仿真里我们往往忽略了传感器量化噪声,但如果加入量化模块,ESO对噪声的敏感度就暴露了。一个实用技巧是在位置反馈进ESO之前加一阶低通滤波器,但滤波器的截止频率至少要高于ω_c的3倍,否则会把有用的位置信号也滤掉,增加相位滞后。另一个技巧是把ESO的位置误差e做一个死区处理,实际工程中对微小的量化误差不过度响应,能显著改善z₃波形质量。

5.3 跟踪滞后明显,怎么判断是观测器滞后还是控制器滞后

很多初调ADRC会出现正弦跟踪曲线整体滞后一个明显相位。要分清环节,可以同时观察三个信号:给定位置、ADRC输出、实际位置。如果实际位置整体落后给定但幅度完好,并且控制量已经达到较大值但电机加速不够,问题多半在控制带宽ω_c偏低,系统“不敢发力”。在波形上可以看到v₁和z₁之间的误差始终存在但并未被快速消除,这时应加大ω_c。

如果控制量本身很大,实际位置依然滞后,那问题很可能出在观测器带宽、或者b0偏大导致扰动补偿被过度抑制。此时观察z₃,会发现扰动估计值变化缓慢,甚至与真实负载变化方向相反。处理办法是把ω₀提高,或者把b0往实际值方向修正。除此之外,TD本身也会带来一段固定延迟,如果对跟踪相位有硬性要求,可以适当加快TD的过渡速度,但要做好轻微超调的心理准备。

5.4 为什么我的抗扰效果没有别人演示的好

最常见的原因是内环带宽不够。三阶ADRC是建立在内环已经足够快的基础上的,如果位置环ADRC带宽与速度环带宽只差两三倍,ADRC的补偿量会与速度环的动态响应耦合,扰动补偿就开始“你和稀泥我搅浆糊”,效果自然差。另一个容易被忽视的点是负载扰动的引入方式:仿真里应该通过机械运动方程加负载力矩,也就是在T_L处加阶跃,而不是直接去叠加在iq电流上。直接加电流等价于改造控制器输出,测试出来的所谓“抗扰性能”其实没有实际意义。

还有一点就是仿真时长和收敛状态。ADRC在初始阶段需要一小段时间让ESO从零初值收敛到真实状态,如果在系统尚未收敛时就做扰动测试,波形自然会乱。所以正式做扰动对比之前,我会让系统先运行一个稳定周期,确保z₁、z₂、z₃都处于稳定收敛状态,再在t=定值处切入负载阶跃,这样测出来的结果才有说服力。


6. 个人实操体会

在做完整个仿真项目之后,我对三阶ADRC最大的感受是:它的设计哲学和传统PI完全不同。PI是在误差出现之后去“修补”,ADRC是在扰动出现的同时就去“抵消”。仿真波形上的那个“效果很好”,背后其实是ESO在每一个采样周期里都做了一次隐形的系统辨识和补偿动作,这种内禀的主动抗扰能力,是它对比其他现代控制方法最核心的优势。

如果让我给准备上手ADRC的人提一条最实用的建议,那就是:不要一上来就追求参数最优,先把“TD + ESO + 控制律”三个模块在仿真里单独拆开调试。把TD单独拎出来看目标轨迹是否平滑,把ESO单独拎出来看给定一个非零初始位置时它能否快速收敛,最后再把三个模块连起来调。这个分步调试法可以避免绝大多数“耦合出来的疑难杂症”。

当然,ADRC也不是没有短板。它的抗扰性能很大程度受制于观测器带宽,而观测器带宽又受制于系统噪声和采样频率。仿真里一切干干净净,效果能做得很好;真实硬件上还需要考虑过采样、滤波、电流环延时补偿等一系列工程问题。后续如果要继续扩展,可以把ADRC与重复控制结合起来做周期性扰动抑制,或者用参数辨识方法在线上自适应调整b0。这些都是很值得往下深挖的方向,也会让这套三阶自抗扰伺服控制方案在更复杂的工况下继续稳定发挥。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进