☰
从PI到ADRC:PMSM速度环仿真建模与参数整定
2026/10/21 7:44:48 网站建设 项目流程

做永磁同步电机(PMSM)驱动控制的朋友,大概率都经历过这样的场面:花了一上午把速度环PI参数调得又快又稳,结果一挂负载、一换转速区间,响应曲线立刻像换了一台电机。这也是我后来系统性地研究自抗扰控制(ADRC)并在Simulink里搭了一套完整仿真模型的原因——不是说PI一无是处,而是想给“扰动抑制”这件事找一条更有章法、更少靠手感的路子。

这篇文章要做的,就是把我从零搭建“ADRC速度环 + PMSM双闭环矢量控制”仿真模型的完整过程讲清楚:先讲为什么速度环适合换ADRC,再拆解TD、ESO、NLSEF三个构件在Simulink里怎么落地,然后是双闭环拓扑怎么设计、参数怎么定标,最后给出三组PI与ADRC的对照仿真结果,以及我调试时踩过的几个坑。适合正在做电机驱动控制、想从PI往ADRC过渡的工程师和研究生,也适合准备复现ADRC控制论文但被公式卡住的同学。

1. 为什么要在PMSM控制里引入ADRC:PI参数整定的疲惫与自抗扰的思路

1.1 PI控制反复失灵的三个真实场景

PI控制器在PMSM速度环里用了几十年,工程上足够成熟,但在某些场景下确实会让人觉得力不从心。

第一个场景是负载突变。比如一个传动系统,空载时速度环PI参数调得轻快灵敏,一旦瞬间加上额定负载,转速就会先掉一大截,然后靠积分慢慢拉回来。这个跌落深度和恢复时间是矛盾的:增益调高能减少跌落,但容易振荡;调低了恢复又太慢。PI本质上是在“误差出来之后”才去补偿,无论参数怎么折中,都改变不了它被动响应的本质。

第二个场景是电机参数随温度漂移。绕组温度升高,定子电阻变大,永磁体磁链随温度下降,这些变化都会让控制对象的特性发生变化。PI的增益是按某一个工作点整定的,工作点一变,原本的增益就不再匹配,响应质量就会下降。

第三个场景是宽调速范围。额定转速和低速爬行时,反电动势、摩擦力、负载特性差别很大,同一套PI参数很难兼顾。我见过不少工程上的妥协办法:做增益调度,按转速分段切换PI参数,但参数表维护起来非常麻烦,而且切换瞬间容易跳变。

这些场景的共同点,是系统受到了PI“看不见”的扰动。PI只能看到转速误差,然后按误差的线性组合去调节,它不知道误差背后是负载变了还是参数变了,所以只能“事后补救”。

1.2 ADRC的核心思想:把总扰动“看见”再抵消

自抗扰控制(ADRC)的思路和PI完全不同。它先把被控对象写成一种很特殊的形式——积分串联型,把模型不准确、外部负载、参数变化这些东西统统打包成一个“总扰动”,然后用扩张状态观测器(ESO)实时把这个总扰动估计出来,直接在前向通道里把它抵消掉。

以转速环为例,PMSM的机械运动方程可以近似写成:

dω/dt = f(ω, TL, ΔJ, ...) + b0 · iq_ref

其中ω是机械角速度,iq_ref是q轴电流给定,b0是控制增益的粗略估计,f就是“除了这个增益项以外的所有东西”——负载转矩、摩擦、转动惯量变化、模型误差,全部塞进这个总扰动里。

ADRC的思路不是去精确建模f到底是什么,而是让ESO去观测它。ESO是系统里的一只“眼睛”:它同时观测转速、转速变化率和总扰动,然后控制器在输出控制量时,把估计到的总扰动减掉。如果ESO估计得准,那么整个回路对控制器来说就变成了一个干净的积分器,剩下的控制问题一下子简单了很多。

打个比方:普通PI控制是在船掉进浪坑里之后再拼命划桨把船推出来;ADRC则像是船上有个瞭望员,提前告诉你“前面有三米高的浪要来了”,你提前用力,等浪真正到的时候船已经稳住了。这个提前量,就是ESO估计总扰动并前馈补偿的意义。

1.3 ADRC不是万能药:它的适用边界

ADRC听起来美好,但并不是所有环节都适合无脑换成它。它适合对象阶次不高、可以近似成积分串联型的场景。PMSM速度环就非常合适:机械动态是典型的一阶惯性加积分,带宽要求不高,扰动主要来自负载。

电流环就不太一样。电流环动态快,带宽要求高,控制周期受限于PWM开关频率,ESO在高频离散化下的估计精度会受影响,而且电流反馈噪声大,高带宽观测器容易把噪声放大。所以工程上往往保留电流环PI,只在速度环用ADRC,这也是我推荐大多数人起步的配置。

另外,ADRC虽然对模型依赖低,但它对执行器饱和很敏感。如果控制量长时间顶在限幅上,ESO的观测就会失真,这时候需要配合抗饱和处理。这一点后面调试部分会专门说。

2. TD、ESO、NLSEF三个构件在Simulink里的落地映射

ADRC被讲得神秘,拆开其实就是三个模块:跟踪微分器(TD)、扩张状态观测器(ESO)、非线性状态误差反馈(NLSEF)。在Simulink里把这三个模块各做成一个子系统,先单独喂信号做单元测试,再连起来,是效率最高的做法。

2.1 TD跟踪微分器:给指令“戴上手刹”

TD的作用是为转速给定安排一个平缓的过渡过程。直接给ESO一个阶跃转速指令,会让观测器在启动瞬间承担很大的初始误差,并且转速微分信号会出现峰值。TD输出的x1平滑地逼近给定值,x2则是x1的微分,相当于“带手刹的指令信号”。

TD离散形式如下:

x1(k+1) = x1(k) + h · x2(k)

x2(k+1) = x2(k) + h · fhan(x1(k) - v(k), x2(k), r, h0)

其中r是过渡过程的加速度限幅,h0是滤波因子,fhan是最速控制综合函数。fhan的具体实现有点长,但网上资料很多。我自己调试时用的是下面这个版本的MATLAB Function,可以直接放进模型:

function fh = fhan(x1, x2, r, h0) d = r * h0^2; a0 = h0 * x2; y = x1 + a0; a1 = sqrt(d * (d + 8 * abs(y))); a2 = a0 + sign(y) * (a1 - d) / 2; s_y = (sign(y + d) - sign(y - d)) / 2; a = (a0 + y - a2) * s_y + a2; s_a = (sign(a + d) - sign(a - d)) / 2; fh = -r * (a / d - sign(a)) * s_a - r * sign(a); end

在Simulink里实现时,我用两个积分器分别保存x1和x2,fhan用MATLAB Function或Fcn模块实现。如果只是想快速验证ADRC效果,也可以先用一阶惯性环节替代TD,把惯性时间常数设置成接近期望的上升时间,虽然跟踪精度不如fhan,但过渡效果已经比直接阶跃好很多。

2.2 ESO扩张状态观测器:系统真正的“眼睛”

ESO是ADRC的心脏。对于转速这个一阶对象,ESO扩张成三阶:z1跟踪转速,z2跟踪转速变化率,z3跟踪总扰动。

离散差分方程如下:

e = z1(k) - y_feedback

z1(k+1) = z1(k) + Ts · (z2(k) - β1 · e)

z2(k+1) = z2(k) + Ts · (z3(k) - β2 · fal(e, α1, δ) + b0 · u)

z3(k+1) = z3(k) - Ts · β3 · fal(e, α2, δ)

其中u就是ADRC输出的iq_ref,y_feedback是转速反馈,Ts是控制周期。β1、β2、β3是观测器增益,通常按带宽法配置,后面第4章具体展开。

在Simulink中,我推荐用三个Unit Delay模块搭建离散ESO,每个Unit Delay保存一个状态,然后用加法器和Fcn模块完成计算。这样比MATLAB Function里的persistent变量更清晰,也方便调试时看中间量。fal函数的实现如下:

function y = fal(e, alpha, delta) if abs(e) <= delta y = e / delta^(1 - alpha); else y = sign(e) * abs(e)^alpha; end

这里有个细节要提醒:ESO的输入信号是控制量u和反馈y,这两个信号的单位必须对得上。u的单位是A(电流给定),y的单位是rad/s(转速),它们经过状态方程内部耦合,最终z3的单位是rad/s²。搭建时我习惯在信号线上用Simulink的Signal Name标注单位,防止连错线。

2.3 NLSEF非线性组合:取代“比例+积分+微分”的线性加法

NLSEF的作用是根据两条误差线(位置误差e1 = x1 - z1,速度误差e2 = x2 - z2)生成一个“等效加速度控制量”u0,再减去总扰动估计z3后除以b0,得到真正的电流给定:

u0 = β1p · fal(e1, α1, δ) + β2p · fal(e2, α2, δ)

iq_ref = (u0 - z3) / b0

为什么不用线性PI?因为fal函数是非线性的:误差小的时候增益高,误差大的时候增益低。这正好符合控制直觉——接近目标时精细调节,离目标远时防止过猛。而且fal函数在零点附近有δ线性段,避免理想非线性在零点处的增益无穷大问题。

这三个子系统的信号流是:给定转速进TD,TD的x1/x2和ESO的z1/z2做差进NLSEF,NLSEF输出减去z3后除以b0得到iq_ref,iq_ref同时送给电流环和ESO作为输入。整个回路把模型不确定性留在了ESO的估计范围里,控制器本身面对的是一个“被补偿过的积分对象”。

3. 速度环用ADRC、电流环用PI:双闭环拓扑怎么搭才合理

3.1 id=0矢量控制框架下的级联结构

PMSM驱动的主干结构大家应该很熟了:转速外环输出iq_ref,电流内环控制id和iq,Park/Clark坐标变换把三相电流转到dq轴,SVPWM把电压矢量变成开关信号。id的给定恒为零,保证定子电流全部用于产生转矩。

在这样的框架下,ADRC替换的只是外环控制器。速度环负责抗负载扰动和参数变化;电流环负责快速跟踪电流给定并限制电流峰值。两者时间尺度差了一个数量级以上,控制任务完全不同。

3.2 电流环为什么不上ADRC

我在搭建模型初期也试过把电流环改成ADRC,结果并不理想。电流环的响应时间在毫秒级,ESO需要很高的观测带宽才能跟上电流变化,而观测带宽一旦提高,对电流采样噪声就很敏感,iq波形上全是毛刺。电流环本身还有反电动势解耦项和电阻压降补偿项,这些补偿做好以后,PI已经能获得相当快的动态,ADRC的优势并不明显。

所以我的建议很明确:第一版模型就用“速度环ADRC + 电流环PI”。电流环PI参数比较好整:Kp按比例放大电流误差,Ki负责消除稳态误差,典型值可以取Kp=15~25、Ki=200~300,具体按电机电感电阻调整。这样整个系统既有ADRC的抗扰能力,又避开了电流环高带宽观测的麻烦。

3.3 整体模型组织和信号连接顺序

Simulink模型我建议按下面的子系统划分:

  • 速度给定与TD子系统:输入转速指令,输出x1和x2。
  • ESO子系统:输入iq_ref和转速反馈,输出z1、z2、z3。
  • NLSEF子系统:输入x1、x2、z1、z2、z3,输出iq_ref。
  • 电流PI子系统:输入iq_ref、id_ref=0、实际id、iq,输出ud、uq。
  • Park/Clark变换与SVPWM子系统:负责坐标变换和PWM信号生成。
  • PMSM电机本体与逆变器子系统:输出三相电流和转速。

信号流顺序是:转速指令 → TD → NLSEF → iq_ref(限幅) → 电流环 → 坐标变换 → SVPWM → 逆变器 → PMSM → 编码器转速反馈 → ESO和NLSEF。

连接时我用Simulink的Goto/From标签代替直接连线,减少长信号线的视觉混乱。转速反馈在进ESO前,最好经过一个低通滤波器或者采样保持,因为仿真中编码器信号往往带有测量噪声,观测器会直接放大它。

4. 参数定标:从电机参数到b0、带宽法的初值与微调

ADRC劝退最多人的地方就是参数整定。但实际操作中,它比PI整定更有章法,因为你几乎可以按“带宽设计”一步步推出来。

4.1 从电机参数到b0的计算

先给一套我常用的典型PMSM参数:

参数数值说明
定子电阻 Rs2.875 Ω相电阻
d/q轴电感 Ld=Lq8.5e-3 H表贴式电机
永磁磁链 ψf0.175 Wb磁链恒定
极对数 np4电气/机械关系
转动惯量 J8e-4 kg·m²转子加负载折算
额定转速3000 rpm电角速度换算

速度环控制对象里,b0是“单位电流给定产生的转速加速度”的估计:

b0 = 1.5 · np · ψf / J

代入这组参数:1.5 × 4 × 0.175 / 0.0008 ≈ 1312.5。也就是说1A的iq电流大约能产生1312.5 rad/s²的机械角加速度。

这里有个关键经验:b0不要求精确。ESO会把b0的实际偏差一并当作总扰动来估计和补偿。也就是说,你可以把b0取到1000或者1600,系统仍然能工作,只是动态特性会有差异。但符号绝对不能错,b0取负号会让ESO正反馈,系统必发散。

4.2 带宽法:先定ωc,再定ESO增益

先把期望的速度环闭环带宽定为ωc,比如80~120 rad/s。控制带宽决定响应快慢,别贪高,电机机械系统带宽太高会激发机械谐振。

ESO带宽ωo通常取3到5倍ωc,然后观测器增益按下面公式算:

β1 = 3 · ωo β2 = 3 · ωo² β3 = ωo³

比如取ωc=100,ωo=300,则β1=900,β2=270000,β3=27000000。这些值看着吓人,实际很常规,ESO的高增益正是它能快速估计总扰动的原因。

NLSEF的增益初值可以取:

β1p = ωc² β2p = 2 · ωc

fal函数里的指数:α1取0.5,α2取0.25,δ取0.01~0.05。

我的微调顺序是:先把ESO调稳。怎么做呢?给电机一个恒定的iq给定,把NLSEF的输出屏蔽掉,直接观察z3能否稳定跟踪实际扰动量。z3不发散、不剧烈振荡,说明ESO增益合适。然后再把NLSEF接上,逐步加大β1p和β2p,观察转速阶跃响应,出现抖动就回调。

4.3 采样时间和仿真步长:高频控制与低速仿真的矛盾

仿真模型里有两类步长:控制周期Ts和Simulink求解器步长。控制周期对应实际DSP里的中断周期,我建议设Ts=1e-4,也就是10kHz,和常见PWM频率一致。ESO和电流PI的离散化都用这个Ts。

Simulink求解器步长则要小得多。ESO本身是数值敏感的观测器,离散误差在小步长下会被掩盖,大步长下则可能累积发散。我的经验是:验证模型时用固定步长ode4,步长设1e-6。仿真时间长一点也没关系,先保证系统稳定,之后可以适当放大步长到1e-5验证一下稳定性边界,但最终交付版本的步长尽量不要大于1e-6。

5. 三组对照仿真:ADRC与PI在启动、突加负载、参数失配下的表现

模型搭好之后,我做了三组对照实验。对比方式是同一套PMSM模型,只切换速度环控制器,PI参数通过传统的带宽整定调到“没有明显超调且响应够快”的状态,ADRC参数按第4章的带宽法设定。下面的数据是我这组典型参数下的参考结果,具体数值会随电机参数变化,但趋势是稳定的。

5.1 启动过程:超调量与上升时间的取舍

给一个1500rpm的转速阶跃指令,两个控制器对比:

对比项PI控制ADRC控制
启动超调8%~12%基本为零(由TD安排过渡)
上升时间约0.05s约0.08~0.12s(受r限制)
调节时间约0.15s约0.12s
启动电流冲击较大,容易顶限幅平缓,限幅时间短

PI的优势是上升快,但代价是超调;ADRC因为有TD的过渡安排,转速指令是被“柔化”过的,所以基本无超调。启动电流冲击小意味着对逆变器和机械本体的冲击小,这在工程上是很有价值的。

5.2 突加负载扰动:速度跌落与恢复时间

系统稳定运行在1500rpm,在t=0.5s时突然加一个0.5倍额定负载转矩,持续0.2s后撤掉:

对比项PI控制ADRC控制
转速跌落约80~120rpm约20~30rpm
恢复时间约0.15s约0.03~0.05s
恢复过程波形有明显回摆基本一次到位,无回摆

这个对比是ADRC最亮眼的地方。PI要等转速跌下来才慢慢积分补偿,ADRC的ESO在负载加入的瞬间就在z3里观测到了突变的扰动量,并立刻在前向通道里补上电流,速度几乎没来得及掉就稳住了。

5.3 参数失配鲁棒性:电机参数变化50%会怎样

把转动惯量J从8e-4增到1.2e-3,也就是模型参数和整定参数失配50%,同时把定子电阻提高30%模拟发热,观察转速阶跃响应:

PI控制的响应明显变慢,如果再加大增益容易振荡——这就是工作点漂移带来的问题;ADRC控制的响应曲线和原来几乎重叠,因为J和Rs的变化都被归入总扰动f,被ESO估计并补偿掉了。这种鲁棒性正是ADRC在伺服、传动等变负载场合越来越受重视的原因。

6. ADRC仿真调试中最容易踩的四个坑

6.1 ESO一仿就发散?先查三个地方

我在第一版模型里用1e-4的仿真步长跑,ESO直接发散,转速飞出天际。排查下来主要三个原因:

一是步长太大。ESO的离散化误差随着步长增大迅速积累,把求解器改成固定步长1e-6后立刻稳定。二是b0的符号或量级错误。符号反了必发散,b0比实际值小太多也会让补偿强度不足甚至引起振荡。三是β3过大。带宽法给的β3是ωo的三次方,数值很大,如果反馈信号含噪,高增益会放大噪声导致z3抖动,进而扰动控制量。解决办法是适当降低ωo。

6.2 iq_ref高频抖振,多半是fal函数和δ的问题

现象是iq_ref波形在高频小幅抖动,转速波形看着还行,但电流波形很毛。常见原因是fal函数里的δ取得太小。α小于1时,fal在小误差区间的增益理论上很大,如果没有足够的δ线性段缓冲,数值上就会在零附近来回抖。把δ从0.001提到0.01~0.05,抖动明显减轻。

另一个原因是NLSEF里的β2p(速度误差增益)取得太大。速度误差信号本来就含噪声,增益一大就把噪声灌进控制量。检查z2曲线如果毛刺多,先给转速反馈加低通滤波,或者降低β2p。

6.3 b0失配:现象和调整方向

b0偏大时,相当于控制器认为“同样的电流能产生更大的加速度”,补偿量偏大,系统容易振荡。b0偏小时,补偿不足,启动变慢,抗扰性能下降。

怎么判断?观察ESO的z3:如果z3长时间维持一个很大的常值在补偿,说明b0和真实增益偏差明显。我调试时的调整策略是:先把b0按计算值设置,观测转速阶跃响应,如果出现高频振荡就减小b0;如果响应偏软、加速度不足,就增大b0。每次调整幅度在10%~20%,不要一次变动太大。

6.4 微分信号发毛:TD的r和h0怎么选

转速微分信号在ADRC里很重要,但它也是最容易被噪声污染的。TD的x2是转速指令的微分,r取得越大,过渡过程越快,但x2的峰值也越大,相当于把指令的冲击直接暴露出来。h0是滤波因子,适当取大可以平滑x2,但会引入相位延迟,过渡过程会慢一点。

我的习惯是:r先取一个能接受的最小上升时间对应的值,比如0.1s内到位,r大约算出来在1e4量级;然后观察x2曲线,如果有明显尖峰,加大h0。ESO的z2是转速观测微分,它本身也有噪声问题,如果NLSEF里速度误差通道不需要太激进,可以适当调低β2p,而不是一味提高ESO带宽。

最后说一句自己的体会。ADRC刚上手时,最大的门槛其实不是公式,而是要改掉调PI的肌肉记忆。PI调的是误差比例,ADRC调的是ESO的观测能力——前期花在ESO稳定性上的时间越足,后面换电机、换负载、改工况时就越省心。我第一次把突加负载的波形调出来时,转速跌落从将近100rpm降到20rpm左右,确实有“终于不用再伺候PI参数表”的感觉。希望这篇把模型搭法和参数套路讲清楚的文章,能帮你少走我当初走过的弯路。

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

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

立即咨询