
搞多电平变换器的兄弟应该都有过这种体验一篇论文看完公式觉得懂了真到自己动手复现的时候光是Simulink里那个模块化多电平换流器MMC就够折腾一晚上。去年我复现一篇IEEE Trans. Power Electronics上关于混合有限集模型预测控制FCS-MPC的MMC整流论文从拓扑搭到控制落地中间踩坑踩到怀疑人生。网上能找到的模型要么是传统PI加调制器要么是简化到只剩电流跟踪的MPC混合到底混合了什么几乎没人讲透。这篇文章就把整套Simulink仿真模型的搭建过程、控制策略的实现细节、参数配置和调参经验完整梳理一遍算是一份可以直接对着做的复现笔记。项目核心就一句话用混合FCS-MPC驱动MMC完成整流在一个控制框架里协调好并网电流、电容电压均衡和桥臂环流抑制这三个问题。如果你正在做多电平变换器方向的课题、需要复现SCI论文或者刚接触MPC想找一套能跑的Simulink模型这篇内容应该能帮你省下不少时间。1. 项目概述与整体设计思路1.1 为什么选MMC和FCS-MPC这个组合模块化多电平换流器Modular Multilevel Converter, MMC在中高压电力电子领域应用非常广从柔性直流输电到中压电机驱动、从新能源并网到电能质量治理都能看到它的身影。它和普通两电平变换器最大的区别是用多个子模块级联取代了单个功率开关管能输出接近正弦的阶梯波谐波含量低器件应力小模块化设计也方便冗余。选择MMC来做整流电路目的很明确验证FCS-MPC在复杂拓扑上的可行性和性能边界。因为MMC的控制难点恰恰是它的优势带来的——子模块数量多、状态变量多、每个桥臂又有环流问题这给控制器的设计留足了发挥空间。再说FCS-MPC全称是Finite Control Set Model Predictive Control有限控制集模型预测控制。它的思路比较直接变换器可输出的开关状态是有限多个在每个控制周期内把这所有状态全部枚举一遍用系统模型预测下一时刻的变量值然后带入代价函数选出让代价函数最小的开关状态直接驱动开关管。相比传统PI加调制器的方案FCS-MPC的最大亮点有三点。第一动态响应快因为它本质上是一个实时滚动优化没有PI那种渐进逼近的滞后第二不需要线性调制器输出的就是开关信号省掉了SPWM、SVPWM这一层第三多目标控制很自然代价函数里可以同时塞进电流误差、电容电压误差、环流误差权重系数一调就能权衡。这些特性在MMC这种强非线性的多变量系统里特别合适。1.2 复现SCI论文模型的整体思路复现论文最忌讳一上来就把整个三相模型搬进Simulink那只会让自己陷入无穷无尽的报错中。我的做法是先搭建单相MMC整流电路把控制算法验证通过再扩展成三相结构。单相的好处是拓扑简单、状态变量少、波形现象直观每个控制目标都能单独观测。论文里的公式在单相条件下已经能完整体现FCS-MPC的核心逻辑等单相模型跑出正确的正弦电流、电容电压均衡、环流受控这三项结果后再上三相就是水到渠成的事。具体拆解下来复现工作分成四层拓扑层MMC功率电路包括子模块、桥臂电感、交流侧电源和负载。控制层混合FCS-MPC算法负责产生各桥臂的开关信号。辅助层电容电压均衡排序、环流抑制附加控制。验证层稳态波形、动态响应、谐波分析与论文结果对照。每一层都独立调试能单独验证最后再联调。这个分层思路也是我在这次复现中最大的收获连跑不通的时候都能快速定位问题出在哪一层。2. MMC整流电路的工作原理与控制目标2.1 单相MMC拓扑结构与子模块状态单相MMC整流器的拓扑结构可以这样理解一条直流母线分成上下两个桥臂每个桥臂由N个子模块串联再串一个桥臂电感Larm上下桥臂在中点连接中点接交流电源和负载。子模块是MMC的最小单元最常用的是半桥结构由两个IGBT和一个直流电容构成。上下两个开关管的开关组合决定输出电压上管开通、下管关断子模块投入输出端电压等于电容电压Vc上管关断、下管开通子模块切除输出端电压约等于0两个都关断闭锁状态通常在启动或故障保护时使用。所以每个桥臂能输出的电压台阶取决于该桥臂当前投入了多少个子模块。理想情况下上下桥臂投入的子模块数之和保持恒等于N这样直流母线电压稳定在N倍的电容标称电压附近。桥臂电流有两个关键分量输出电流ioiu-il以及环流ic(iuil)/2。环流是上下桥臂之间流动的电流它不参与对外功率传输却会给器件带来额外的电流应力和谐波问题。这部分在2.2节展开。单相MMC整流电路工作在整流状态时交流电源通过MMC的交流侧端口向直流负载供电。控制的目标就是要让输入电流呈现正弦波形且与电源电压同相位实现单位功率因数整流同时维持直流侧电压稳定。2.2 三个核心控制目标的关系混合FCS-MPC的混合之处在于它要在一个控制框架中同时处理多个目标而这些目标之间的耦合关系很微妙。第一个目标是并网电流控制。整流器的最终任务是把交流能量转成直流那么输入电流的质量直接决定谐波指标和功率因数。FCS-MPC对电流的控制核心是让实际电流在下一时刻尽量接近参考值。参考电流的幅值通常由直流电压外环给出当直流侧负载变化或电压参考变化时内环电流能快速跟随。第二个目标是子模块电容电压均衡。每个子模块都有一个直流电容如果某个电容电压偏高或偏低分担不均会导致子模块间应力不同严重时甚至损坏器件。MPC的代价函数里可以加入电容电压误差项对偏离平均电压较大的子模块加大惩罚从而在开关状态选择时优先平衡它们。第三个目标是桥臂环流抑制。环流的产生源于上下桥臂瞬时电压不相等它主要是二次谐波分量在桥臂电感上产生额外损耗还会让桥臂电流畸变、器件开关应力增大。传统做法是加独立的环流抑制器而在混合FCS-MPC框架下可以把环流预测误差作为一个代价项或者用附加的环流闭环把二次谐波压下去。这三个目标存在博弈电流跟踪要的是快速响应这往往带来较大的电压跳变电压均衡要频繁切换子模块这会影响开关损耗环流抑制则要精细调节桥臂电压又会和电流控制的效果叠加。混合控制的价值就是通过权重系数把这些矛盾的指标拉到一个可接受的平衡点上。3. 混合FCS-MPC控制策略的核心实现3.1 系统模型的离散化推导FCS-MPC的基础是预测模型。模型不需要太复杂关键是能准确描述控制周期内的电压电流关系。以单相MMC整流器为例忽略开关损耗和线路电阻或者用等效电阻Rs简化后可以写出两个核心微分方程。输出电流的微分方程[ L_s \frac{di_o}{dt} R_s i_o v_s - v_o ]其中vs是交流电源电压vo是MMC交流侧输出电压由上下桥臂输出电压之差决定[ v_o \frac{v_l - v_u}{2} ]环流的微分方程[ L_{arm} \frac{di_c}{dt} \frac{V_{dc}}{2} - \frac{v_u v_l}{2} ]这两个方程描述了整流器最主要的动态特性。用前向欧拉法做离散化采样周期Ts足够小一般取几十微秒级别时可以把微分方程改写成一阶差分形式[ i_o(k1) i_o(k) \frac{T_s}{L_s} \left[ v_s(k) - v_o(k) - R_s i_o(k) \right] ][ i_c(k1) i_c(k) \frac{T_s}{L_{arm}} \left[ \frac{V_{dc}(k) - v_u(k) - v_l(k)}{2} \right] ]这就是预测模型。给定当前测量值io、ic、Vdc、vs和候选开关状态即候选的vu、vl组合就能预测下一采样时刻的io和ic。子模块电容电压的预测也类似。第j个子模块的电容电压变化率取决于它的开关状态sj和所在桥臂的电流方向[ v_{C,j}(k1) v_{C,j}(k) \frac{T_s}{C} \cdot s_j(k) \cdot i_{arm}(k) ]其中iarm是子模块所在桥臂的电流上桥臂用iu下桥臂用il。C是子模块电容容值。3.2 代价函数设计与权重系数的选择代价函数是整个MPC的核心它把所有控制目标压缩成一个标量。我在复现中用到的代价函数形式如下[ J \lambda_1 [i_{o,ref}(k1) - i_o(k1)]^2\lambda_2 [i_{c,ref}(k1) - i_c(k1)]^2\lambda_3 \sum_{j1}^{2N} [v_{C,avg}(k) - v_{C,j}(k1)]^2 ]第一项是输出电流误差项保证整流电流跟踪参考值第二项是环流误差项参考值ic,ref通常设为零因为理想情况下环流不存在第三项是电容电压均衡项让每个子模块电容电压向平均值靠拢。权重系数λ1、λ2、λ3怎么调这里有一句说一句论文里一般只给出结果不告诉过程实际调试时我一般遵守两个原则。第一个原则是量纲统一。各项误差的数值数量级差别很大比如输出电流可能是几十安培电容电压误差可能只有几伏如果不做标幺化或者归一化某个项会直接压倒其他项。所以我在模型里先做基准值归一化把电流、电压都折算到标幺值范围内再调权重才有意义。第二个原则是优先级递进。输出电流跟踪是主目标权重必须最大环流抑制次之电容电压均衡项相对影响最小。我调试时先令λ11、λ20、λ30把电流控制跑通、波形调准再加入环流项从λ20.1往上加观察桥臂电流谐波变化最后加λ3从λ30.01往上调看电容电压波动范围能不能压到5%以内。如果某两个目标互相冲突严重就把冲突目标的权重降低而不是盲目加大。权重系数调试的最终目标不是让某一项指标极致优秀而是让三个指标同时满足工程可接受范围。比如电流THD小于5%电容电压波动小于10%环流分量小于额定电流的10%——这种平衡才是论文里所谓混合控制优越性的验证点。3.3 有限控制集的构建与在线优化FCS-MPC的有限集在MMC中体现为开关状态的组合数量。单个半桥子模块有2种有效开关状态上下桥臂共2N个子模块理论上有4的N次方种组合。但实际控制中为了维持直流电压稳定会让上下桥臂投入的子模块总数恒等于N也就是满足约束[ n_{up} n_{down} N ]这个约束下有效组合数为排列组合C(2N, N)。我复现时用了N4也就是C(8,4)70种组合。在每个控制周期里MATLAB Function块内部分别计算这70种组合对应的预测值并求出代价函数值然后取最小值对应的开关模式输出。这个循环计算量对现代编译后的Simulink仿真来说完全扛得住仿真速度也还能接受。当然如果子模块数很大比如桥臂数N10以上组合数会达到184756种单纯枚举就会非常吃力。这就是为什么论文中会引入排序法或分支定界法来压缩搜索空间。混合FCS-MPC在这里的优势是可以把代价函数选状态和排序法选子模块结合起来先把桥臂级需要投入的模块数量算出来再通过排序法决定具体哪几个SM投入计算量大幅下降。3.4 环流抑制的实现方式环流抑制这部分我单独拿出来说是因为它最容易踩坑。在纯FCS-MPC方案里环流抑制通常靠代价函数中的环流误差项实现但实际效果往往不如预期因为环流的动态时间尺度比输出电流慢直接放在同一个代价函数里容易被快速电流项压制。这也是混合概念的另一个体现我最后采用的是FCS-MPC电流跟踪主环独立环流抑制闭环的组合。环流闭环提取桥臂电流中的环流分量ic(iuil)/2减去参考值ic_ref0误差送入比例谐振PR控制器谐振频率设置在二倍频100Hz输出一个附加的桥臂电压修正量叠加到MPC输出的电压指令上。如果不想用PR控制器也可以用准比例谐振或者在代价函数中单独提高环流项的权重。但从工程复现角度看独立的环流抑制闭环更容易调参、更容易和论文对标也更容易解释波形改善的原因。3.5 控制算法整体数据流这个模型的控制流程可以概括为一个闭环逻辑直流电压外环产生输出电流参考幅值经过锁相同步后得到瞬时电流参考FCS-MPC模块读取当前测量到的电流、电压、电容电压枚举有限状态集合预测未来值计算代价函数选出最优开关状态环流抑制器独立计算附加电压修正量叠加到桥臂电压指令上最终生成驱动信号送进功率电路。整个闭环在每个采样周期比如100微秒内执行一次滚动更新。4. Simulink模型搭建与参数配置4.1 功率电路搭建功率电路用Simscape Electrical搭建这是最能反映器件电平细节的方案。每个子模块用两个IGBT器件、两个二极管和一个直流电容按半桥结构连接电容电压信号通过电压传感器引出来。子模块数量少的时候可以直接复制粘贴但数量多了就必须封装成子系统。我给子模块做成了带仿真端口的Mask封装输入是开关脉冲输出是电容电压外部输入桥臂电流。这样桥臂上一串子模块通过总线连接model结构清晰很多。桥臂电感Larm直接用Simscape的串联R-L元件。交流侧电源用交流电压源负载侧用电阻负载或电阻电感负载方便测试动态响应。直流母线电压由MMC自身整流建立不需要外部直流源。需要注意电源连接极性。上下桥臂串联后上桥臂首端接直流正端下桥臂末端接直流负端上下桥臂连接点接交流电源的一端另一端接负载。接反了仿真一瞬间就会报错或者产生极大电流震荡。4.2 控制系统搭建控制系统全部放在Simulink普通域用MATLAB Function块实现FCS-MPC算法。这个块的核心优势是支持循环和复杂逻辑比用一堆Simulink基本模块搭MPC要高效得多。MATLAB Function块内部结构我整理成四个步骤第一步读取外部测量信号包括交流电流io、上下桥臂电流iu和il、直流母线电压Vdc、交流电源电压vs、各子模块电容电压vc数组以及直流电压外环给的电流参考幅值。第二步根据锁相环给出相位信息更新电流参考值io_refIm_ref*sin(wttheta)。锁相环用Simulink标准三相PLL或者单相PLL都可以。第三步枚举候选开关状态。先根据当前n_up0到N生成上下桥臂投入数量组合满足n_upn_downN对每种组合计算对应的vu、vl预测值再计算出下一时刻的io和ic预测值同时根据桥臂电流方向预测电容电压变化。第四步计算代价函数选出最优状态组合输出相应的开关信号。开关信号是长度等于2N的向量每一位对应一个子模块的开关管驱动。这个流程里最难的一点是延迟补偿。实际数字控制里从采样到执行开关状态穿过一个控制周期直接施加k时刻算出的开关状态会有一步延迟。我的做法是用两步预测法先用k时刻测量值预测k1时刻状态再利用预测出的k1状态预测k2时刻状态用k2的结果选最优开关状态。这样算出来导致的跟踪效果要好得多尤其是采样频率不高时差异很明显。4.3 典型参数配置清单参数配置是复现论文的关键一环给出我复现时的典型参数你可以根据自己的论文目标参数进行调整。参数符号数值说明每桥臂子模块数N4子模块数量越多电平越平滑但枚举组合数增大子模块电容C4.7 mF影响电容电压波动范围和动态性能桥臂电感Larm5 mH影响环流抑制效果和电流纹波交流侧电感Ls2 mH滤波和电流约束交流电源电压vs100 V幅值单相交流源直流母线参考电压Vdc_ref200 V由外环控制负载电阻R20 Ω整流器直流负载采样周期Ts1e-4 s对应控制频率10 kHz输出电流权重λ11.0标幺化后权重环流权重λ20.2视环流抑制效果调整电容电压权重λ30.05电容电压波动控制直流电压外环是经典PI控制输出限幅在电流参考幅值的合理范围比如2倍额定电流内。PI参数我用的是Kp0.5Ki20实际调整时观察直流电压阶跃响应再来微调。注意这里不是MPC的核心用简单PI就能满足。4.4 仿真求解器设置Simulink求解器设置是决定仿真能否跑通的大前提。我踩过最狠的坑就是把求解器设成定步长离散而Simscape里又有连续积分环节导致报错Simscape does not support discrete solver。最终选择功率电路Simscape域用变步长连续求解器ode23tb控制部分用触发子系统以Ts为周期采样执行。这样既保证了Simscape器件的连续动态能正确仿真又让MPC按固定的控制周期滚动计算。控制信号的传递要在变步长仿真中实现固定采样需要加Zero-Order Hold模块。把测量信号先经过ZOH采样时间Ts再进入MATLAB Function保证每个控制周期读取的是同一时刻的测量值。开关信号输出端如果不加比例放大Simscape IGBT模块的G端口可以直接接收逻辑电平我的做法是加一个整数到逻辑转换。步长精度方面ode23tb的相对容差我设成1e-4再小仿真速度下降明显且结果差异不大。如果某一时刻波形突然发散先把相对容差调到1e-5试试往往就能稳住。4.5 启动过程的处理MMC整流器启动时所有电容电压为零这时候如果直接跑MPC桥臂电流瞬间冲击很大容易出现仿真崩溃。我的处理方式是分两步启动第一步预充电阶段。给直流侧接一个限流电阻和一个二极管整流桥让电容先充到接近额定值。这个阶段不启用MPC功率开关全部关断靠二极管续流充电。第二步MPC切入。当直流电压达到额定值的80%以上后切换到MPC控制把外环的电流参考幅值从0慢慢爬升到额定值斜升时间设成0.5秒观察波形是否平顺。这个软启动操作在很多论文里不会写但实际操作时少不了的不加这个过程模型经常第一个仿真周期就崩掉。5. 仿真结果分析与论文复现对比5.1 稳态波形特征模型跑通后稳态波形的三条指标是最直观的验证。第一交流侧电流io要呈现标准正弦波且和电源电压同相位功率因数接近1。第二直流侧电压Vdc稳定在200V附近纹波很小。第三子模块电容电压Vc均围绕50V左右波动波动范围控制在5%以内。桥臂电流中的环流分量被压到很小波形上看不到明显的二倍频包络。我把这些波形在Scope里存成了时间序列数据然后导到MATLAB里做FFT分析。交流电流的THD在稳态下约为2.5%-4%比传统PI控制下的5%-6%明显改善这也符合FCS-MPC论文里的典型结论。5.2 动态响应性能动态响应测试我做了两组负载突增和直流电压参考跳变。负载突增测试在t1.0s时把负载电阻从20欧跳到10欧观察直流电压跌落和恢复时间。FCS-MPC的响应很快直流电压最多跌到约190V0.2秒内恢复参考值交流电流幅值立刻增大整个过程没有明显超调震荡。直流电压参考跳变测试把Vdc_ref从200V阶跃到240V观察电压跟随速度。因为外环是PI控制、内环MPC响应极快总体电压恢复时间约0.1秒电流波形在调节过程中畸变程度很小动态响应指标优于传统调制方案。5.3 环流与电容电压波动分析环流抑制效果要看桥臂电流波形和频谱。未加环流抑制时桥臂电流里有明显的100Hz分量幅值可能达到基波幅值的一半。加入混合控制里的环流抑制闭环后100Hz分量降到基波的5%以下桥臂电流波形显著改善。电容电压波动是另一个重点。N4、C4.7mF的参数下稳态电容电压波动范围约±3%比论文中可能给出的±5%略好这是因为我把权重系数λ3调到了0.08左右对电压均衡的惩罚力度更强。代价是开关频率略有上升这也是权重博弈的直观体现。5.4 与论文原文结果对照的注意事项复现论文时最容易遇到的问题就是参数完全按论文设置结果却对不上。我总结了三个原因。第一是标幺化基准不同。很多IEEE论文用标幺值系统各变量基值定义不写明导致实际数值差异很大。复现前先把论文的基值体系搞清楚把标幺值换算回实际值再进Simulink。第二是采样频率差异。论文往往只在图表注里写控制频率不写清楚采样周期直接套用参数很容易偏差。如果论文给了实验样机的DSP控制频率就按那个来如果只给了仿真那就按常见的10kHz或20kHz尝试。第三是负载工况不同。有的论文仿真用的是阻性负载有的是阻感性负载启动过程、稳态电容电压波动结论会差很多。对照论文结果时先把负载条件和初始条件对齐。复现的价值不在于逐像素还原论文的图而在于把控制算法吃透验证。如果你的结果在趋势上、数量级上、动态特征上都与论文一致那这个复现就是成功的。6. 常见问题与排查技巧实录6.1 问题速查表下面这份速查表是我调试过程中整理出来的几乎涵盖了常见故障故障现象可能原因解决方法启动瞬间电流爆炸直冲几千安电容未预充电直接启动MPC增加预充电阶段直流电压达到额定值后再切入MPC仿真报错Input port ... is not connected总线信号或向量信号连接错误检查MATLAB Function输入端口维度并用porte dimensions确认电容电压发散越差越大电容电压均衡权重λ3过小或者排序法周期不一致增大λ3确认电压均衡逻辑在每个控制周期执行交流电流存在明显低频震荡外环PI参数不合适电流参考相位有偏差降低Kp或增大Ki检查PLL输出相位是否稳定桥臂电流出现强烈100Hz波纹环流抑制失效桥臂电感偏小检查环流抑制闭环增大Larm或调PR控制器参数MPC计算频率跟不上仿真步长枚举组合数太多Ts过小减少N增大Ts到100us使用两步预测时注意循环效率输出电流稳态有静差预测模型与实际模型参数不一致没有延迟补偿增加延迟补偿核对Ls和Rs数值与模型一致MATALB Function里用了不支持的函数代码生成不允许某些动态数组操作用coder.extrinsic或改写成固定长度数组6.2 权重系数的快速调节思路权重系数调不出来是MPC最常见的卡点这里给一个可操作的流程。先把输出电流项权重固定为1环流和电容电压权重都设为零跑通电流波形。这一步的目标是让整体控制闭环能稳定运行对应一个所有子模块都参与输出的基准状态。在这个基础上加环流权重从0.1开始每次翻一倍观察桥臂电流的100Hz分量幅值直到降到可接受范围。如果引入环流权重后电流波形出现明显畸变说明环流项和电流项冲突此时不继续加λ2而是增大桥臂电感或者加入独立环流抑制闭环来分担任务。最后加电容电压均衡权重从0.01开始观察电容电压波动范围。波动范围太大就增加λ3但注意λ3过大会导致开关频率过高、开关损耗暴增。如果开关频率超过器件允许范围说明均衡项惩罚太重需要反过来降低并通过增大电容容值解决波动问题。6.3 仿真速度优化的三个技巧MPC类模型跑起来慢是通病我实际测试下来有三个有效优化手段。第一个是减少输出诊断输出数据。Simscape默认记录大量中间节点波形控制Scope一多了仿真速度急剧下降。我的做法是只记录关键信号把不需要的To Workspace模块全部取消。第二个是合理设定控制采样周期。Ts从50us增加到100us计算量减半控制性能下降不大。如果你的论文目标是验证控制架构而非极致波形质量100us完全够用。第三个是把MATLAB Function内部循环向量化。枚举70种状态的时候用手写for循环嵌套在函数里会让仿真时间翻倍。改成先构建状态组合矩阵再统一用矩阵运算算预测值速度提升非常明显。这也是代码生成的推荐写法对后续部署到控制器也有利。6.4 复现过程中最值得注意的一个细节最后说一个我自己吃了大亏的细节开关信号和仿真采样时刻的对齐。Simulink里ZOH采样时刻和MATLAB Function输出更新时刻如果不在同一拍上会产生一个额外的小延迟这个延迟在高速动态下会造成电流跟踪抖动。解决办法是把ZOH的采样时间设置为Ts的整数倍并且确保触发信号由同一个时钟源提供。我用的是一个周期为Ts的脉冲发生器作为整个控制系统的时基参考所有ZOH、触发子系统都挂在同一个脉冲信号上。从此再也没有出现过诡异的高频抖动。7. 写在最后复现SCI论文的一点心得论文复现这件事看起来是照着公式搭模型真正做起来才知道细节量有多大。我个人最大的感受是不要试图一步到位一定要为每个环节留出单独验证的时间尤其是FCS-MPC这样的控制算法。预测模型、代价函数、枚举逻辑、延迟补偿、环流闭环任何一个环节出问题整个仿真都会表现得极不稳定而且错误现象往往不直观排查起来很耗时间。顺着这次项目的经验后续扩展方向其实很明确。把单相模型扩展成三相MMC整流器验证三相不平衡工况下电流控制效果或者在FCS-MPC框架里引入模型观测器实现对非理想电源电压的自适应控制再进一步把仿真模型通过Embedded Coder自动生成C代码部署到DSP或FPGA上做硬件在环验证这才是这条技术路线真正落地的完整闭环。如果你也在复现这类论文记住这句话先让模型跑起来再去优化指标。一个能跑的粗糙模型价值远大于一个永远调不通的完美设计。