做电机驱动这些年,我对两件事一直很敏感:一是重载工况下电机传来的高频电流啸叫,二是拆开电机后轴承滚道上密密麻麻的麻点。前者多半来自开关谐波的离散频谱,后者则和共模电压脱不开干系。永磁同步电机的模型预测控制(MPC)这两年热度很高,靠的是“直接根据模型预测未来状态、逐个枚举开关状态选最优解”的思路,动态响应快、约束处理灵活,可惜常规有限集MPC天生带着两个毛病——开关频率不规律导致谐波频谱难看,候选矢量里又默认包含后果严重的零矢量,于是共模电压偏高。把随机开关频率和低共模电压矢量融合进同一个MPC框架,这个话题我前前后后折腾了大半年,踩过的坑比收获的经验还多,趁今天把原理、设计、仿真和实验里的门道一次讲透。如果你正在做电机控制器、变频器,或者纠结要不要把MPC搬进量产项目,这篇内容值得看完。
1. 两个孤立痛点,为什么非要绑进同一个MPC
1.1 常规FCS-MPC:动态性能确实好,代价也实在
模型预测控制的基本思路很直接:把逆变器所有可能的开关状态列出来,用电机数学模型挨个“预演”下一个采样时刻的电流,再通过代价函数挑选结果最优的那个状态,接下来的一个控制周期就按它来。两电平逆变器一共8个开关状态,就算全部枚举,计算量也比解算一个连续最优控制问题小太多了,所以它最大的卖点就是概念简单、动态响应快、多目标和约束都好处理。
但这里有个隐含的坏消息:一个控制周期只作用一个开关状态,没有载波调制去不断“打磨”输出电压,电流纹波天然偏大;更麻烦的是开关状态每个周期都在变,开关频率不是设计值,而是由代价函数和当前工况共同“碰”出来的。稳态运行时不时切换拓扑,谐波频谱因此变成一堆位置不固定的离散尖峰。你在机房里听到那种高频“滋滋”声,很多情况下就是这些东西在作祟。这里插一句,我见过不少刚接触MPC的朋友一上来就说“这个方案完美”,实际上拿功率分析仪测一下相电流THD,会发现它比经过精心整定的SVPWM差一截。
1.2 共模电压不是玄学,是轴承电蚀的元凶
共模电压指的是三相输出对公共参考点的电压成分,注意这里的重点是“共有”而不是“差模”。两电平逆变器里,同一时刻三个桥臂的导通状态决定了共模电压大小:零矢量(000或111)时三相桥臂同进同出,共模电压会冲到母线电压的一半;而六个有效矢量造成的共模电压最多也只有母线电压的六分之一。
这个差别不是静态常数,而是一连串高速跳变的脉冲,每一次跳变都会通过电机绕组对地电容、轴承内外滚道之间的寄生电容,形成共模电流。共模电流的终点往往就是轴承:微小电弧反复击穿润滑油膜,长期运行下来,滚道表面就会出现电蚀麻点,这也是很多电机异响、振动增大的隐藏原因。同时,线缆和机壳构成的回路会向周围辐射电磁骚扰,EMC测试里常见的超限频段,很多就是共模回路贡献的。所以在MPC的候选矢量里引入“低共模电压”约束,本质上是把可靠性和电磁兼容问题前置到算法层面,而不是等样机出来后到处贴磁环、加共模电感去补救。
1.3 随机开关频率的真正靶点:把频谱打散
随机开关频率,很多人误解成“让开关频率不固定,损耗就小了”,其实不完全是。固定开关频率下,谐波能量高度集中在该频率以及整数倍附近,呈一根根尖刺。人耳和EMI接收机对这些尖峰最敏感,所以主观听感刺耳,测试也容易在某几个频点超限。随机开关频率的思路恰恰相反:让每个控制周期在均值附近随机抖动,把原本集中的能量铺开放到更宽的频带里。能量总量并没有凭空消失,但尖峰高度显著下降,频谱包络变得平缓,听感从尖哨声变成类似白噪声的背景声。
这个思路一旦移植到MPC里,影响的是整个时间尺度:控制周期本身就是MPC的预测步长和执行步长,周期一随机,预测公式里的离散化步长也在变,这件事不做对,后面全是坑。回头再看这个标题,随机开关频率管的是“时间域”,低共模电压矢量管的是“空间域”,一个是把周期性激励打散,一个是从源头上掐掉高共模状态的产生。两者天然需要在同一个控制器里共享候选集、预测模型和执行时序,这也是我为什么说把它们“融合”不是标题党的组合,而是确实绕不开同一个框架。
2. 机理拆解:零矢量出局之后,随机周期怎么落地
2.1 一张表看懂两电平逆变器的共模电压分布
先把硬件事实摆出来。忽略器件压降,以直流母线中点为参考点,三相输出相对该点的电位要么是+Vdc/2,要么是-Vdc/2。那么8个开关状态的共模电压可以算得非常清楚,我做了一张现成的表:
| 开关状态 | 矢量 | 共模电压(相对母线中点) | 是否选入低共模候选集 |
|---|---|---|---|
| 000 | V0 | -Vdc/2 | 剔除 |
| 111 | V7 | +Vdc/2 | 剔除 |
| 100 | V1 | -Vdc/6 | 保留 |
| 110 | V2 | +Vdc/6 | 保留 |
| 010 | V3 | -Vdc/6 | 保留 |
| 011 | V4 | +Vdc/6 | 保留 |
| 001 | V5 | -Vdc/6 | 保留 |
| 101 | V6 | +Vdc/6 | 保留 |
这个表非常好用,它直接说明了为什么“低共模电压矢量”策略的第一步就是剔掉V0和V7。只要候选集里还留着零矢量,优化器在某个特定位点一定会贪婪地选它,因为零矢量能让平均输出电压变得很“小巧”,代价函数看着很舒服。可一旦选上,共模电压峰值就直接跳到母线电压的一半。
剔掉零矢量之后,单周期单矢量方案迎来了新问题:一个有效矢量作用整个周期,平均电压的最小步长下不来。低速轻载时,需要很小的输出电压,可单个有效矢量在一整个周期里积出来的电流变化量偏大,于是代价函数只能在相邻有效矢量之间反复横跳。这也是后面要引入占空比合成的原因,先记住结论。
2.2 随机开关频率的工程约束:周期不是想跳就能跳
随机开关频率落到工程上,最朴素的做法就是让控制周期围绕基准值抖动:
Ts(k) = T_base + ΔT * ξ_k
其中ξ_k取[-1,1]之间的均匀分布随机数,ΔT一般取T_base的20%到30%。这个范围不是拍脑袋定的:开得太大,电流环带宽和预测模型的离散化误差都扛不住;开得太小,频谱扩散效果不明显,和定频就没区别了。
实际操作中还有三个硬约束必须守住:
- 周期下限必须大于ADC采样转换时间、枚举计算时间和死区时间之和,否则下一次中断还没执行就被截断了,指令和实际动作会错位;
- 周期上限受电流环带宽限制,通常不要让Ts超过T_base的40%到50%,太长时间不更新控制,电流容易过冲;
- 相邻两个周期的变化幅度最好也做限幅,防止连续大跳变让电流波形出现一吸一扩的“呼吸感”,实测这种包络非常难看,还会激励机械谐振。
这些约束归结起来就是一句话:随机频率的“随机”,应该是受控的随机,而不是失控的抖动。
2.3 随机周期下的离散预测模型:公式要逐周期刷新
永磁同步电机在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)
常规做法是用一阶欧拉法把它离散化,得到电流预测公式:
i_d(k+1) = i_d(k) + Ts(k)/L_d * [u_d(k) - R_s * i_d(k) + ω_e * L_q * i_q(k)]
i_q(k+1) = i_q(k) + Ts(k)/L_q * [u_q(k) - R_s * i_q(k) - ω_e * (L_d * i_d(k) + ψ_f)]
注意这里的关键变化:Ts(k)是当前随机周期的真实值,不是平均基准值。我最初做仿真的时候就折在这里,后面会专门讲。另外,一个随机周期内默认转速不变,这个假设在Ts偏大的时候会被放大误差,所以随机范围一定要留余量;如果非要大范围随机,建议把一阶欧拉换成梯形法或二阶离散,否则高速弱磁区间的预测值会明显偏掉。
3. 可以直接照搬的控制器实现框架
3.1 候选集怎么设:单矢量入门,双矢量实用
低共模MPC的第一个设计决策是候选集。最省事的方案是从8个矢量里删掉两个零矢量,候选集只剩6个有效矢量,每周期枚举6次,计算量极小。这个方案适合用来理解原理,但低速电流纹波偏大,实用性有限。
更实用的是双矢量方案:一个控制周期内先后作用两个相邻的有效矢量,通过分配两者的作用时间来等效合成任意大小的平均电压。这样既不必用零矢量兜底,又能把低速下“电压步长太大”的问题解决掉。候选集从6个矢量变成6个相邻矢对,枚举过程会多一点,但对于常见DSP来说仍然很轻松。需要提醒的是,双矢量方案的开关次数会比单矢量多,必须在代价函数里放一个“开关次数损失”项,否则开关频率失控,逆变器温升先爆炸。
3.2 代价函数:三个目标怎么加权才不打架
这一节是整套算法的灵魂。我用的代价函数长这样:
J = γ_i * [(i_d* - i_d(k+1))² + (i_q* - i_q(k+1))²] + γ_sw * n_sw(k) + γ_cmv * g_cmv(k)
三个部分各管一件事:
- 第一项电流误差,这是主目标,建议权重固定为1,方便其他权重对比;
- 第二项n_sw(k)是当前所选开关状态相对于上一周期状态的桥臂切换次数,范围0到3,直接约束开关频率;
- 第三项g_cmv(k)是共模惩罚项,如果候选集已经剔除了零矢量,这项目前就是0,可以省掉;只有当你决定在候选集里“留一个零矢量备用”时,才需要给它一个很大的惩罚。
随机周期下,第二项有个细节:一次开关动作在一个长周期里分摊的频率贡献比短周期里小,所以更公平的写法是把n_sw(k)折算成n_sw(k)/Ts(k),也就是以“估计开关频率”参与代价函数。这个折算我强烈建议写上,否则长周期出现时算法会过度珍惜开关次数,导致波形在长短周期交界处产生毛刺。
权重的初调没有灵丹妙药,我的顺序是:先把γ_i固定为1,γ_sw从0.1到1之间做线性扫描,观察电流THD和平均开关频率的折衷;再把γ_cmv在需要时调到1到3之间,保证它优先压住共模峰值。最终值还是要在稳定工况和阶跃响应之间反复搓,直到两个工况都看得过去。
3.3 一个控制周期的完整执行时序
说一千道一万,算法最终要落到固定的执行流水线上。以双矢量低共模MPC为例,一个周期内的顺序大致是:
- 周期起点触发ADC采样,同时读取转子位置和母线电压;
- 计算本周期随机值Ts(k),写入定时器并做限幅钳位;
- ADC数据就绪,读取三相电流并变换到dq坐标系;
- 更新当前工作点(电角速度、磁链估算);
- 枚举候选矢对,逐个预测i_d(k+1)、i_q(k+1);
- 代入代价函数,选出最优矢对和占空比;
- 输出开关状态,保持到周期结束;
- 若采样值触发过流阈值,立即跳进保护流程,优先级最高。
这里必须强调一拍延时补偿。从ADC采样到开关动作真正落实,中间隔了一个控制周期的计算延迟,所以严格的做法是先按上一拍实际作用的开关状态预测出k+1时刻的电流,再枚举候选矢量去预测k+2时刻的电流。随机周期下,这段时间跨度等于Ts(k)+Ts(k+1),两个周期都必须使用各自真实值,缺一个都不行。
4. 仿真和上机调试里,我踩过的那些坑
4.1 第一轮仿真翻车:把随机周期当常量代入模型
我最初做随机MPC仿真的时候,想得很天真:既然平均开关频率是20kHz,那把离散模型里的Ts写死成50微秒不就行了吗?结果电流波形像穿了一层带花边的袜子——纹波一大一小来回包络,怎么看怎么不对劲。
排查到最后,原因非常低级:实际执行的长周期里,真实电流变化量早就超出了按固定Ts计算出来的预测值,每个随机周期末尾,预测值和实测值之间的误差被周期性地放大。后来改成每个控制周期开始时先读入真实Ts(k),再拿它去刷新预测公式,包络立刻消失。这个坑很小,但特别容易踩,因为仿真环境里固定步长默认值会掩盖问题,等你换到真实控制器上才爆发。
4.2 参数漂移在长周期下被成倍放大
电机是“加热体质”:转子磁钢温度升了,磁链ψ_f会变;负载重了,铁心饱和导致L_d、L_q明显下降。预测公式里Ts(k)直接乘在电压误差项上,长周期样本会把参数失配的误差放大,选出来的矢量越来越偏。
我的经验是三个对策按需组合:
- 在预测模型上加扰动观测器,把参数失配和未建模动态折算成集总扰动,每次预测时从电压项里扣掉;
- 每隔几十毫秒在后台跑一次最小二乘参数辨识,把结果更新到预测模型里;
- 如果暂时不想上复杂观测器,至少做一次离线参数辨识,把初始模型摸准,别拿铭牌参数硬算。
4.3 剔除零矢量后,低速工况会跟你玩“颤振”
这是低共模MPC最现实的代价。没有零矢量,低速轻载时需要的平均电压很小,但单个有效矢量作用整个周期产生的电流变化量明显过大,代价函数在相邻两个有效矢量之间来回横跳,每个周期开关次数又多,电流又纠结,听起来就像电机在打哆嗦。
解决路径就是前面说的双矢量占空比合成:一个周期内先作用矢量1一段时间,再作用相邻矢量2一段时间,等效合成一个更小的平均电压。这样低速纹波能压下来,共模电压还维持在±Vdc/6附近。代价是开关次数上升,需要靠代价函数里的开关频率项来找平衡。
还有一个连带问题:剔零矢量后电压利用率会有损失,直流母线电压波动大的场合尤其明显。我当时在某个母线波动测试里看到输出基波开始削顶,代价函数像“不知所措”一样总是在两个矢对之间徘徊,那之后我就把过调制判断加进了保护逻辑,一旦进入线性区边缘,就限制随机范围并提示母线欠压。
4.4 上机调试最容易忽略的三个细节
第一个是随机数生成。中断服务程序里现场算随机数既不节省资源,还会引入不确定延时。我习惯离线预生成一张1024点的随机周期表,循环读取,或者用移位寄存器做伪随机序列,实测都很稳定。
第二个是采样触发相位。必须固定在每个随机周期的开始时刻触发ADC,不要在周期中间或末尾触发。否则采样点相对电压矢量中点的位置不断漂移,电流谐波测量结果会乱到没法看,频谱分析出来的数据基本不能用。
第三个是死区补偿。随机周期下死区时间占总周期比例不固定,低速时误差电压会随周期长度抖动,中高速跑起来很容易出现低频毛刺。建议在死区补偿逻辑里把当前Ts(k)一起算进去,别用固定补偿值。
5. 这套方案到底值不值:指标体系、三方对比与失效边界
5.1 评价指标怎么搭
研究做没做成,不能只看一条曲线。我通常把评价拆成六项:
| 指标 | 关注原因 | 常用测量手段 |
|---|---|---|
| 相电流THD | 波形质量和损耗 | 功率分析仪或FFT |
| 共模电压峰值 | 轴承电蚀风险 | 差分探头测对地/对中性点电压 |
| 谐波频谱包络/EMI峰值 | 传导骚扰和主观噪声 | 频谱分析仪加电流探头 |
| 平均开关频率 | 器件损耗和温升 | 统计单位时间开关次数 |
| 转矩脉动 | 机械噪声和振动 | 转矩传感器或加速度计 |
| 电流阶跃响应时间 | 闭环动态性能 | 记录电流阶跃波形上升时间 |
这里有个容易被误解的点:随机开关频率方案改善的是EMI峰值,不是EMI总能量。能量守恒摆在那里,算法只是把能量从几根尖刺摊到一片宽带里,所以评估时一定要看频点峰值,别只看总发射功率。
5.2 定频PWM、常规MPC与融合方案的三方对比
用一张表把三者的定位说清楚:
| 方案 | 电流THD | 共模电压峰值 | EMI谱形状 | 动态响应 | 算法复杂度 | 典型适用场景 |
|---|---|---|---|---|---|---|
| 常规定频PWM(SVPWM) | 较好 | 高(含零矢量) | 离散尖峰 | 依赖PI带宽 | 低 | 通用工业变频 |
| 常规FCS-MPC | 一般 | 高 | 离散且频移 | 快 | 低 | 高动态伺服 |
| 融合方案(随机+低共模) | 中等 | 低 | 连续而低矮 | 快 | 中 | 高动态+EMC/轴承寿命要求高的场合 |
融合方案不是把两个技巧简单叠加就能白嫖好处,实测结果往往是THD比常规MPC略高一点,需要用占空比合成和参数辨识去“找补”,但换来的是共模电压峰值从母线电压一半降到六分之一、EMI峰值明显下压、主观噪声从刺耳变柔和。对电动汽车类高可靠、高动态、强EMC需求的场景,这个交易是划算的。
5.3 失效边界:别指望它包打天下
任何算法都有适用范围,融合方案也不例外。我总结出四个最容易翻车的场合:
- 极低速、零速工况:候选集无零矢量,会陷入高频颤振,除非加入“低速切换回常规MPC”的工况调度逻辑;
- 大功率器件开关频率预算很低:随机范围开不大,频谱扩散效果有限,低共模的优势还在,但随机频率这一项的红利大打折扣;
- 参数严重漂移又没有在线校正:预测模型失真后,MPC选矢量基本就是“拍脑袋”,再好的候选集也救不回来;
- 对EMC要求极其苛刻的规范:算法能把共模峰值压到Vdc/6,但高频共模电流的dv/dt仍然不低,该加共模扼流圈、Y电容屏蔽等硬件手段还得加,算法只能做辅助,不能当全部指望。
最后说几句实操体会。融合随机开关频率与低共模电压矢量,技术含量不在某一个技巧上,而在如何把时间域的随机化、空间域的矢量约束,同时塞进一个逐周期枚举的框架里,还要保证每个环节互相不打架。没有仿真里摔过的几次跟头,这些细节根本记不住。以后如果再往下做,我想把它往三电平甚至更大电压等级上搬,但会先回查这一套在两电平上的设计骨架,毕竟坑是排完了,但设备也该换了。