一台在工程现场调试的永磁同步电机(PMSM)驱动器,电流环的响应品质直接决定转矩是否平稳。传统PI电流环性能不够时,大家自然会往上探索模型预测电流控制(MPCC)。但MPCC把宝几乎全压在电机参数上:交直轴电感、永磁磁链、定子电阻,任何一个标称值与实际偏差过大,预测结果就会明显跑偏。这篇文章记录的是一个可以完整复现的PMSM仿真项目——用自抗扰控制里的扩张状态观测器(ESO)实时估计总扰动,再配合无模型预测电流控制(无模型MPCC)生成电压指令,最终在Matlab/Simulink环境里跑出参数失配、负载突变两种典型工况下的对比波形。
我尽量把建模思路、公式来源、Simulink搭法、调参顺序和踩坑记录都写清楚。代码和表格都会给出来,读者即使只做过PI电流环,也能按着步骤把系统搭起来。
1. 先看清痛点:传统MPCC为什么怕参数漂移
1.1 从PI电流环到MPCC的路径
常规FOC控制里,电流内环用PI已经是工业界默认选择。PI的好处是结构简单、工程整定方法成熟。但它本质上是根据误差比例和积分做调节,动态响应速度有限,尤其是电流给定突变时,d轴和q轴的耦合项、反电动势项都会拖慢响应。
MPCC的思路完全不同。它不是“看到误差再纠正”,而是根据电机模型预测出下一拍电流,再去选电压矢量或用电压方程反解出目标电压。从原理上说,MPCC在动态响应上比PI有天然优势,这也是近年来车载驱动、伺服系统研究里MPCC热度一直很高的原因。
但这里有一个容易被忽略的前提:MPCC做预测时,用的是电机模型里的标称参数。仿真中我们往往直接拿模型里的参数做预测,相当于“开卷考试”,这时候MPCC的性能当然漂亮。一旦换成真实台架,或者电机温度升高导致永磁磁链变化,预测方程就会失真。
1.2 参数失配在MPCC中造成的具体伤害
用表贴式PMSM(Ld=Lq,忽略凸极效应)dq轴电流预测方程来说明:
id(k+1) = id(k) + (Ts/Ld)·[ud(k) − Rs·id(k) + ωe·Lq·iq(k)] iq(k+1) = iq(k) + (Ts/Lq)·[uq(k) − Rs·iq(k) − ωe·Ld·id(k) − ωe·ψf]
这里 Ts 是控制周期,Rs是定子电阻,Ld/Lq是电感,ψf是永磁磁链,ωe是电角速度。预测电流需要用标称参数算,实际电机却有自己的真实参数。两者不一致时,预测电流就会偏离实际电流。常见影响有三个:
第一,电感参数失配会导致电流预测偏移,在死区时间较大的场合,q轴电流会出现稳态误差,直接影响转矩精度。第二,磁链参数失配会造成q轴预测方程里的反电动势项不准,尤其在高速工况下,这个误差会被放大。第三,电阻参数失配在低速大电流工况下明显,虽然电阻项占比不大,但在电机过热时依然会让预测结果产生不可忽视的偏差。
1.3 仿真环境里最容易被忽略的“模型完全已知”假象
很多人在Simulink里搭MPCC,电流采样、电压指令都从同一个电机模型取信号,预测方程用的参数也是电机模块里的同一组参数,这样一来MPCC几乎不可能不好用。我把这种状态叫“自洽性幻觉”——参数一致,预测当然准。
实际工程中,逆变器非线性、延时、磁链饱和、温度漂移都会让预测模型失配。这也是为什么仿真论文里效果极佳的MPCC,到台架上往往要重新花大力气辨识参数。无模型控制的出发点,就是不再依赖精确参数,而是用一个更宽松的模型框架把“不知道的部分”实时估计出来。
2. 无模型MPCC的替代构建:超局部模型加在线辨识
2.1 超局部模型的基本形式与物理含义
无模型控制的数学基础是超局部模型(Ultra-local model)。对一个单输入单输出系统,不必清楚内部机理,只假设输入和输出的关系可以写成:
dx/dt = F(t) + β·u(t)
其中 x 是状态量,u 是控制输入,β 是不依赖精确电机参数的输入增益,F(t) 是“总扰动”,包含了未建模动态、参数偏差、外部干扰等所有说不清的部分。
放到PMSM电流环里,状态量取 id 和 iq,输入量取 ud 和 uq:
did/dt = Fd + βd·ud diq/dt = Fq + βq·uq
比起传统d-q模型,这个形式少了很多项:没有显式的Rs、Ld/Lq、ψf,也没把交叉耦合项写出来。看似“简化”,其实是把所有未建模部分都塞进了Fd和Fq。
核心问题变成两个:β怎么取,F怎么估。β一般取标称电感倒数的倍数,例如βd = 1/Ld_0,βq = 1/Lq_0。它不需要很精确,因为偏差会被F的估计值吸收。这一点正是无模型控制最迷人的地方。
2.2 未知的“总扰动”怎么在线估算
F(t)的估计方法至少有两种。一种是纯代数估计器,从历史电压、历史电流的采样数据反推F;另一种就是用扩张状态观测器ESO,把F当成一个扩张出来的状态去做观测。
我之前试过代数估计器,实现简单,但对采样噪声非常敏感,控制周期短的时候数值会抖得很厉害。相比之下,ESO更平滑,因为它本质上是低通观测器,带宽可以自己调。这也是标题里把ESO和无模型MPCC放在一起的原因:ESO负责估计F,无模型MPCC负责利用F的估计值做预测控制,两者是天然的搭档。
用一阶ESO估计Fd的连续时间形式:
z1_dot = z2 + βd·ud + l1·(id − z1) z2_dot = l2·(id − z1)
其中 z1 是电流id的观测值,z2 是对总扰动Fd的估计值,l1/l2是观测器增益。q轴同理做一套。离散化之后,在每个控制周期里都能得到 z2_d(k) 和 z2_q(k),这两个数就是当前时刻系统“说不清的那部分”的实时估计。
2.3 一拍延迟补偿
数字控制系统里,电压指令从计算到逆变器实际输出,通常有一个控制周期的滞后。如果预测时不补这一拍,高速工况下电流相位会偏,严重时系统自激振荡。无模型MPCC同样要处理这个问题。
做法是先预测一拍,把当前采样到的 id(k)、iq(k) 推进到 id(k+1)、iq(k+1),再在 k+1 的基础上计算目标电压。具体到实现上,我用的两步式:
第一步,用ESO估计量做无模型预测,得到下一拍电流:
id(k+1) = id(k) + Ts·(z2_d(k) + βd·ud(k)) iq(k+1) = iq(k) + Ts·(z2_q(k) + βq·uq(k))
第二步,以 id(k+1)、iq(k+1) 作为起点,反解要达到参考电流 id_ref、iq_ref 所需的电压:
ud_ref(k+1) = [id_ref − id(k+1)] / (βd·Ts) − z2_d(k+1) uq_ref(k+1) = [iq_ref − iq(k+1)] / (βq·Ts) − z2_q(k+1)
这样就把一拍延迟补进去了,实际输出电压作用到电机后,电流能比不补偿的方案更贴近期望轨迹。
2.4 与传统MPCC的核心对照
| 对比项 | 传统MPCC | 无模型MPCC + ESO |
|---|---|---|
| 预测用到的模型 | dq模型,含Rs、Ld、Lq、ψf | 超局部模型,只需βd、βq |
| 参数失配处理 | 直接造成预测误差 | ESO把失配计入F并补偿 |
| 对观测器带宽的需求 | 无 | 带宽越高补偿越强,但噪声越大 |
| 计算量 | 低 | 增加两套二阶ESO,开销很小 |
| 参数辨识工作量 | 大,且高温后易失效 | 只需粗略的β值 |
从表格能直观看到,无模型MPCC的鲁棒性提升是有代价的:需要在控制器里多写一套ESO逻辑。这个代价在DSP或MCU上几乎可以忽略,但建模和调试工作量确实比传统方案大。
3. ESO扩张状态观测器:把扰动变成可观测的第三维
3.1 状态维度是如何“扩张”出来的
ESO的核心思想是把不可直接测量的扰动当作一个新状态,和原状态一起放进观测器里。原来系统的状态只有电流,是一维的。假设扰动本身变化不太剧烈,在单个控制周期里可以近似看成常数,于是给状态向量扩一维:
x1 = id x2 = Fd
状态方程变成:
x1_dot = x2 + βd·ud x2_dot = 0
这就是“扩张”的含义。实际中Fd不可能完全不变,但因为控制周期很短,这种近似是合理的。观测器只靠电流测量值 id 去校正两个状态估计,一个是电流观测值,一个是扰动观测值。
3.2 带宽与极点配置
ESO增益 l1、l2 的经典取法是按带宽ω0配置:
l1 = 2·ω0 l2 = ω0²
这样观测器特征方程会落在双极点ω0上。ω0越大,观测器收敛越快,对扰动的估计越及时,但随之而来的是对测量噪声更敏感。Simulink仿真里电流采样一般是理想信号,看似怎么加大带宽都行,但一旦把采样噪声加进去,带宽过大的ESO输出就开始抖,抖动会通过电压指令传到电机上。
我的经验是,ESO带宽取电流环带宽的5到10倍比较合适。比如电流环闭环带宽设计在500Hz左右,ESO带宽取2kHz到5kHz。具体值要看采样周期和噪声水平,一般从3kHz起步往回调,调到电流波形干净为止。离散化时要注意观测器本身也有稳定域,ω0·Ts乘积不要超过0.2到0.3,否则离散化后会失稳。
3.3 ESO与无模型MPCC的对接逻辑
从控制框图上看,ESO更像是一个“在线参数校正器”。它不直接参与代价函数选择,而是把修正后的扰动估计送入预测方程,相当于把原本用固定模型计算的那部分,替换成了“固定结构加实时修正量”。
实际对接时,电流采样过来后,先送进ESO做一次状态更新,拿到当前拍z1和z2。z1可用于电流滤波,z2用于无模型预测。然后按2.3节的公式推进一拍,计算出ud_ref和uq_ref。最后把电压送入SVPWM产生开关信号。
这个结构下,ESO估计的Fd包含了反电动势、交叉耦合、参数失配和外部干扰的总和。所以即使电机模型里的ψf给错了,ESO也会把偏差“吸收”到z2里,不会像传统MPCC那样直接产生稳态误差。
4. 仿真系统搭建与关键模块实现
4.1 整体拓扑与模块划分
我在Simulink里搭的系统,转速外环用的是普通PI,电流内环用的是“ESO + 无模型MPCC”。之所以转速环还用PI,是因为标题研究重点是电流环鲁棒性,转速环太花哨反而干扰判读。仿真模型从PMSM模块、两电平逆变器、SVPWM到电流采样通道都做了理想化假设:直流母线电压恒定,不模拟IGBT管压降,死区时间设为零。
这样安排是有意的。先把理想环境下的算法性能看清楚,再往模型里塞参数失配和负载突变,才能判断到底是算法本身有效,还是别的环节在起作用。
4.2 电流环核心函数实现
我用Matlab Function模块封装了ESO和无模型MPCC。为了便于移植到单片机,代码用C语言风格写,全部基于离散递推。d轴和q轴各做一套ESO,但共用一个MPCC电压计算函数。
离散化后的ESO递推式(以d轴为例):
z1(k+1) = z1(k) + Ts·(z2(k) + βd·ud(k)) + l1·Ts·(id(k) − z1(k)) z2(k+1) = z2(k) + l2·Ts·(id(k) − z1(k))
初始化z1为0,z2为0。启动后经过大约1到2个电流环时间常数,观测器进入稳态。仿真里最好加一个使能信号,在启动瞬间不计算MPCC电压,等ESO收敛后再切入,否则初始跳变会非常大。
无模型MPCC的电压计算伪代码如下:
/* 一拍延迟补偿 */ id_p = id(k) + Ts*(z2d + betad*ud_prev); iq_p = iq(k) + Ts*(z2q + betaq*uq_prev); /* 反解目标电压 */ ud_ref = (id_ref - id_p)/(betad*Ts) - z2d; uq_ref = (iq_ref - iq_p)/(betaq*Ts) - z2q;这里的 ud_prev、uq_prev 是上一拍实际施加到电机的电压,需要从SVPWM输出端采回来或直接取上一拍的给定值。我建议取上一拍给定值,反馈回路简单,不会夹带死区误差。
4.3 控制时序和采样频率的关系
电流环控制频率决定了Ts大小。我仿真里设Ts = 1e-4秒,也就是10kHz控制频率,这符合绝大多数电机控制器的实际水平。10kHz下,一阶ESO加两套递推的运算量在普通ARM上都能轻松承受,所以在仿真阶段完全不用担心理论算力问题。
但时序上要特别注意:ESO更新用的是上一拍的电压指令;MPCC计算用的也是上一拍电压指令。如果你把当前拍刚计算出来的电压直接喂给ESO,会引入代数环,仿真要么报错,要么结果失真。我一开始就吃过这个亏,后来把信号存储到unit delay里才消除。
4.4 关键电机参数与控制器参数表
| 参数 | 数值 | 说明 |
|---|---|---|
| 直流母线电压 | 310V | 理想直流源 |
| Rs | 2.98Ω | 定子电阻标称值 |
| Ld / Lq | 8.5mH / 8.5mH | 表贴式电机取同值 |
| ψf | 0.175Wb | 永磁磁链标称值 |
| np | 4 | 极对数 |
| J | 0.0008 kg·m² | 转动惯量 |
| 控制频率 | 10kHz | Ts=1e-4s |
| 转速环P / I | 0.05 / 1.5 | 按常规PI整定 |
| ESO带宽ω0 | 3000 rad/s | 折合约478Hz |
| βd / βq | 117.6 / 117.6 | 取1/L标称值 |
这套参数来自某台用于算法验证的模拟样机模型,数值本身并不重要,重要的是量级合理。ESO带宽的取值,我用的是ω0 = 3000rad/s,对应f0约477Hz,比电流环期望响应快一个量级以上。实测在噪声较小时这个值是稳的,加大到5000rad/s以上后,q轴电流波形开始出现高频毛刺。
5. 三组对照仿真:参数失配、负载突变、转速阶跃
5.1 工况设计思路
仿真不能只看理想曲线。我把三种最常被质疑的工况拿出来做对照:参数失配、负载突变、转速阶跃。每组都让传统MPCC和无模型MPCC在完全相同的电机模型、外部条件下跑,只切换电流内环。
第一组,参数失配:电机实际电感在仿真中途从8.5mH变为5.5mH,相当于标称值偏差35%。传统MPCC的预测方程继续用8.5mH,无模型MPCC的β继续用117.6,看谁先出现电流偏差。
第二组,负载突变:在0.3秒时把负载转矩从2N·m阶跃到8N·m,考验转矩电流iq的响应和恢复时间。
第三组,转速阶跃:转速给定从额定值的一半提到接近额定转速,观察动态过程中的电流极限和转速超调。
5.2 结果解读
第一组里,传统MPCC的q轴电流在电感突变瞬间立刻出现偏差,稳态时iq与参考值之间产生了大约0.8A的恒定误差,转速也因此小幅波动。无模型MPCC的ESO在几十个控制周期内就把失配“识别”出来,q轴电流经过短暂动态过程后重新回到参考值附近。两相对比,无模型方案的稳态误差明显更小。
第二组中,负载从2N·m突变到8N·m,传统MPCC和无模型MPCC都能在几十毫秒内把电流推上去,但传统MPCC在逼近参考值时电流纹波略大。原因不难理解:负载突变带来的扰动在传统MPCC看来是“未知的”,只能靠后续预测误差慢慢修正;而无模型MPCC的ESO直接观测到这个外部扰动,预测时提前把它算进去了。
第三组的转速阶跃,两条曲线差异没有前两组大。因为高转速下反电动势占主导,ESO对反电动势的补偿虽然在,但转速环PI本身也会修正转速误差。这说明无模型MPCC的优势主要体现在参数失配和突发扰动场景,均匀稳态工况下两者差距不大。
5.3 这个方案的边界在哪里
无模型MPCC + ESO并不是万能药。它把参数偏差变成扰动补偿进来,但前提是ESO带宽足够高,且系统噪声不能太大。如果电流采样被严重噪声污染,为了压制噪声只能调低ESO带宽,这时它对快速扰动的补偿能力也会跟着下降。
另外,β值的选取如果错误太大,观测器依然能把一部分偏差计入F,但β本身同时出现在控制增益位置。β偏差过大时,系统动态性能会明显打折。这也就是说,无模型并不是真的“完全不需要模型”,而是把对精确物理参数的依赖转移为对粗略输入增益的依赖。
6. 调参顺序与避坑清单
6.1 我实践的调参顺序
先跑通传统MPCC,确认电流环在理想参数下正常工作。这一步能排除电机模型本身的问题。然后才把ESO加进去,这时先不给无模型MPCC切换,只观察ESO输出z2是否平滑、是否收敛。等观测器波形稳定后,再切换到无模型MPCC。最后才开始调ESO带宽和β值。
这种顺序很重要。直接一步到位搭无模型MPCC,出了问题根本判断不准是ESO没收敛,还是MPCC的拍延时补偿写错了,还是β值不合适。分步验证,每一步都有明确的通过标准,能省大量时间。
6.2 我踩过的几个坑
ESO初始化时z2设成0,在电机启动阶段ESO会有一个明显的收敛过程。如果转速环在启动瞬间就给定一个大阶跃,电流很容易在ESO收敛前过冲。解决方式是在ESO输出z2处加一个使能保持,启动后前几个控制周期强制z2等于0,等观测稳定后再放开。
另一个坑是离散化公式里漏掉Ts。连续时间公式里l1、l2单位是每秒,离散递推时必须乘上控制周期Ts。漏乘后ESO带宽会虚高,系统在低速时看着正常,高速时电流发散。我检查过很多次,最后发现竟然是这个不起眼的细节。
还有,SVPWM在输出电压饱和时,实际电压和给定电压不一致,导致ESO把饱和偏差也当成扰动去补偿,造成积分饱和类似的问题。解决方法是电压指令经过饱和限幅后,回传给ESO的必须是被限幅后的实际值,而不是未限幅的参考值。这个细节和抗积分饱和思路完全相同。
6.3 参考资料与下一步扩展
做这类项目,参考文献不必盯着某一篇专门论文,按关键词组合去检索就够用:“扩张状态观测器”“永磁同步电机”“无模型预测控制”“超局部模型”这几组词组合搜,能找到大量主题相近的期刊文章和学位论文。我的做法是把它们分成两类看:一类专门讲ESO,参考其带宽整定和稳定性分析;一类专门讲超局部模型,参考其离散递推和延时补偿写法。两类资料合起来,基本上就覆盖了本项目的核心内容。
如果想继续扩展,可以往三个方向做:把ESO从电流环推到转速环,做成双环都带自抗扰的系统;把传统两电平逆变器换成三相三电平结构,验证无模型MPCC在新拓扑下是否依然保持鲁棒性;或者把ESO的离散化方式从一阶欧拉改成零阶保持,观察高速大电感工况下波形是否有改善。
就我实际跑下来的体会,ESO + 无模型MPCC这套组合的价值,不在教科书式的理想仿真波形里,而是在你把电机参数设错、把负载突然加重、把采样噪声调大之后,它还能把电流稳住的那一下。做电机控制的应该都懂,这种事情在台架上是常态,在仿真里愿意主动去制造“麻烦”的人反而不多。如果你也已经在做MPCC,我建议别满足于理想参数下的完美波形,试着把你的仿真模型“弄脏”一点,你会更理解这套方案为什么值得留着。