☰
从参数失配到数据驱动:永磁同步电机无模型预测电流控制实践
2026/10/20 8:06:01 网站建设 项目流程

做永磁同步电机电流环控制的同行应该都有过这样的经历:明明仿真里调得好好的模型预测电流控制(MPCC),一上台架就发现电感参数跟标定值对不上,电枢电阻随温度一飘,波形就乱给你看。我后来接触到一种思路,不再死磕精确的电机模型,而是把dq轴方程里那些“说不清道不明”的部分整体打包成一个时变项F,用电流电压的实时数据把它在线估出来,再在这个“超局部模型”上做预测控制,这就是基于数据驱动的无模型预测电流控制(MFPC)。这篇文章不绕弯子,直接把MFPC的原理推导、落地踩坑、以及我实际用过的几种改进方案都摊开讲,希望能给正在折腾PMSM电流环的朋友省点试错时间。

1. 传统MPC的模型依赖之痛:参数失配为什么这么致命

1.1 模型预测电流控制为什么“怕参数”

常规的有限集模型预测电流控制,核心就是拿dq轴电流方程做一步预测,再枚举逆变器的电压矢量。预测方程长这样:

i_d(k+1) = i_d(k) + T_s/L_d * (u_d - R_s*i_d + ω_e*L_q*i_q) i_q(k+1) = i_q(k) + T_s/L_q * (u_q - R_s*i_q - ω_e*L_d*i_d - ω_e*ψ_f)

只要把当前采样到的电流、转速、电压指令代进去,就能算出8个(两电平)或更多个电压矢量对应的下一拍电流,最后选一个让价值函数最小的矢量输出。理论上很美,实际问题全在参数上:L_d、L_q、ψ_f、R_s这些值会随温度、磁饱和、老化而变。尤其是内置式永磁同步电机,L_d和L_q在不同负载电流下差值可能超过20%,标定表再细也不可能覆盖所有工况。

一旦模型里用的电感和实际电机电感差得多了,预测出来下一拍电流就是假的,价值函数选出来的“最优矢量”并不真正最优。结果就是电流纹波变大,严重时出现低频振荡,甚至d轴电流偏置越来越离谱。我在调试某跨平台系统的时候遇到过类似情况:同一个控制程序,仿真用固定电感跑得挺好,换到另一台电机上,额定转速附近直接吹口哨一样的噪声,电流波形像锯齿。最后排查下来就是电感失配太大,预测模型跟实际对象已经脱节了。

1.2 超局部模型:把“不知道的部分”打包成F

后来接触到超局部模型这个概念,思路一下子打开了。超局部模型不追求把电机方程里每一项都建准,而是用一个极简的一阶结构去描述被控对象:

di/dt = F + α*u

这里的F是一个“集总扰动项”,它把反电动势、交叉耦合项、未建模动态、参数误差、逆变器死区、采样延迟等所有不确定因素全部装进去。α是输入增益,不要求非常精确,只要它的大致量级是对的,系统就能正常工作。

为什么叫“超局部”?因为这个模型只在当前采样时刻附近有效,F随着工况变化而在线更新,不需要从全局角度精确建模。换句话说,传统方法是想把电机的“完整地图”画出来,超局部方法只看脚下这一小块路,剩下的全当干扰,实时探测。

对永磁同步电机电流环来说,这个思想特别合适。因为电流环本身响应速度快,采样周期短,在几十微秒到一百微秒的控制周期内,电流动态可以用一阶模型逼近;那些高频或非线性的干扰,反正会被F吸收掉。

1.3 数据驱动为什么在这里成立

你可能要问:F用什么去估?答案就是数据——电流测量值和电压指令值。数据驱动体现在:我不需要知道电机的R_s、L_d、L_q到底是多少,只需要每次控制周期里测到电流变化,再结合上一拍给的电压,反推出F的大小。这样F就自动包含了所有模型误差,而且随着工况变化实时刷新。

这里有一个很重要的认知转变:无模型控制不是“没有模型”,而是“不依赖精确的机理模型”,把模型的负担转移到了在线估计上。只要电流传感器测得到、电压指令发得出,F就能估出来。这也是为什么MFPC在参数鲁棒性上比传统MPCC强一截。

2. MFPC一步步实现:dq方程改写、F估计和矢量选择

2.1 dq轴电流方程如何落到一阶超局部形式

先动笔把PMSM在dq同步旋转坐标系下的定子电压方程写出来:

u_d = R_s*i_d + L_d*di_d/dt - ω_e*L_q*i_q u_q = R_s*i_q + L_q*di_q/dt + ω_e*(L_d*i_d + ψ_f)

把它改写成超局部形式,对d轴和q轴分别有:

di_d/dt = F_d + α_d*u_d di_q/dt = F_q + α_q*u_q

以q轴为例,理论上:

F_q = (-R_s*i_q - ω_e*L_d*i_d - ω_e*ψ_f) / L_q α_q = 1/L_q

但注意,实际实现时根本不需要把F_q的表达式显式写出来。F_q直接用电流测量值和上一拍的u_q估计即可,α_q可以取一个固定近似值,比如用额定电感倒数代替,或者用在线辨识结果。

这里要特别强调:α并不是越精确越好,更不是必须严格等于1/L。它的作用是把控制量u的尺度换算到电流变化率尺度上。只要α的量级大致正确,F就能把剩余误差吸收掉。如果α偏差太大,比如差了一倍,F估计就会出现明显的偏置,预测电流会跟着偏,这时候就需要对α做在线校正了。

2.2 扰动F的在线估计两件套:差分估计+滤波

最简单粗暴的F估计方法就是利用电流差分:

F̂(k) = [i(k) - i(k-1)] / T_s - α*u(k-1)

这个式子物理意义很直接:上一拍实际测得的电流变化率,减去上一拍电压指令造成的贡献,剩下的就是F。看起来没问题,但用过的人都知道,电流采样里带有开关纹波和传感器噪声,直接做差分会把高频噪声放大得一塌糊涂。我一开始在10kHz采样下用这个公式,F̂的波形抖得像心电图,电流预测自然也不稳。

所以工程上要对F̂做后处理。常见做法是加一级低通滤波:

F̂_f(k) = λ*F̂(k) + (1-λ)*F̂_f(k-1)

λ是滤波系数,一般在0.05到0.3之间。λ越小,F越平滑,但相位滞后越大。这里就出现了一个核心权衡:F估计越平滑,预测模型越“钝”,动态响应越慢;F估计越激进,噪声越大,电流纹波越明显。

更进阶的做法是用线性扩张状态观测器(LESO,后面会细讲)或者滑窗代数估计,这些方法在噪声抑制和相位延迟之间平衡得更好。但无论用哪种,F估计的实时性和平滑性都是MFPC落地的核心矛盾。

2.3 一步预测和价值函数

有了F̂,电流预测就很简单了。假设当前时刻是k,采样周期为T_s,则预测下一拍电流:

î(k+1) = i(k) + T_s * (F̂(k) + α*u(k))

对两电平逆变器,有8个电压矢量(含两个零矢量),所以把8个候选u分别代入,得到8个预测电流,再用价值函数打分:

g = |i_d_ref - î_d(k+1)| + |i_q_ref - î_q(k+1)|

也可以加上权重因子,或者考虑开关次数、共模电压等额外项。选g最小的那个矢量,在下一拍输出。这就是“有限集模型预测电流控制”的做法,只不过把原来的显式模型替换成了带F̂的超局部模型。

为了直观,贴一段伪代码:

for v in voltage_vectors: id_p = id[k] + Ts * (Fd_hat[k] + alpha_d * v.d) iq_p = iq[k] + Ts * (Fq_hat[k] + alpha_q * v.q) g = abs(id_ref - id_p) + abs(iq_ref - iq_p) if g < g_min: g_min = g v_best = v

如果不用枚举,也可以走无差拍路线:先算出期望电压u_ref,再用SVPWM调制。那样预测部分就变成了“根据F̂和参考电流反推电压”。两种实现各有千秋,枚举法简单直接,响应快;SVPWM法电流谐波小,但需要额外处理调制延迟。本文讨论的MFPC两种都适用。

2.4 采样和控制周期:到底该怎么选

MFPC对采样周期比较敏感。采样间隔T_s直接出现在差分估计的分母里,T_s太小,差分噪声急剧放大;T_s太大,F的实时性变差,跟不上电流变化。我的经验是:

  • 如果采样周期在100μs(即10kHz)左右,电流环带宽设计在2kHz是合理的;
  • 如果用到20kHz以上的采样,必须配合LESO或滑窗积分来平滑F,否则纯差分会炸;
  • 控制周期可以和采样周期一致,也可以采用“采样两次、控制一次”的策略,给F估计留出窗口。

延时补偿也不能忘。MCU从算出最佳矢量到逆变器真正输出,一般有一个控制周期左右的延迟。也就是说k时刻算出的u(k),要到k+1时刻才生效。所以预测时应该补偿这个拍:

î(k+2) = î(k+1) + T_s * (F̂(k+1) + α*u(k+1))

其中u(k+1)是当前拍即将输出的矢量。很多MFPC实现把这一步漏了,结果动态响应时多一个采样周期的相位滞后,电流环带宽上不去。

3. MFPC上机最容易翻车的三个环节和排查链路

3.1 现象一:电流波形出现周期性毛刺,F估计抖得厉害

这是我第一次把MFPC跑在实验平台上的真实经历。波形上看,电流正弦度还行,但仔细看每个开关周期都有毛刺,FFT分析高频分量很突出。先把F̂_d和F̂_q录出来,发现F̂里掺杂着大量尖峰脉冲,明显是差分+噪声的结果。

排查思路可以按这个顺序来:

  1. 先看原始电流采样,确认传感器本身有没有异常,排除接线问题;
  2. 再关掉MFPC,用开环电压输出,观察同样的电流噪声水平;
  3. 如果噪声依旧,说明F̂的抖动来源是测量噪声而非算法本身;
  4. 给F̂加一阶低通滤波,把截止频率从5kHz降到1kHz左右,再看毛刺是否收敛。

我最后是把差分估计换成LESO,才彻底解决了毛刺问题。纯低通滤波其实也能压住,但会带来相位滞后,动态响应变差,属于“治标不治本”。

3.2 现象二:低速/零速时F估计漂移,dq轴电流偏置

低速工况下,传统MPCC里的反电动势项变小,整个模型接近纯电阻+电感,但逆变器死区、管压降这些非线性因素占的比重就上来了。F估计如果只是简单差分,死区造成的误差会以一个低频偏置的形式出现在F̂里,导致dq轴电流出现静差,严重时甚至引起低速正反转切换时的电流冲击。

排查这类问题,我建议录一下零速下的F̂_d和F̂_q,看看是不是存在明显的直流偏置。如果有,可以在估计器里增加一个“扰动偏置学习项”,对F̂做长时间常数积分补偿。本质上就是把低频偏置和高频扰动分开处理:高频部分靠滤波平滑,低频部分靠积分消除。

3.3 现象三:启动阶段α不对导致振荡

α是超局部模型里少数几个需要“给定”的参数。如果α给得偏大,意味着同样的电压指令会让预测电流变化得更多,控制器会变得过度激进,电压矢量频繁跳变;α偏小则补偿不足,稳态电流误差大。

调试时可以通过一个简单的阶跃测试判断α是否合适:在额定电流附近给定一个阶跃,观察电流响应如果出现持续的振荡,大概率是α偏大;如果响应很慢且静差大,大概率是α偏小。比较稳妥的做法是给α设置一个上下限,并采用在线辨识方法(见4.3)让算法自己校准,这样上电标定的压力会小很多。

4. 我实际采用的三种MFPC改进方案

4.1 改进一:用线性扩张状态观测器替代纯差分估计

之所以把这项改进放在第一个,是因为它带来的收益最明显。LESO把F当作扩张状态,通过观测器误差反馈来同时估计电流和F。观测器方程如下:

de/dt = i - î dî/dt = F̂ + α*u + β1*e dF̂/dt = β2*e

β1、β2是观测器增益,工程上常按观测器带宽ω_o来整定:

β1 = 2*ω_o β2 = ω_o^2

为什么不直接差分?因为LESO里的β1起到了一个“带通”的作用,它既不会像纯积分器那样响应太慢,也不会像差分那样放大高频。带宽整定到开关频率的1/5左右,F̂的波形明显平滑,而且相位滞后比低通滤波小得多。

我在某高性能伺服项目上做过对比:同样的MFPC框架,把差分估计换成LESO之后,稳态电流纹波至少下降了30%,动态阶跃时间基本没变。LESO的唯一缺点是参数β1、β2需要整定,但比传统MPCC里的电感参数好整多了,因为它只跟带宽有关,不依赖电机参数。

4.2 改进二:双采样点滑动窗口代数估计

单纯差分估计只用了相邻两个采样点,对高频噪声特别敏感。我用的第二个改进是滑动窗口代数估计:不再用i(k)-i(k-1),而是取相隔N个采样周期的两个点做差值,同时用窗口内N个电压指令的平均值作为u。

F̂(k) = [i(k) - i(k-N)] / (N*T_s) - α * mean(u(k-N), ..., u(k-1))

这个做法的好处是等效于一个N点移动平均滤波器,高频开关纹波会被明显抑制,而直流和低频分量基本保留。N一般取4到8,太小没效果,太大会引入相位滞后。配合延时补偿,可以把窗口引入的延迟通过预测模型修正掉。

实测下来,N=4时电流THD比纯差分降低了约12%,电流波形更干净,F̂的抖动大幅减少。如果觉得窗口估计还不够平滑,可以再级联一个一阶滤波器,但注意总延迟要控制在半个采样周期以内。

4.3 改进三:输入增益α的在线辨识

前面一直强调α不需要很精确,但如果项目要求在不同电机之间快速切换,或者驱动器要适配多种电机型号,α的在线辨识就很有价值。做法很简单:把超局部模型写成最小二乘的形式:

Δi(k) = F(k)*T_s + α*T_s*u(k-1)

这里Δi(k) = i(k) - i(k-N) 是实测电流变化量,F(k)和α都是待估的。问题在于F和α同时出现在方程里,直接辨识会有耦合。常用的解法是把F先当作已知的(用上一拍的F̂),然后用RLS更新α,或者做增广状态辨识。我们在项目里采用了一个简化的做法:

  • 在电流环空闲或稳态时,用低通滤波后的F̂和Δi计算α的修正量;
  • 限制α的变化率,避免电压突变导致α抖动;
  • 把α的上限和下限约束在初始标定值的±20%范围内。

这样既保留了超局部模型“少参数依赖”的优势,又不会因为α错误导致系统崩溃。辨识收敛之后,即使换一台电机,启动阶段也能很快调整过来。

5. 仿真和台架验证:参数失配、转速阶跃和负载突变

5.1 仿真模型如何搭才能体现MFPC优势

很多朋友用仿真验证MFPC时,最容易犯的错误就是“模型和控制器用的同一套参数”,这根本暴露不出无模型控制的优势。正确的做法是搭建两套电机模型:

  • 一套是“真实电机模型”,里面的L_d、L_q、ψ_f、R_s会被故意修改,模拟温度漂移或电感饱和效应;
  • 一套是MFPC内部的预测模型,根本不写真实参数,全靠F̂估计。

对比对象我建议选两种:一种是参数完全匹配的传统MPCC,另一种是参数失配的传统MPCC。这样才能看出MFPC在失配下的优势有多大。

我搭仿真时常用这些指标:

指标含义
稳态电流纹波q轴电流峰峰值/额定电流
电流THD电流FFT谐波总畸变率
阶跃响应时间电流从额定10%到90%的时间
参数失配静差实际电流与给定值的平均误差

5.2 改进后的MFPC在失配和突变下的表现

抛开具体绝对值,我把自己仿真里得到的相对趋势说一下。在电感值标定偏差50%、磁链偏差20%的条件下:

  • 传统MPCC的q轴电流静差大约在额定电流的3%-5%,且在高速区出现明显振荡;
  • 基础MFPC(差分估计+低通滤波)静态误差几乎为零,但动态响应时会有一个小的超调;
  • 改成LESO-MFPC之后,超调明显减小,且稳态电流纹波比差分MFPC低约15%-20%;
  • 转速从500rpm阶跃到1500rpm时,基础MFPC的电流响应比传统MPCC快约10%,但q轴电流超调大一些;LESO-MFPC在几乎不损失响应速度的前提下把超调压了回去。

负载突变(比如额定转矩突加)的场景下,MFPC因为有F̂实时补偿,转速跌落比参数失配的传统MPCC明显更小。这个不难理解:负载引起的电流变化会被F̂迅速捕获,下一拍就补偿到电压指令里。

5.3 台架验证的注意事项

仿真没问题不代表台架能直接跑。我自己的实验经验有几点值得提醒:

  1. 电流采样同步一定要做好。如果采样点没有固定在PWM载波波谷,开关噪声直接被差分估计吸收,F̂会带严重的周期扰动;
  2. 死区补偿可以先关掉,让MFPC自己去补偿死区。你会发现F̂里会出现一个与电流极性相关的偏置,恰恰说明F在发挥作用;
  3. ADC滤波不能做得太重,否则电流高频信息被抹掉,F估计的相位滞后变得不可控;
  4. 不要直接使用“逆变器实际输出电压”作为u,除非加了精确的电压重构。一般用指令电压即可,因为电压误差会被F吸收。

我踩过的一个坑是:一开始想精细补偿逆变器非线性,给u叠加了一个死区补偿量,结果F̂里本来已经吸收的非线性又被“二次补偿”了,反而出现奇怪的振荡。后来干脆不补偿,纯靠F̂自适应,效果反而更稳。

6. 超局部无模型控制还能往哪儿延展

6.1 速度环和位置环的超局部化

MFPC的思路不只局限在电流环。电机机械方程同样可以写成:

dω/dt = F_ω + α_ω*T_e

其中F_ω包含负载转矩、摩擦、惯量变化等。把速度环也改成超局部模型+预测控制,就是无模型速度控制。电流环用MFPC、速度环用超局部思想,整个系统架构就完全摆脱了电机参数标定,真正做到“插上电就能转”。

我见到有些项目已经把速度环的超局部控制和位置环的重复控制结合起来,用于高精度伺服定位。在低速重载工况下,效果比传统PI+前馈好很多,尤其是负载突变时,速度跌落恢复时间能缩短一半。

6.2 与参数辨识和自适应控制融合

有些人觉得无模型控制是“抛弃所有模型”,其实不是。更好的姿态是把超局部模型当成一个“误差吸收层”,底下再配合在线参数辨识。比如用RLS长期跟踪电机的电感和磁链,用来更新α的默认值;F̂只负责吸收高频扰动和残余误差。这样即使α辨识还没收敛,F̂也能保证系统不失控,安全性大大提升。

这种“双通道”设计在工业驱动器里是很有工程价值的:一层保证鲁棒性,一层提升性能。两者互相配合,而不是互相替代。

6.3 与其他选择策略结合:双矢量、三矢量、模型预测磁链

基础MFPC的价值函数只选一个电压矢量,稳态性能会受限于开关频率。想进一步提升,可以沿用双矢量或三矢量MPC的思路:在超局部模型预测的基础上,把一个控制周期拆成两段或三段,用两个/三个矢量合成输出。因为F̂已经把参数误差和扰动都补偿掉了,多矢量合成可以更专注于减小电流纹波。

也可以把超局部模型用到“模型预测磁链控制”里,把电流和磁链统一在超局部框架下描述。这类扩展在需要快速动态响应的场合很有前景,尤其适合用DSP或FPGA实现。

最后聊一点个人感受:MFPC这套东西,乍一看像是“偷懒”,把难题都丢给F去扛,但真正做进去才发现,难点从“建模”转移到了“估计”上。估计器好不好,直接决定了系统性能上限。如果能把F估得又快又准,再配合合适的改进方案,MFPC在抗参数扰动、适应多机型方面的优势会非常明显。做电机控制这几年,我越来越觉得,与其在参数表里挣扎,不如让算法自己去适应每一天的温度漂移和负载变化——超局部无模型控制就是这么一条值得走的路。

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

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

立即咨询