☰
永磁同步电机ADRC控制实战:ESO观测器与Simulink仿真调参指南
2026/10/21 8:41:18 网站建设 项目流程

一直用PI环做永磁同步电机电流控制的老哥们,多少都经历过这种场面:仿真波形漂漂亮亮,一上实机就乱飞;负载一加,转速先掉一大截再慢慢爬回来;电机参数随温度一变,原来调好的增益全得返工。我前两年被这事折腾得不轻,后来把速度环和电流环里的ADRC(自抗扰控制)真正吃透,并在Simulink里把整个控制链跑通,才算是找到了一个不用频繁调参、抗扰动能力又明显更好的方案。

这篇文章不是教科书复读,而是我实际搭建“永磁同步电机ADRC”控制器的过程拆解。我会把ESO(扩张状态观测器)为什么能干活、Simulink里怎么落地、参数怎么整、哪些坑必须躲,一条龙讲透。如果你已经在用Simulink做电机控制仿真,但对ADRC停留在“看过原理、没动过手”的阶段,这篇文章正好能帮你直接跳过大部分人都会踩的那几个坑。

1. 为什么ADRC在永磁同步电机上值得认真上手

1.1 PID的力不从心:参数耦合与外部扰动的双重困境

永磁同步电机的数学模型在dq坐标系下是两套耦合的微分方程,转速和电流之间互相影响,还叠加着反电动势、负载转矩、磁链谐波这些扰动。传统PI调节器把每个环都当成独立的单输入单输出系统来处理,设计时假设对象模型是固定的,但实际上电机参数——尤其是定子电阻和磁链——会随温度和工况明显漂移。

PI环不是不能用,而是每个工况点都需要重新权衡比例增益和积分时间。增益调大了动态响应快,但噪声放大、超调变大;积分调强了能消稳态误差,可一遇到饱和就容易超调甚至振荡。最头疼的是负载突变或参数漂移时,PI全靠误差累积来纠正,反馈明显滞后。

我在某跨平台系统的速度环调试里做过对比:PI环在额定负载下调到临界阻尼,转矩从0阶跃到满载时转速跌落接近200rpm,恢复时间在300ms左右;同一工况换成ADRC后,跌落减小一半以上,恢复时间不到原来的三分之一。这个差距不是调参水平问题,而是控制结构对不同扰动成分的响应方式决定的。

1.2 ADRC的思路:不精确建模,直接估计并抵消扰动

ADRC的核心逻辑很朴素:既然模型不准、扰动又复杂,那不如把“模型偏差+外部扰动+耦合项”统一看成一项总扰动,用一个状态观测器实时估计出来,再在控制量里直接减去。

这个思想落实下来就是三个部分:跟踪微分器(TD)安排过渡过程,扩张状态观测器(ESO)估计状态和总扰动,控制器用误差反馈加扰动补偿。对永磁同步电机来说,最有价值的是ESO——它把那些说不清的摩擦力、负载突变、参数漂移统统塞进一个扩张状态里,然后在前向通道里主动抵消。

正因为不需要精确的电机模型,ADRC在工程上特别适合PMSM这种非线性、强耦合、变参数的对象。你只要知道大致的增益范围,剩下的交给ESO去估计和补偿,控制器的带宽设计相对独立,调参逻辑比PID更直观。

1.3 哪些环节适合上ADRC,哪些没必要

不是每个地方都值得用ADRC。我自己的习惯是:速度环必上,因为负载扰动和机械参数变化主要作用在这里;电流环如果要求不高可以继续用PI,因为电流环带宽高、采样快,ESO的离散化误差容易在高频段引入噪声。但如果你的系统对转矩响应有极高要求,比如伺服主轴、高动态机械臂,那电流环也值得上ADRC。

还有一点很多文章没提:ADRC的观测器对采样噪声敏感。如果你的电流传感器质量一般,或者编码器分辨率偏低,ESO会把测量噪声当成高频扰动来“补偿”,反而让控制量抖得更厉害。这种情况下可以适当降低观测器带宽,或者先对反馈信号做一阶低通滤波,再进ESO。

2. 永磁同步电机控制里ADRC要解决的具体问题

2.1 dq坐标系下的模型回顾:把方程改写成ADRC能用的形式

永磁同步电机在同步旋转坐标系下的定子电压方程为:

ud = Rsid + Ldd(id)/dt - ωeLqiq
uq = Rsiq + Lqd(iq)/dt + ωeLdid + ωe*ψf

其中Rs是定子电阻,Ld、Lq是dq轴电感,ωe是电角速度,ψf是永磁体磁链。如果只看q轴电流环,把交叉耦合项和反电动势都归入扰动,则被控对象可以写成一阶形式:

d(iq)/dt = (1/Lq) * uq + f

这里的f就是“包含反电动势、耦合项、参数偏差的总扰动”。这种写法正是ADRC最喜欢的标准型:一阶系统,控制增益b近似等于1/Lq,其它全交给ESO。

速度环同理,机械方程为:

d(ωr)/dt = (1.5pψf/J) * iq + f_mech

其中p是极对数,J是转动惯量。对于表贴式PMSM,id通常控制为0,转矩和iq近似线性关系,所以速度环也能简化成一阶标准型。

2.2 ESO在电机控制里到底观测什么:状态、扰动、一点小心思

ESO的本质是做一个比实际系统“快一点”的虚拟副本,把输入和输出都接进来,通过反馈校正让副本状态逼近真实状态。对一阶对象:

d(x)/dt = b*u + f

ESO的状态方程是:

e = z1 - y
d(z1)/dt = z2 - β1e + bu
d(z2)/dt = -β2*e

其中z1跟踪系统的输出状态(速度或电流),z2就是扩张出来的“总扰动估计值”。只要观测器带宽足够高,z2就能在几十毫秒内收敛到真实扰动附近。

在电机控制里,z2这个信号特别宝贵。它自动包含了负载转矩、摩擦、磁链变化、甚至机械共振造成的等效扰动,你可以直接用它做前馈补偿,而不需要额外加转矩观测器。我用过传统扰动观测器(DOB),相对比下来ESO不需要单独设计Q滤波器,带宽调节更直接,整个Simulink模型也更好维护。

2.3 控制器设计:用带宽法一步到位

ADRC的反馈控制器不需要积分项,因为ESO已经把扰动补偿掉了,剩下的部分近似为纯积分对象,用一个比例增益就行。对一阶对象:

u0 = kp * (v - z1)

其中v是给定值,kp等于观测器带宽的1/3到1/5左右。注意这里的给定值如果经过跟踪微分器安排过渡过程,则v是平滑后的值,超调量可以压得很小。

总控制量为:

u = (u0 - z2) / b

这个除法补偿了系统增益的不确定性。b的取值很关键,它和真实对象的控制增益偏差太大时,ESO估计出来的扰动会包含这部分偏差,虽然也能补偿一部分,但会牺牲动态性能,所以b还是要尽量取准。

3. Simulink里搭建ADRC控制器的实战拆解

3.1 整体模型结构:速度环ADRC加电流环PI的混合方案

我的做法是速度环用ADRC,电流环继续用PI,这样做模型复杂度可控,又能把ADRC最擅长的抗扰动能力用在刀刃上。整体Simulink结构如下:

  • 速度给定经过跟踪微分器(TD),输出平滑给定和微分信号;
  • 速度反馈进ESO,ESO输出估计速度和估计扰动;
  • 速度误差经过比例控制得到u0,再减去扰动估计并除以b,得到q轴电流给定;
  • q轴电流给定和d轴电流给定(通常为0)进传统PI电流环;
  • 电流环输出经过反Park变换生成SVPWM控制信号,驱动逆变器模型。

工程上可以在Simulink里建一个“ADRC_Speed”子系统,封装后接口就是:速度给定、速度反馈、输出iq_ref。这样后续想切换到PI速度环做对比实验,只需换一个子系统就行。

3.2 ESO的Simulink实现:连续域和离散域到底选哪个

很多人第一次搭ESO会在连续积分器和离散积分器之间犹豫。我也是从连续域开始搭的,仿真能跑通,但一旦考虑代码生成就完全不够用。连续域模型里随手拖的Integrator模块,在硬件上实际对应的是离散积分器,两者的稳定性边界完全不同。

我建议直接从离散域开始搭。采用零阶保持器近似,设定控制周期Ts,比如速度环用1e-4秒,电流环用1e-4秒或更小。ESO离散化后的形式为:

z1[k+1] = z1[k] + Ts*(z2[k] - β1e[k] + bu[k])
z2[k+1] = z2[k] - Tsβ2e[k]

在Simulink里用Unit Delay(单位延迟)模块实现状态更新,用Gain和Sum搭建反馈修正路径。这样做的最大好处是,模型结构和你要写进MCU的C代码几乎一一对应,后面做代码生成或者手工移植都省事。

3.3 跟踪微分器(TD)和控制器模块的参数设置

TD的作用是“安排过渡过程”。我用的是最经典的最速跟踪微分器,离散形式为:

fh = fhan(v1 - v, v2, r, h)
v1[k+1] = v1[k] + Tsv2[k]
v2[k+1] = v2[k] + Ts
fh

fhan是最速控制综合函数,工程实现里可以直接用文献里那个两段式公式。参数r是速度因子,决定过渡过程快慢;h是滤波因子,影响对噪声的抑制。对速度环,r取100到500都能用,想要响应硬朗就取大值,但太大会让给定变化接近阶跃,失去TD的意义。

控制器部分其实就一个比例模块加一个扰动补偿模块,但有几个细节值得注意:

  • 比例增益kp优先取5到20,具体和观测器带宽挂钩;
  • 扰动补偿通道一定要经过饱和处理,防止输出iq_ref超出电流环承受范围;
  • 如果b值取得和实际差距太大,建议在仿真里做一次参数扫描,画几条b不同取值下的阶跃响应曲线再定。

3.4 封装子系统的端口设计与代数环回避

ADRC子系统内部的反馈路径里,ESO使用了当前时刻的控制量u,这会让模型产生代数环。解决办法有几个,我实践中最好用的是:在ESO更新时使用上一时刻的u,也就是在控制输出到ESO的路径上插入一个Unit Delay。

这一点特别容易忽略,但非常重要。代数环会让Simulink在仿真时迭代求解,严重拖慢速度,在代码生成时甚至直接报错。我第一次搭的时候没注意,模型仿真一步要半分钟,排查了半天才发现是这里的问题。往控制输出路径上放一个Unit Delay后,模型立刻顺畅了,仿真速度也恢复正常。

4. 从“能跑”到“跑得稳”:参数整定与离散化细节

4.1 带宽法整定:观察器带宽、控制器带宽怎么配

ADRC最主流的参数整定方法是带宽法,核心思路是把观测器特征方程配置成二重极点:

s² + β1*s + β2 = (s + ωo)²

于是 β1 = 2*ωo,β2 = ωo²。控制器带宽ωc和观测器带宽ωo的经验比例是:ωo ≈ 5~10倍的ωc。对于速度环,如果期望闭环带宽20Hz左右,那么ωc取100rad/s上下,ωo取800到1000rad/s。

这个配比背后的逻辑是:观测器必须先于控制器响应,才能有足够时间把扰动估计出来。如果ωo取得太小,ESO看到的扰动滞后,补偿效果就会打折;取得太大,高频噪声又被放大。我一般先从ωo/ωc=5起步,看仿真里的扰动估计波形是否干净,再逐步往上升。

4.2 离散化对高频段稳定性的影响:一个被忽略的问题

离散ESO的稳定带宽和采样周期直接相关。理论上只要Ts*ωo小于某个阈值,离散观测器就是稳定的,但实际工程中你会发现,当ωo超过0.2/fs附近时,观测器会开始出现高频振荡,这和连续域分析得到的结论完全不同。

这一点很多教程不会提,因为连续域的Bode图看不出来。我踩过一次:某图像处理Demo的控制系统里,我把ωo设到了3000rad/s,采样频率10kHz,仿真波形看起来一切正常,但硬件实验时电流噪声明显增大,电机还伴随轻微啸叫。后来把ωo降到1500,问题立刻消失。建议你在定参数前用Simulink的离散仿真把输出频谱跑一遍,确认没有明显的高频毛刺。

4.3 饱和与抗积分饱和处理:ADRC的另一个隐性需求

ADRC结构里没有积分器,常规的反积分饱和设计不适用,但ESO本身存在“饱和抗扰”问题。当控制量u碰到限幅时,ESO的输入已经不是控制器计算出来的u,而是被截断后的实际值。如果ESO继续拿未饱和的u来更新,z2会错误地认为扰动增大,最终导致补偿量持续堆高,等退出饱和后出现明显的反向过冲。

解决办法是:ESO更新的u必须取自限幅后的实际输出。实现上很简单,把饱和模块放在控制量输出路径上,然后从饱和模块的输出端引信号进ESO。有些人图省事直接从控制器输出引,这种错误模型仿真的波形初期很接近正常,但一遇到饱和工况就会暴雷。

我排查过的一个实际案例:速度环在满载启动时明显超调,起始怀疑ESO参数不对,折腾了一整天,后来才发现ESO用的是未限幅的控制量。改掉这个问题后,超调直接降到5%以内。

5. 仿真实验与波形解读:三个让我印象深刻的实测案例

5.1 案例一:满载启动,ADRC和PI的抗扰对比

我在某跨平台系统里分别搭了PI速度环和ADRC速度环,做了一组相同条件下的满载启动对比。电机给定转速1000rpm,负载转矩从0阶跃到额定值,两个模型都用10kHz采样,仿真时间1秒。

PI的结果:转速跌落约180rpm,恢复时间约320ms,动态过程中q轴电流峰值约1.6倍额定。ADRC的结果:转速跌落约70rpm,恢复时间约120ms,q轴电流峰值约1.3倍额定。波形上ADRC的恢复曲线更平滑,没有PI那种明显的“拉回-超调-再拉回”过程。

这里面最值得关注的是ESO输出的z2波形——它能清晰地看出ESO在负载突变后约10ms内就跟踪到了转矩变化,这比PI通过误差积分慢慢“爬”上去要直接得多。

5.2 案例二:参数漂移场景下的鲁棒性表现

我把电机模型的定子电阻人为增加了50%,磁链减小10%,模拟温升后的参数变化。PI系统在新建模下出现了约15rpm的稳态误差,而ADRC系统稳态转速几乎不受影响,只在动态过程中多了一点瞬时偏差。

原因正是我在第2节提到的:参数变化被ESO归入总扰动并从控制量里主动补偿掉了。这个优势在实机上特别明显——电机跑热之后,不需要重新整定就能维持基本性能。

不过要说清楚,ADRC不是万能的。如果参数偏差大到b值严重失真,比如实际控制增益和模型b差了3倍以上,系统动态性能仍会下降,只是稳定性通常还能维持。用b做参数扫描时,我能明显看到响应从欠阻尼逐步变为过阻尼的过渡。

5.3 案例三:仿真发散排查,一场和代数环与初始值较劲的记录

还有一个让我印象深刻的排错过程。模型能跑但波形发毛,转速上有高频锯齿,ESO的z2跟踪不上,电流响应颠簸。当时所有参数的带宽都符合经验值,仿真步长也足够小,就是找不出问题。

后来逐一拆分模块才发现,ESO状态量的初始值和真实系统起始状态差得太远,z2初始给的是0,但真实扰动初始值很大,观测器在收敛过程中产生了大幅超调。更麻烦的是,由于模型里有代数环,收敛过程在每一步迭代里被反复干扰,波形就一直是毛糙的。

解决方法是:把ESO的z1初始值设为系统初始速度,即仿真开始时的实际转速;z2初始值设为0但把观测器增益先降低,让ESO“软启动”,运行0.1秒后再切到正式增益。我做了个简单的InitCtrl信号来控制这个切换,效果立竿见影,波形在启动阶段立刻干净了。

6. 从Simulink到实机移植的“骚操作”经验

6.1 模型里就该提前铺好的软同步与归一化

Simulink里物理量直接用实际单位,比如电压是V、电流是A、转速是rpm,但MCU控制程序里通常会用标幺值或者ADC的原始码值。移植时如果只改单位,很容易出现增益差几个数量级的问题。

我的经验是,在仿真模型里就提前做归一化:电压基值用直流母线电压,电流基值用额定电流,转速基值用额定转速。这样ESO的参数在仿真中和实机中保持一致,不需要重新整定。这类在仿真阶段多花半小时做的事,通常能省下实机阶段好几天的时间。

6.2 采样与执行时序:别让离散化假设在硬件上失效

Simulink模型里默认所有模块都在同一时刻触发,采样间隔均匀,但实际MCU程序里电流环和速度环往往在不同频率下执行,PWM中心对齐采样还存在延迟。如果你用离散ESO模型生成代码,务必确认ESO的更新时刻和PWM采样时刻对齐,否则相当于给ESO反馈路径上额外串联了一个延迟环节。

我在某电机控制项目里做过一次实验:ESO更新频率从10kHz降到5kHz,观测器带宽保持1500rad/s,结果转速波形出现明显振荡。后来把观测器带宽按比例降到800才稳定。这说明移殖时不能只看仿真参数,采样频率变了,观测器带宽必须跟着调整,建议按Ts*ωo不超过0.15来控制。

6.3 在线切换PI和ADRC:调试阶段的保命手段

最后分享一个我在实际调试中非常依赖的技巧:在Simulink模型里做一个“PI/ADRC切换开关”,同时把两套控制器的输出都算出来,通过一个切换模块选择哪一路接入电流环。切换到ADRC之前先把PI输出清零,切换到ADRC后让ESO在线运行一段时间再接通控制通道,这样能避免切入瞬间的冲击。

这个设计看起来简单,但价值很大。实机调试时你不可能一上来就信任新控制器,保留PI通道作为安全备份,任何时候波形异常都能一键切回PI,不用反复刷固件。我的做法是:先用PI跑到稳定工况,然后切ADRC并观察z2估计是否平稳,确认无误后再增加负载测试。

7. 收尾前再聊聊我踩过的几个常见坑

7.1 别把观测器带宽拉太高:性能与噪声的取舍

这是我在多个项目里反复被教育的一条。ADRC的ESO带宽越高,估计越快,抗扰越强,但代价是噪声放大。对速度环来说,机械速度信号如果来自低分辨率编码器,带宽超过1000rad/s以后,噪声会直接体现在q轴电流给定上。

我个人习惯的做法是:先把观测器带宽拉到目标值,然后观察iq_ref的功率谱密度,如果有明显的噪声基底抬升,就逐步降低带宽,直到噪声可接受。不要为了仿真指标好看而牺牲实机的平稳性。

7.2 b值的确定不能拍脑袋:离线辨识和在线修正

b值代表控制增益的倒数,很多人直接用1/Lq或者用J估算一下就扔进模型,结果动态性能不如预期。建议在搭ADRC之前先做一次开环阶跃响应辨识:给电机一个固定占空比电压,记录电流或转速变化率,反推出实际增益,然后再用这个值做b的初值。

如果条件允许,还可以写一个简单的在线修正逻辑:在稳态运行中比较ESO估计扰动和实际转矩估算值,两者的差值可以用来修正b。这种方法不需要额外硬件,就是纯软件处理,很实用。

7.3 跟踪微分器的滤波作用比你想象的重要

TD不只是让给定平滑,更关键的作用是避免阶跃给定对ESO的冲击。没有TD时,速度给定阶跃会让速度误差瞬间很大,控制器输出饱和,ESO状态被强行拉偏,出现“首拍效应”。有了TD之后,给定按最速轨迹过渡,ESO和控制器都能从容跟上。

有些人觉得TD会拖慢响应,其实不会,过渡过程的时间通常只有实际上升时间的几分之一,只要r调得合适,动态性能完全可以兼顾。我只能说,在Simulink里拖动r滑块看波形变化,比看任何公式都能更快建立直觉。

ADRC控制器我在不同平台上也试过好几轮了,最大的感受是“仿真越顺利,实机越容易,反过来也是成立的”。如果你只是想让波形好看,PI加滤波在仿真里已经能做得很漂亮,但真到负载变化、参数漂移这种硬场景下,ADRC的差距就能一眼看出来。这篇文章里的每一个模块我都按实际调试顺序写下来的,你照着搭一遍,应该能完全复现。如果卡在哪一步,多半是代数环或初始值问题,优先检查这两处。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询