前阵子做PMSM控制仿真时碰到一个特别常见的现象:同一台电机、同一套PI参数,单矢量模型预测控制跑出来的电流波形毛刺很重,转矩脉动明显,开关频率还像心电图一样跳来跳去;换成三矢量策略之后,电流波形干净得几乎能直接拿去和SVPWM对比。很多人第一反应是“电流环没调好”,其实问题往往不在PI,也不在预测模型,而在于你在一个控制周期里塞了几个电压矢量。
这篇文章我想把一套基于Simulink的永磁同步电机模型预测控制仿真模型拆开讲透。模型里面同时实现了单矢量、占空比、双矢量和三矢量四种策略,互相之间可以通过一个选择开关切换,方便在不同工况下对比。适合刚入坑有限集模型预测控制、想快速把仿真跑起来,又被各种矢量组合和占空比公式绕晕的读者。你不需要把MPC的所有理论都吃透,只要跟着这篇内容把模型架构、离散方程、算法流程和几个关键坑搞明白,就能照着搭出自己的版本。
1. 单矢量MPC的“病根”:一个周期只给一个电压矢量
1.1 有限集模型预测控制的基本流程
先回顾一下单矢量有限集MPC在PMSM上的做法。核心思路不复杂:因为两电平逆变器一共只有8个开关状态(6个有效矢量加2个零矢量),所以每个控制周期把这8个状态全部枚举一遍,利用电机的离散预测模型算出下一时刻的定子电流,再用评价函数挑出最接近参考值的那一个,最后把对应的开关信号直接送给逆变器。
这个流程在Simulink里实现时,通常会写成三段式:采样当前时刻的id、iq、电角速度、转子位置;在MATLAB Function里完成8次电流预测和评价函数比较;输出最优开关状态。评价函数最基础的形式就是电流误差平方和:
J = (id_ref - id(k+1))² + (iq_ref - iq(k+1))²
这里id_ref一般给0,iq_ref来自转速外环PI的输出。如果你对开关频率有额外要求,可以在J后面加一个开关动作惩罚项,但这会让电流跟踪性能打折扣。这部分后面再细说。
1.2 纹波从哪里来,开关频率为什么乱跳
单矢量MPC的问题恰恰出在“一个周期只准用一个矢量”这个设定上。两电平逆变器能提供的6个有效矢量在空间上相隔60度,幅值只由母线电压决定,方向只有6个固定位置。你想让电流往某个方向走,但手头只有这些固定方向的电压矢量可用,于是每周期只能在“靠近目标”的矢量里选一个,误差只能等下一周期再修正。
这个离散逼近的过程就是电流纹波的来源。更麻烦的是,当参考电压幅值比较小、或者工况接近稳态时,最优矢量经常在有效矢量和零矢量之间来回切换,甚至两个有效矢量之间来回跳动,导致开关频率不固定且普遍偏高。你可以把它理解成开车只在“全油门”和“松油门”两个状态之间切换,想保持匀速就只能靠频繁点刹,体感和油耗自然都很差。
1.3 为什么要往多矢量方向走
既然固定方向、固定幅值的单个矢量不够用,很自然的思路就是在一个控制周期里用多个矢量合成一个更接近参考电压的等效矢量。这就是占空比、双矢量、三矢量策略的共同出发点。
用生活化一点的说法:单矢量MPC是在8个固定档位里硬选一个,占空比策略则是在选中最优档位后,再决定这个档位踩多久、怠速多久;双矢量和三矢量更进一步,把两个档位和怠速组合起来,相当于你可以在周期内先挂一档再挂二档,逼近能力自然强得多。这也是标题里那几种策略的演进逻辑。
2. 单矢量、占空比、双矢量、三矢量到底差在哪
2.1 先厘清一个容易混淆的名词
在MPC文献里,占空比和双矢量这两个词经常被混着用。有些文章把“一个有效矢量加一个零矢量”就叫双矢量MPC,因为一个周期里确实用了两个矢量。但按标题的分法,占空比和双矢量是分开的,我这里沿用一条比较常见的技术路线:占空比策略特指单有效矢量配合零矢量的调幅方式;双矢量策略指两个有效矢量在周期内按一定时间比例分配;三矢量策略则是在双有效矢量的基础上再叠加一个零矢量。
先把这个边界说清楚,后面看文献不容易晕。
2.2 占空比策略:在有效矢量后面补一个零矢量
占空比MPC的想法很直接,既然单个有效矢量在稳态时容易过头,那就让它只作用d·Ts的时间,剩下的(1-d)·Ts交给零矢量。这里d就是占空比。电压矢量作用时间变短,等效电压幅值就小了,电流纹波会显著下降,波形也会更接近PWM调制的结果。
关键问题是怎么确定d。常见做法是以“q轴电流无差拍”为目标反推,也就是让一个周期结束时的iq值正好等于参考值。因为PMSM的电磁转矩正比于iq,把q轴电流管住了,转矩脉动自然就小了。具体的推导我放在第4章,这里先记住一个结论:占空比d不是拍脑袋定的,而是由最优有效矢量作用下和零矢量作用下的q轴电流变化率联合决定的。
2.3 双矢量策略:用两个有效矢量同时调幅值和调方向
占空比策略解决的是幅值问题,但方向问题依然存在。你只能在整个周期里用同一个有效矢量,它的方向是固定的。双矢量MPC的做法是把两个有效矢量都放进一个周期,各自作用一段时间,通过时间比例的分配合成出介于两者方向之间的任意电压矢量。
两个有效矢量选谁、作用时间怎么分,是双矢量策略的核心。最常见也最稳的做法是枚举两个有效矢量的组合,用评价函数或者伏秒平衡去确定各自的作用时间。由于两个矢量方向不同,合成矢量的方向可以在两者夹角内自由变化,相当于让固定开关表的离散输出变得连续了。
2.4 三矢量策略:完整复刻SVPWM的伏秒思想
三矢量MPC在一个周期里安排两个相邻有效矢量加一个零矢量。三个矢量的作用时间由伏秒平衡方程解析求解,本质思想已经非常接近SVPWM:用两个相邻有效矢量合成任意方向的参考电压,用零矢量补足剩余时间。
区别在于,SVPWM的参考电压来自外环控制器和PI的输出,而多矢量MPC是在电流预测模型基础上,反推出一个“为了在一个周期内达到参考电流所需合成的参考电压矢量”,再利用伏秒平衡去分配时间。换句话说,三矢量MPC既保留了FCS-MPC的预测和评价浮选优势,又把电压合成能力向SVPWM看齐,所以稳态波形通常是最好的。
2.5 四种策略的横向对比
我把四种策略的关键差异整理成了一张表,方便对照:
| 策略 | 周期内矢量构成 | 电压合成能力 | 开关频率特性 | 稳态电流/转矩质量 | 计算量 |
|---|---|---|---|---|---|
| 单矢量 | 1个有效或零矢量 | 弱,方向和幅值都受限 | 不固定,偏高 | 较差,纹波明显 | 低 |
| 占空比 | 1个有效矢量和1个零矢量 | 中等,只调幅值 | 固定 | 明显改善 | 低 |
| 双矢量 | 2个有效矢量 | 较强,可调方向 | 固定 | 较好 | 中 |
| 三矢量 | 2个有效矢量加1个零矢量 | 强,接近SVPWM | 固定 | 最好 | 中偏高 |
需要提醒的是,这里的“最好”是有条件的。三矢量的优势在电流稳态质量和转矩脉动上非常突出,但代价是算法复杂度和矢量组合枚举量都在上升。如果你的应用对开关频率限制严格,或者处理器算力比较紧张,占空比策略往往是性价比最高的选择。
3. Simulink整体架构与PMSM离散模型的搭建
3.1 顶层模型有哪些模块
这套仿真模型在Simulink里的整体架构可以拆成四个大块:主电路与电机本体、采样与坐标变换、控制算法、转速外环和信号发波。单矢量策略直接输出开关信号给三相桥臂;占空比、双矢量和三矢量策略因为要在周期内分配多个矢量的作用时间,需要额外生成PWM脉冲,通常通过调制波和三角载波比较输出。
顶层信号线建议这样组织:PMSM模块输出转子角度θe、电角速度we、三相定子电流ia/ib/ic;三相电流经过Clark变换到αβ轴,再经过Park变换到dq轴,作为MPC算法块的输入;转速外环PI输出iq_ref并做限幅;MPC算法块根据策略选择输出开关组合和对应的作用时间,最终经过发波逻辑得到6路IGBT门极信号。
3.2 dq轴电压方程的离散化
MPC的核心是一个足够准确的离散预测模型。PMSM在dq旋转坐标系下的定子电压方程为:
ud = R·id + Ld·(d id/dt) - ωe·Lq·iq
uq = R·iq + Lq·(d iq/dt) + ωe·(Ld·id + ψf)
对上式做前向欧拉离散,得到:
id(k+1) = id(k) + Ts·(ud(k) - R·id(k) + ωe·Lq·iq(k)) / Ld
iq(k+1) = iq(k) + Ts·(uq(k) - R·iq(k) - ωe·(Ld·id(k) + ψf)) / Lq
这里Ts是控制周期,Ld、Lq是d、q轴电感,ψf是永磁磁链,R是定子电阻。公式里带coupling项和反电动势项,很多初学朋友跑发散,多半是这里某个正负号写反了。比如第一式里加?那项,如果符号错了会直接影响预测结果,尤其在高速段。
我在Simulink里一般直接用一个MATLAB Function接收id、iq、we、theta和当前的电压矢量分量ud、uq,在函数内部完成上述两步预测。你也可以把预测方程用多个Simulink基本算子搭出来,但那样模块连线会非常乱,调试也不方便,还是推荐用函数块实现。
3.3 一拍延时补偿与执行时序
真实数字控制器存在一个天然的执行延迟:这一周期算出来的最优矢量,最早也要下一周期才能上桥臂,如果在仿真里不加这个“一拍延时”,预测超前于实际,结果往往比实验要乐观,导致真的会上板时效果变差。
在Simulink里模拟这个时序很简单,用Unit Delay把MPC块输出的最优开关状态或作用时间往后拖一个Ts再送给逆变器。同时在MPC函数内部做两步预测:先根据上一周期实际施加的矢量预测当前时刻电流,再在当前时刻电流的基础上遍历所有候选矢量预测下一时刻电流。这样计算当前周期的最优矢量时,预测起点和实际情况是对齐的。
一个容易忽略的点是采样时刻的同步。如果用了PWM发波,电流采样最好放在三角载波的谷底或顶点,这样采样到的电流最能代表一个周期的平均电流,预测也更准确。仿真里同步触发可以用脉冲信号控制采样子系统,别把采样和控制割裂开。
4. 算法实现细节:从8次枚举到伏秒平衡
4.1 单矢量的MATLAB Function核心逻辑
单矢量策略的算法实现最有代表性,代码逻辑直接对应教材上经典的FCS-MPC流程。我贴一段简化但可以直接跑的MATLAB Function骨架:
function [sa, sb, sc] = mpc_sv(id_ref, iq_ref, id, iq, we, theta, Ts, pm) % pm为结构体,包含R、Ld、Lq、psi_f、Vdc Ld = pm.Ld; Lq = pm.Lq; R = pm.R; psi_f = pm.psi_f; Vdc = pm.Vdc; % 8个基本电压矢量的alpha/beta分量 s_list = [0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 1 1; 0 0 1; 1 0 1; 1 1 1]; Valpha = zeros(8, 1); Vbeta = zeros(8, 1); for i = 1:8 ua = (s_list(i,1) - 0.5); ub = (s_list(i,2) - 0.5); uc = (s_list(i,3) - 0.5); Valpha(i) = Vdc * (2*ua - ub - uc) / 3; Vbeta(i) = Vdc * (ub - uc) / sqrt(3); end % 枚举预测 + 评价函数筛选 cost_min = inf; for i = 1:8 % alpha/beta到dq ud = Valpha(i)*cos(theta) + Vbeta(i)*sin(theta); uq = -Valpha(i)*sin(theta) + Vbeta(i)*cos(theta); % 两步预测中的第二拍,id、iq已是一拍延时补偿后的预测值 id_next = id + Ts*(ud - R*id + we*Lq*iq)/Ld; iq_next = iq + Ts*(uq - R*iq - we*(Ld*id + psi_f))/Lq; cost = (id_ref - id_next)^2 + (iq_ref - iq_next)^2; if cost < cost_min cost_min = cost; best = i; end end sa = s_list(best,1); sb = s_list(best,2); sc = s_list(best,3);这里有两个容易踩的雷。一是Park变换的正方向:如果电机模型的转子角度定义和代码里Park矩阵方向不一致,电流波形会出现周期性的尖刺。二是零矢量的问题,两个零矢量V0和V7切换会产生冗余开关状态,如果你后面要统计开关频率,注意设置为不许零矢量内部切换或按最小开关次数原则选一个。
4.2 占空比策略的q轴无差拍推导
占空比MPC实现时,先按单矢量的方法选出最优有效矢量,然后在一个周期内把它和零矢量组合起来。占空比d的计算逻辑基于q轴电流无差拍。定义两个电流变化率,即有效矢量和零矢量作用时的q轴电流斜率:
s_q(u) = [uq(u) - R·iq(k) - ωe·(Ld·id(k) + ψf)] / Lq
零矢量作用时uq为0,所以:
s_q(0) = [-R·iq(k) - ωe·(Ld·id(k) + ψf)] / Lq
一个周期结束后:
iq(k+1) = iq(k) + d·Ts·s_q(u_opt) + (1-d)·Ts·s_q(0)
令iq(k+1)等于iq_ref,解出:
d = [iq_ref - iq(k) - Ts·s_q(0)] / [Ts·(s_q(u_opt) - s_q(0))]
算出来之后必须限幅到0到1之间。如果d超过1,说明这个周期的参考电流变化太快,单个有效矢量全力作用也追不上,那就只能全周期都作用有效矢量;如果d小于0,说明反方向偏了,直接全周期用零矢量更合适。限幅逻辑虽然简单,但少了它,模型在启动和突加负载阶段很容易发散或抖动。
4.3 双矢量和三矢量策略的作用时间分配
双矢量和三矢量的作用时间分配,我建议用伏秒平衡的思路做,而不是无脑枚举几个候选时间点。先由电流方程反解出参考电压矢量:
ud_ref = R·id(k) - ωe·Lq·iq(k) + Ld·(id_ref - id(k)) / Ts
uq_ref = R·iq(k) + ωe·(Ld·id(k) + ψf) + Lq·(iq_ref - iq(k)) / Ts
再把ud_ref、uq_ref反变换回alpha/beta坐标系。之后选中两个相邻有效矢量V1、V2,解下面的线性方程组:
[V1_alpha V2_alpha] [d1] [Ualpha_ref]
[V1_beta V2_beta ] [d2] = [Ubeta_ref]
得到d1、d2后,零矢量占空比d0 = 1 - d1 - d2。如果算出来d0小于0,说明参考电压已经超出了两个有效矢量能合成的范围,需要按比例把d1、d2缩放,让d1+d2等于1强行限幅,否则会出现负作用时间。Simulink里这段逻辑用一个MATLAB Function就能完成,V1、V2的alpha/beta分量直接用查表或者根据扇区实时计算。
对于双矢量策略,可以选择不额外分配零矢量,让d1+d2=1。至于两个有效矢量怎么选,最简单的做法是枚举所有有效矢量两两组合,重复执行预测和评价,选择代价最小的组合;想省算力就在当前扇区内取相邻的两个。我实测下来,相邻组合在稳态性能上已经能保证不错的水平,两两全枚举提升有限但算力几乎翻倍,不太划算。
4.4 我在模拟项目X中的参数设置
为了后面讲的仿真结果有意义,我把搭建模型时用的一组典型参数列出来,这套参数在表贴式PMSM仿真里很常见,你可以直接套用:直流母线电压300V;定子电阻0.958Ω;Ld和Lq都取0.00525H;永磁磁链0.1827Wb;极对数4;额定转速1500rpm;控制周期Ts取100μs;仿真步长固定为10μs。负载转矩按额定值10N·m设置。
之所以强调仿真步长,是因为固定步长仿真里,仿真步长必须比控制周期小一个数量级以上,否则逆变器和PWM发波的细节反映不出来,预测模型和实际模型之间会出现莫名其妙的偏差。很多模型跑起来波形发散、电流畸变,第一反应是算法有问题,先检查步长往往能省下大量调试时间。
5. 仿真结果对比与调参避坑经验
5.1 同一工况下四个策略的波形与指标
在转速1500rpm、负载10N·m的工况下,我在同一套模型里依次切换四种策略,对比了几个关键指标。
单矢量策略的稳态电流波形有明显的锯齿状纹波,dq轴电流在参考值附近频繁穿越,电磁转矩脉动峰值大约能到3N·m以上,开关频率在几千赫兹范围内剧烈跳动。FFT分析谐波分布很宽,电流THD通常在14%左右。
切到占空比策略后,电流纹波肉眼可见地变小,转矩脉动峰值减小到1.5N·m左右,THD降到7%上下。波形开始有PWM调制的感觉,开关频率变成固定值。
双矢量策略的THD进一步降到6%左右,转矩脉动更小,但波形在低速轻载时的改善幅度没有预期的那么大,可能和矢量组合的选择方式有关。我用的是相邻有效矢量组合加零矢量的结构,方向和幅值的综合表现已经不错。
三矢量策略的稳态质量是最好的,电流正弦度很高,THD能压到5%以下,转矩脉动降到0.6N·m附近,波形直观感受和SVPWM非常接近。启动阶段三矢量策略的电流冲击也更平缓,这是因为周期内电压合成能力比单矢量强得多,不容易出现单矢量那种剧烈切换。
5.2 权重因子、采样周期、母线电压的调参心得
先说权重因子。如果你在评价函数里加了开关惩罚项lambda,要记住lambda的调法是从0开始逐步加大。lambda太小,开关频率没有约束效果;lambda太大,电流跟踪性能会变差,转矩脉动反而上来了。我在项目中常用的做法是固定工况,把lambda按0、0.1、0.5、1、2、5扫一遍,同时记录THD和平均开关频率的曲线,在两者之间找一个平衡点。大多数情况下lambda在0.5到2之间已经够用。
采样周期决定了预测的灵敏度和开关频率上限。Ts取100μs在实验室级PMSM仿真里很常规,但如果你要逼近实际控制器对算力的限制,可以试试把Ts放宽到200μs甚至500μs,这时候占空比策略的稳定性优势会体现得非常明显,单矢量策略则可能出现更严重的电流毛刺。母线电压对MPC的影响也很直接,电压越高,有效矢量幅值越大,占空比和伏秒平衡的调节余地就越大,但死区效应和开关应力也会随之上升。
还有一点容易被忽略:id_ref不要一直给0。表贴式PMSM用id=0控制没问题,但内置式PMSM存在磁阻转矩,转矩公式里有一项和Ld减Lq之差相关,id=0并不是最大转矩电流比工作点。你在仿真里用内置式参数时,要么给一个MTPA计算模块,要么至少意识到这里会对效率产生影响。
5.3 实测最容易翻车的几个工程细节
第一个坑是坐标变换和转子角度的方向匹配。Simulink里PMSM模块的转子角度默认是电角度,但在不同版本里输出角度定义和Park变换的正负方向会有差异。我遇到过模型前一步还是好的,改了电机模块版本后d轴电流出现奇怪震荡的情况,最后就是对角度加了符号修正。
第二个坑是PWM发波时序。单矢量策略没有PWM载波,直接给门极逻辑没问题。但占空比、双矢量、三矢量策略需要把计算出的作用时间转换成实际门极脉冲,这时必须让三角载波的周期和控制周期严格一致。如果载波周期是Ts的一半,或者用了对称三角波但采样时刻不对,发波出来的脉冲宽度会和代码里计算的时间对不上,仿真结果会变得很诡异。
第三个坑是限幅处理。前面提到的三矢量d1+d2超过1、占空比d超过1或小于0,都需要做限幅或缩放。很多读者只写了计算式,忘了写限幅,结果模型在中高速工况下莫名其妙地发散。限幅不是可选项,是必须做的工程处理。
第四个坑是看仿真结果时容易忽视延时补偿的影响。如果你关掉Unit Delay直接比较四套策略的波形,会看到三矢量的THD甚至比单矢量还差,因为预测起点超前一拍导致最优矢量选偏了。这属于仿真和实验差异的主要来源之一,排查顺序应该是先确认延时是否加上,再讨论算法差异。
5.4 什么时候选哪个策略
最后说说选型。如果只是做原理验证,或者处理器算力非常有限,建议先用单矢量跑通闭环,再把占空比策略加上,改动量很小,换来的是稳态波形质量明显提升。如果项目对电流正弦度和转矩脉动要求比较高,比如伺服或者电驱动系统,三矢量策略基本是最稳的选择。双矢量处在两者之间,可以作为折中方案,尤其在你觉得三矢量计算量偏大但占空比又不够好的时候。
根据我个人的使用习惯,调试顺序应该是先搭好单矢量闭环,再改占空比验证d的计算逻辑,最后再上三矢量的伏秒平衡。这样每步引入的变量是单一的,出问题容易定位,不会出现四套策略一起跑、波形乱成一团还不知道是哪里写错的情况。这套模型搭下来之后,我最大的体会是:单矢量MPC的代码量最小,但实现工程化控制时需要考虑的细节一点都不少;真正让波形发生质变的,往往不是更复杂的评价函数,而是多给电压合成留了一点“自由度”。