基于混合FCS-MPC的MMC整流器Simulink仿真复现与调参实践 如果你近期在翻电力电子方向的论文大概率会看到“混合FCS-MPC MMC整流器”这个组合反复出现。我这次复现的题目就是这样一篇SCI二区工作基于混合有限集模型预测控制FCS-MPC的模块化多电平换流器MMC整流电路仿真模型整体在Simulink里实现。先说结论论文里的曲线和指标不是“跑通就行”就能对上的控制架构、权重因子、电容均压逻辑、仿真步长都在里面起作用。这篇文章按我的实操顺序来写从方案拆解、软件搭模型、调参到踩坑记录尽量把每一步为什么这么做讲清楚适合正在做MMC相关课题或者准备复现MPC类论文的研究生和工程师。1. 先把这个题目拆成三层来看1.1 FCS-MPC是什么为什么MMC工况都喜欢用它有限集模型预测控制的“有限集”三个字指的是可供选择的开关状态是有限多个。控制器在每个采样周期里“枚举”这些候选开关状态用系统的离散预测模型算出每一个候选状态对应的下一拍输出然后把代价函数值最小的那组开关状态送到变流器。相比传统的双闭环线性控制FCS-MPC把多控制目标直接收进同一个优化函数响应快约束处理能力强也容易写进数字控制器。但是FCS-MPC的短板也很明显每次都要在线上做一遍遍历与比较计算量会因为控制变量的组合数而迅速膨胀。用在MMC上尤其头疼。一个两端各有N个子模块的MMC相单元上下桥臂一共2N个子模块如果每个子模块都当独立开关状态对待组合数会变成2的2N次方量级暴力枚举在实时控制系统里基本不现实哪怕只是做离线仿真也很吃力。所以很多论文会采用“混合”的思想不在子模块级别暴力枚举全部开关组合而是把控制问题分层处理。上层用FCS-MPC选出一个“合适的状态”下层用电压排序或者均压算法决定具体投切哪几个子模块。这就是标题里“混合”两个字的核心含义。1.2 为什么强调是整流电路而不是逆变器MMC既可以做逆变也可以做整流。逆变器是把直流侧电能送到交流电网整流器则反过来把交流电能变成直流输出。论文标题特意强调整流电路因为控制任务有明显差别整流工况需要维持直流母线电压的稳定同时保证网侧电流正弦度、功率因数这些指标。简单说整流器要干两件事第一直流侧电压要能顶住负载变化不能掉得太快也不能过冲第二交流侧电流要尽量正弦不能因为MMC内部的电容电压波动、环流等问题把谐波灌回电网。这两个目标放在传统控制里可能要用电压外环、电流内环、环流抑制、电容均压好几个模块去配合FCS-MPC则可以把它们折算进同一个代价函数来权衡处理。这种“多目标打包”的特点正是论文喜欢把MPC用在MMC上的主要原因。但打包归打包各个目标之间的权重怎么设置、预测模型怎么简化又是另一套麻烦事后面我会详细展开。1.3 复现这个模型的实际用途是什么对做课题的人来说复现这类论文通常有三个目的一是验证算法的可行性把主电路、控制器、评估指标全部跑通二是作为对比基准在这个模型上继续改控制方法三是用来采集数据分析不同权重、不同子模块数量下的谐波、损耗、动态响应。无论哪一种都需要一个稳定、可调、能复现论文数量级结果的Simulink模型。我复现完成后最大的感受是这类论文“概念层”不难理解难在把概念变成能在Simulink里稳定运行三个以上工频周期的模型。很多细节论文根本不会写必须自己推导和试错。所以这篇文章不只是介绍模型怎么搭更会重点讲我在复现中被卡住的地方和对应的处理办法。2. 动手搭模型前把控制方案先定下来2.1 混合FCS-MPC的整体架构分层控制我在动手前先画了一个控制框图思路虽然没有用画图工具但逻辑上分成三层第一层是外环。整流器的直流电压给定Vdc_ref与实际直流电压Vdc做差经过PI调节器输出有功电流参考id_ref无功电流参考iq_ref通常直接设0。这一层和传统矢量控制的思路一致作用是保证直流电压无静差跟踪。第二层是内环MPC。在每一个控制周期里对每个相单元、每个桥臂的可选投入子模块数做枚举。例如上桥臂投入数n_up从0到N那么下桥臂为了保证直流电压稳定投入数n_low通常等于N减去n_up。这是一组有限候选控制器根据预测模型选出一组最优的投入数而不是直接决定每一个子模块的开关状态。第三层是均压排序。既然已经确定了上桥臂要投入n_up个子模块那到底投哪几个这时就把该桥臂所有子模块当前的电容电压拿出来排序。充电电流方向为正时优先投入电压最低的子模块放电电流方向为正时优先投入电压最高的子模块这样一轮排序就能把电容电压收敛到参考值附近。这种分层方式把“组合爆炸”问题压缩到N加1个候选状态计算量大幅下降。我复现时用的模型N取6每个控制周期最多只要遍历7种选择在Simulink里非常轻松。2.2 代价函数里的关键项与权重处理代价函数是整个FCS-MPC算法的灵魂。在我复现的模型里目标函数主要由三个部分叠加而成g lam1 * 交流电流跟踪误差项 lam2 * 环流抑制项 lam3 * 子模块电容电压均衡项用代码块写出来大概是这样g_best inf; for k 0:N n_up k; n_low N - k; iac_pred 根据预测模型计算(k); icir_pred 根据预测模型计算(k); vc_err 根据排序和预测计算(k); g lam1 * abs(iac_ref - iac_pred) ... lam2 * abs(icir_ref - icir_pred) ... lam3 * max(abs(vc_ref - vc_pred)); if g g_best g_best g; n_up_opt k; end end交流电流跟踪项让网侧电流跟随参考环流抑制项把桥臂间流动的二次谐波环流压下去电容电压均衡项让各个子模块电容电压差距尽可能小。三个目标的单位不同数量级也不同权重lam1、lam2、lam3如果随便给结果非常容易出现“某项控制得特别好、其他项彻底失控”的情况。我的调参顺序建议是先把lam2和lam3设成很小的值仅用lam1把交流电流调好让整流器能稳定工作再逐步加大lam2观察环流波形是否被压平最后加入lam3看电容电压是否收敛。每加一项都要回到前面看原有目标有没有被破坏权重本质上就是在三个矛盾目标里找平衡点。2.3 预测模型需要简化到什么程度MMC的精确模型非常复杂状态量包含交流电流、环流、所有子模块电容电压还有桥臂电感和等效电阻。直接全部建模会让预测计算冗长且仿真里容易出现数值奇异。实际复现中普遍做两个简化第一个简化是把同一桥臂的多个子模块电容电压看作近似相等只使用平均值Vc_avg参与预测计算。因为均压排序逻辑会强行让各个电容电压趋于一致平均值建模在控制层面是够用的。第二个简化是忽略开关器件导通压降和死区影响把桥臂等效成一个受控电压源串联桥臂电感。这个简化在理想开关仿真下误差很小也不会影响MPC的选型逻辑但好处是预测公式可以写成很干净的递推式。以交流电流预测为例可以近似写成iac(k1) iac(k) Ts / (L_arm L_s) * (vs(k) - u_arm_common(k) - R_total * iac(k))u_arm_common与上、下桥臂投入数之差有关是整个预测的核心。虽然这个公式省略了一些次要因素但在常规MMC整流器工况下精度已经足够支撑控制决策。3. 在Simulink里把模型一步步搭起来3.1 主电路参数选择我复现时使用的是一套低压小容量参数主要目的是快速验证不需要把电压等级拉到电网工程级别。高频高压参数一方面会导致仿真速度明显变慢另一方面对数值算法更敏感稍不注意就会出现不收敛。下面是我搭建模型用的参考参数符号物理含义数值Vrms交流侧线电压有效值380 Vf电网频率50 HzL_s网侧电感2 mHL_arm桥臂电感8 mHR_arm桥臂等效电阻0.1 ΩN每桥臂子模块数6C_sm单个子模块电容6 mFVdc_ref直流电压参考值600 VR_load直流侧负载电阻10 ΩTs_ctrl控制器采样周期50 μsTs_sim仿真步长2 μs这里Vc_ref等于Vdc除以N算出来是100V。上、下桥臂各6个子模块直流侧总共要撑600V交流相电压峰值大约310V整流后的直流电压取600V在工程习惯上也算合理匹配。3.2 子模块建模的取舍子模块最精确的建模是完整IGBT加上反并联二极管、驱动信号、RC缓冲电路。但刚起步做复现时我不建议这么干。缓冲电路容易在仿真中引入高频振荡IGBT模型参数如果不匹配会拖慢仿真而MPC研究的重点是控制逻辑不是器件物理细节。我的做法是半桥结构用两个理想开关代替IGBT并给电容并联一个小电阻防止浮空电位。理想开关本质上把子模块看作一个二端口受控电压源插入状态为1时输出电容电压插入状态为0时输出0。这样既保住了拓扑连接关系又不会把仿真步长拖到很小。逻辑关系如下任意时刻半桥的两个开关必须互补导通不允许同时导通否则电容被短接。用代码块描述子模块输出就是if gate 1 v_sm v_c; else v_sm 0; end这个理想处理对MPC算法本身的验证完全够用。等控制逻辑全部调通以后再回头把理想开关替换成带死区的实际IGBT模型观察开关损耗和电压电流尖峰是更稳妥的路线。3.3 MPC控制器在Simulink里的实现结构控制器我用的是Simulink里的MATLAB Function块。它的好处是可以在一个函数体内完成预测、遍历、代价函数计算、排序输出不需要拆成十几个子系统。输入端口一共这几路三相网侧电流三相桥臂电流或由桥臂电流推算出的环流所有子模块电容电压做排序用交流侧三相电压采样外环PI输出的有功电流参考直流电压反馈函数内部先做测量信号的处理再遍历N加1个候选状态计算代价函数选出最优投入数最后执行电容均压排序并输出每个子模块的开关信号。关键的一点是MPC控制器采样周期必须比主电路仿真步长大很多。主电路用2μs的仿真步长去捕捉开关瞬态和高频分量控制器则每隔50μs才更新一次开关状态。控制输出在两次采样之间用零阶保持器保持这是FCS-MPC在数字控制系统中的常规操作方式。伪代码里我特别注意了避免使用动态数组和可变大小输入原因是后面有用代码生成工具把控制器转到嵌入式环境的打算。MATLAB Function块里尽量用固定大小循环数据都预先分配好这样不至于再做一次大改造。3.4 启动流程与初始条件处理MMC整流器有个很容易被忽略的问题子模块电容在启动时没有电MMC根本建立不起直流电压。如果你直接让PI环输出满幅电流参考仿真大概率瞬间过流或者直接发散。我采用的处理方式是给所有子模块电容设置合理的初始电压在电容元件的“初值”参数里填Vdc_ref除以N。这样启动时MMC已经具备“一半电压”外部PI只需要做小范围调节仿真几分钟就能进入稳态。除此之外外环输出的电流参考也加了一个斜坡限幅。参考值从0开始在0.05秒内斜坡上升到目标值。这个小细节对防止电流冲击非常有用。很多论文不写这个细节但在复现时你会发现问题。控制模型里的外环PI参数我也没有直接照抄谁的公式而是先用工程经验预设一组值比如比例系数取0.5积分时间取0.02秒再根据直流电压的实际响应微调。PI的调法和其他整流器项目没有本质区别关键是先让直流电压稳定再回头调MPC里的权重。4. 复现过程中最难过的几道关4.1 论文参数缺失权重因子怎么猜复现类论文最让人头疼的就是参数表不完整。关键主电路参数通常会给得很全但控制器采样周期、权重因子、排序算法细节经常一句话带过甚至直接写“由实验调试确定”。这种情况下你只能反推和试错。我的经验是先固定控制器采样周期为50μs这个值在MMC的MPC论文里很常见既不会太短导致计算跟不上也不会太长导致电流纹波过大。然后按2.2节里说的顺序由简到繁加权重。如果论文给出了THD、电容电压纹波这类定量结果就把你的仿真结果和这些指标对照逐步把权重收敛到接近论文水平。4.2 电容电压不均衡是最常见的崩点如果你发现运行几毫秒以后某个桥臂的子模块电容电压像楼梯一样一层一层劈开多半是均压排序没写对方向。均压排序的逻辑说起来很简单根据桥臂电流的充放电方向按电容电压排序后选择投入或切除相应子模块。充电状态下优先投入电压低的子模块让它们多吸收能量放电状态下优先投入电压高的子模块让它们多释放能量。但这里的“桥臂电流方向”和“子模块电压高低”必须一一对应任何一处写反都会让均压逻辑变成反作用。我调试时专门在MATLAB Function块里加了几个临时输出端口把排序前后被选中的子模块索引和电压打出来看才定位到一个符号错误。解决问题以后电容电压纹波明显被压到额定值的百分之二以内。4.3 环流抑制效果出不来环流是MMC特有的问题表现为桥臂电流里叠加的二次谐波分量。没有抑制手段时相单元桥臂电流会明显畸变直流侧和交流侧的谐波也都会变差。我一开始只在代价函数里写了环流项但权重取得太小波形几乎没有变化。后来把lam2从0.1一步步调到1再用FFT工具看桥臂电流的100Hz分量才看到明显下降。注意权重不能一味增大lam2太大会压过交流电流跟踪项导致网侧电流波形先坏掉。环流抑制和电流跟踪之间同样需要找平衡。4.4 仿真速度慢到让人怀疑人生最开始我把子模块里的开关都设成带阻尼电阻的详细IGBT模型控制器采样周期又设成10μs一秒钟仿真在普通电脑上能跑几十分钟。这对调试核心算法来说完全不能接受。解决思路是“保住精度目标、砍掉成本大头”理想开关替代详细器件、去掉不必要的缓冲电路、控制器采样周期放到50μs、仿真时长只跑0.2秒用于观察稳态波形完全够用。如果还慢再把powergui设置为离散仿真模式开关步长从2μs放大到5μs但要注意和桥臂电感匹配避免数值振荡。4.5 定量结果和论文对不齐波形趋势对上以后接下来就是指标对比。论文里通常会给出网侧电流THD、电容电压纹波、动态响应时间这几个指标。我复现时最常遇到的结果是THD比论文偏高零点几到一点几个百分点。原因大概率出在权重和采样周期上也可能与电网电感、交流侧滤波器的差异有关。这种差异不必追求到小数点后完全一致只要在数量级和趋势上吻合、控制行为合理就说明核心机理复现成功了。如果差异超出合理范围优先检查环流抑制权重的数量级以及排序算法有没有真正参与电容电压均衡。5. 反复调参后沉淀下来的实操经验5.1 波形检查要有顺序别一上来就看THD我把整个复现的验证顺序固定为先看直流电压能否稳到参考值再看网侧电流正弦度然后看子模块电容电压纹波接着看环流波形最后做FFT看谐波和THD。每一步没有达到预期就回头检查对应环节不要直接跳到最终指标。例如直流电压稳不住多半是外环PI没调好或者电容初始电压不对电流波形差大概率是lam1权重偏小或者电流参考波动电容电压劈开必然是均压排序方向问题。按照这个顺序排查定位问题的速度会快很多。5.2 批量权重扫描是个省时间的笨办法调权重最忌讳每次只改一个数、跑一次、看一组波形然后手动记录。我后来把lam2和lam3定义成模型工作区变量写了一个简单的循环脚本批量仿真每次改变权重组合自动把直流电压纹波、THD、环流幅值保存成表格。脚本逻辑不复杂核心是不断改变参数并调用仿真命令然后把结果存下来。脚本不需要用复杂的优化工具箱手动扫一个范围就可以看到趋势。当然要注意每次仿真前把工作区变量真正写进模型不然改了半天发现根本没生效。5.3 这个模型后续还能怎么扩展整流器模型跑通验证是基础后续可以往几个方向延伸。第一个方向是把整流器改成逆变器把直流侧接直流源交流侧接电网控制目标从“稳压”变成“稳功率”FCS-MPC主体逻辑不用大改。第二个方向是提高子模块数量N从6提升到11甚至更高用来研究多电平谐波性能和均压算法在大规模状态下的表现。第三个方向是把生成的开关信号接入更细致的损耗模型评估不同权重组合下的器件损耗分布。我个人后续更关注的是把MPC控制器转成嵌入式代码放到实时仿真平台上测一下计算延时。如果能在闭环仿真里把50μs采样周期跑满那这套方案离工程验证就更近一步。如果你刚开始复现这类论文我建议不要一上来就追完美指标先把主电路和控制逻辑跑稳定再一步步朝论文数据靠拢这条路走下来会顺很多。