
在Simulink里把11电平三相MMC逆变器并网控制模型完整跑通我前前后后折腾了一个多月。第一版模型搭得很快波形出来也“像那么回事”但一查相电压波形根本不是11级阶梯子模块电容电压乱跳桥臂电流里二倍频分量大得夸张。后来发现问题不在Simulink本身而在自己对MMC的调制、均压、环流抑制和并网控制这几个环节的理解太“线性”了——总以为把两电平那套dq控制直接搬过来就行实际上MMC多出来的不只是电平数而是一整套能量分配逻辑。这篇文章就按我自己从零搭模型的实际顺序来写先说明为什么选11电平这个规格再逐块拆解子模块均压与调制、环流抑制、并网控制策略最后把Simulink建模细节和调试经验完整交代出来。适合正在做储能并网、光伏中高压并网或者准备用仿真验证MMC控制算法的人。即使你之前只玩过两电平三相VSC沿着这条路径也能把MMC的坑基本摸一遍。1. 为什么是“11电平”MMC选型背后的工程逻辑1.1 中高压并网场景下两电平和三电平的尴尬位置先聊一个听起来很基础但值得说透的问题为什么要用MMC做并网逆变器如果把逆变器放在10kV甚至35kV的中高压并网场合两电平VSC会遇到两个硬约束。第一个是器件耐压常用的IGBT耐压等级就那么多两电平拓扑里每个开关器件要承受完整的直流母线电压直流母线到了20kV以上要么选器件串联要么换更高耐压的器件串联均压本身就是一个非常棘手的问题。第二个是波形质量两电平开关频率做得再高输出电压还是在两个电平之间跳变dv/dt大、共模干扰重并网滤波器体积跟着膨胀这在储能站、光伏电站这种需要“安静、长寿”的场合并不友好。三电平NPC能缓解一部分问题但它的器件结构和控制复杂度是跳跃式上升的中点电位平衡问题在动态工况下够调一阵子而且电平数到这里基本到头了想往更多电平走NPC的钳位二极管和电容数量完全不可控。MMC的思路则完全不一样它不追求让单个器件承受高压而是把高压拆成很多个低压子模块串联每个子模块就是一个半桥加一个电容承受的电压只有直流母线的N分之一。电平数上去之后输出电压谐波大幅下降单个器件开关频率也可以压得很低开关损耗和滤波器体积都跟着降下来。这也是MMC在柔性直流输电、中高压储能PCS、STATCOM这些场景里能站住脚的底层原因。1.2 11电平到底意味着多大的模型规模先把“电平数”这件事拧清楚。对三相MMC来说每相有上下两个桥臂每个桥臂由N个子模块串联。输出相电压相对于直流母线中点可以取N1个电平。所以标题里的11电平翻译过来就是每桥臂N10个子模块上桥臂10个、下桥臂10个单相一共20个三相一共60个半桥子模块。每个半桥子模块又含2个IGBT加反并联二极管、1个直流电容所以整机里半导体器件数量是120个IGBT加120个二极管——数字听起来唬人但每个器件只承受Vdc/10的电压比如直流母线20kV时每个子模块电容只有2kV左右器件选型反而宽松。一个容易混淆的点是这里说的11电平是相电压对直流中点的电平数如果看线电压因为两个相电压相减台阶数会更多。和实时热搜里经常出现的三电平逆变器放在一起对比就很直观。对比项两电平VSC三电平NPC11电平MMCN10相电压电平数2311三相主开关器件数612加钳位二极管120个IGBT120个二极管器件承受电压VdcVdc/2Vdc/10输出谐波与滤波需求大中小控制复杂度低中高故障冗余能力无无有可旁路故障模块实际做仿真时器件数量的增加直接影响的是计算耗时。60个子模块如果全部用电力电子开关器件级建模Simulink每个步长都要解一大堆开关节点跑一次几百毫秒的工况能急死人。所以本文后面的建模方案会特意避开“器件级”建模这个后面展开。1.3 为什么先从11电平上手而不是21电平、51电平我的看法是11电平是“刚好能覆盖MMC全部核心问题”的最小规格。电平数再少比如5电平子模块电容电压波动的问题也有但环流和均压之间的耦合效应不够明显很容易让人忽略电平数太高比如21电平甚至更高模型规模成倍上涨仿真时间实在不划算而且控制算法本身还没有本质变化。更现实的是11电平的相电压阶梯已经足够逼近正弦你可以在示波器里很直观地看到“阶梯波叠加PWM”的形态这对理解MMC工作原理非常友好。等11电平玩明白了把N改成20、30只是改参数的事新增的问题主要是开关状态组合爆炸和排序均压的计算负担而不是控制原理变了。2. 子模块均压与调制策略仿真中第一个绕不过的坎2.1 桥臂功率脉动让电容电压天然“不稳”MMC子模块电容的运行方式和两电平直流母线电容很不一样。两电平的母线电容主要吸收的是直流-交流功率差频率高但幅度可控MMC的每个子模块电容则要持续被桥臂电流充放电而且桥臂电流本身是“直流分量工频分量环流分量”的混合体。可以这样理解子模块的开关函数近似为占空比信号其中既有直流偏置也有基波调制分量而桥臂电流同样含有直流和基波分量。两个含基波分量的信号相乘就会产生二倍频的瞬时功率分量。也就是说电容上的能量本来就在以电网两倍频率的节奏往复振荡。这是物理特性决定的不可能完全消除只能通过参数设计把电压波动幅度压在允许范围内再通过均压控制让每个子模块的波动步调一致、不发散。仿真中常见的错误是把电容电压波动直接归结为“均压没做好”其实不是。就算均压做得完美每个电容电压也都有±5%左右的周期性波动区别在于波动是均匀还是个别模块特别大。这个认知能帮你少走很多弯路。2.2 PS-PWM与排序均压Simulink里的搭配选择调制策略决定了怎么把子模块的投入组合出来而均压策略决定了在每个控制周期让具体哪个子模块投入。这两个问题在MMC里是绑在一起解决的。我的模型用的是载波移相PWMPS-PWM也就是每个桥臂的N个子模块各配一路三角载波载波相位依次错开2π/N共享同一路调制波。这样单个子模块的开关频率可以很低但桥臂输出电压的等效开关频率是单个载波频率的N倍波形谐波性能很好。载波移相PWM在Simulink里实现很直接用N个Repeating Sequence生成三角波或者用Clock做载波计数相位依次加1/N个周期然后和调制波做比较。均压部分我推荐排序法。思路很简单每个控制周期采集桥臂电流的方向判断当前是在给子模块电容充电还是放电然后把本桥臂N个子模块的电容电压排序充电时优先投入电压最低的几个放电时优先投入电压最高的几个。这样电压高的少充多放电压低的多充少放自然收敛。逻辑不复杂但要注意排序法和载波移相配合时子模块的开关状态可能频繁翻转实际工程上会在排序结果里加滞环或者限制开关频率仿真里为了提速可以先不管这些。和其他调制策略放在一起看选型逻辑会更清楚调制策略实现复杂度谐波特性与均压配合适用场合PS-PWM载波移相中载波频带谐波分散适合配合排序法或平衡补偿电平数中等教学与工业常用PD-PWM载波层叠中谐波集中于最低次边带均压压力大需额外处理电平数较少强调谐波性能NLM最近电平逼近低低开关频率下谐波较大天然用排序均压直接高电平数超大功率场合2.3 先算对参数再开搭电容和桥臂电感的数量级很多仿真模型发散首要原因不是控制参数而是主电路参数拍脑袋定的。这里给出一套10kV/10MVA并网算例的参数推导过程照这个数量级去搭配合控制参数调整会顺利很多。先确定规模直流母线电压Vdc取20kV每桥臂N10子模块电容额定电压就是VcVdc/N2000V。系统额定容量Sn10MVA。子模块电容用一个常用的储能常数法估算C约等于2·Sn·H/(3·N·Vc²)。H是储能时间常数工程上按40 kJ/MVA左右取值。代入得C≈2×10×10⁶×0.04/(3×10×2000²)≈6.67mF考虑裕量我取了8mF。这个值决定了电容电压波动幅度8mF对应约±5%的波动仿真波形基本符合预期。如果想看电容电压波动对控制的影响可以试着把电容减半到4mF波动会明显加大控制器更容易表现出耦合问题。桥臂电感按标幺值设计。取桥臂电感0.1pu交流侧基值LbaseVg²/(ω·Sn)100×10⁶/(314×10×10⁶)≈31.8mH所以L_arm≈3.18mH。折算到交流侧的等效相电感约为L_arm/2≈1.6mH这个值后面做电流内环会用到。桥臂电感不要取得太小否则环流抑制压力很大也不要超过0.15pu否则动态响应变差而且电感上的基波压降会侵蚀可用调制范围。3. 环流怎么来的怎么在模型中压下去3.1 二倍频环流的形成机理与波形识别环流是MMC一个非常“有辨识度”的问题。它本质上是在直流母线正负极之间、通过三相桥臂形成内部回路流动的电流不经过外部电网因此在外部端口是看不到的。你只能在桥臂电流里发现异常桥臂电流除了直流分量和基波分量之外还有明显的二倍频成分频率在50Hz系统里就是100Hz。产生机理还是回到功率波动。每相桥臂的瞬时功率是脉动的三相加起来大致恒定但单相内部总有能量从直流侧流进桥臂电容再流出的过程。由于三相桥臂的功率脉动存在相位差这些内部能量就顺着三相桥臂和直流母线之间循环流动形成二倍频环流而且三相合起来呈现负序特性的旋转对称关系。环流幅值会随着传输功率增大而增大严重时能把桥臂电流的峰值顶高百分之二三十器件应力和损耗都跟着涨。仿真里怎么识别把上、下桥臂电流相加再除以2减去理论上的直流电流分量约等于直流母线电流的三分之一剩下的就是环流。如果这个量里能看到清晰稳定的100Hz正弦波幅度远超噪声水平环流抑制就该出手了。3.2 三种环流抑制方案的仿真实现对比抑制环流常见有三条路我在仿真里都试过各自特点比较鲜明。第一种是单纯加大桥臂电感。电感对二倍频环流有天然的阻抗作用效果直观但代价也直观电感体积、成本、基波压降全上去了而且电感过大还会引发和子模块电容之间的谐振风险。所以这个方法只适合作为辅助不能作为主要手段。第二种是在二倍频旋转坐标系下做PI控制也就是经典的CCSC方法。思路是把三相环流分量做一个坐标变换用2ω角速度旋转的坐标系把它变成dq直流量然后用PI控制器把d、q轴误差压到零输出再反变换成三相加到桥臂调制波上。这个方法物理意义清楚PI参数调起来有规律但坐标变换和正负序方向容易搞混我在这上面吃过亏。第三种是用静止坐标系下的PR谐振控制器谐振频率对准100Hz。控制器形式一般是kPkR·s/(s²ω₀²)在100Hz处提供高增益把环流的二倍频分量压下去对其他频段影响很小。仿真里这个方案最省事不用变换坐标直接检测环流加减到调制波上就行。我的模型最终用的就是PR方案谐振增益取比例增益的10倍左右中心频率按电网频率实时自适应会更好固定100Hz也无伤大雅。方案实现方式动态性能参数复杂度仿真成本增大桥臂电感主电路参数无源响应慢低无额外开销-2ω旋转坐标PI坐标变换PI快但依赖坐标正确中低PR谐振控制静止坐标谐振器快针对性强低低3.3 环流抑制和均压策略的耦合处理这里要提醒一个容易忽略的细节均压排序和环流抑制不是完全独立的。排序法频繁改变子模块投入状态本身就会给环流注入扰动而环流抑制器输出的是共模性质电压作用在上下桥臂上时又会轻微改变调制比和子模块充放电分布。两者同时打开以后如果参数都调得很激进可能会出现“均压把环流压住环流又让均压发抖”的奇怪振荡。我的处理方法是分步调试。先把均压排序单独开起来观察电容电压收敛再把环流抑制单独开起来看100Hz分量是否被压下去最后两个同时开观察波形是否保持稳定。如果出现耦合振荡优先把环流抑制的谐振增益降一点通常比动均压参数更有效。这个顺序看着笨但确实能少掉很多头发。4. 并网侧控制锁相、dq电流环与功率外环的搭法4.1 SRF-PLL锁相环节的搭建与参数并网控制的第一步是拿到电网电压的幅值、频率和相位最常用的是同步旋转坐标系锁相环SRF-PLL。原理不复杂把三相电网电压先做Clark变换到αβ再用PLL输出的角度θ做Park变换得到dq分量。如果θ对准了电网电压矢量q轴分量应该等于0只要有偏差q轴就会有一个误差信号用PI控制器把这个误差拉回零PI输出就是角频率偏差积分后得到θ。仿真搭建时要注意带宽整定。PLL带宽太低锁相过程慢并网瞬间动态差PLL带宽太高电网电压里的背景谐波会污染相位dq变换出来的角度都在抖动。我一般按带宽10~30Hz、阻尼比0.707来设计PI参数网压畸变严重时往低取。Simulink里各步骤都是现成模块Clark可以写一个3×2的增益矩阵Park用Fcn或者查表做三角函数PI限幅要做积分器初值可以设电网额定角频率这样启动阶段收敛快一点。4.2 dq轴电流内环对象、PI参数与解耦前馈电流内环的被控对象不能直接套两电平的公式。MMC的桥臂电感上下并联折算到交流侧的等效电感约为L_arm/2再考虑交流侧如果加了滤波电感就一起加上。在这个基础上dq轴电流方程里存在交叉耦合项ωL·iq和ωL·id必须用前馈补偿项把这个耦合拆开不然d轴指令一变q轴电流会跟着晃。电流环PI的整定我喜欢按带宽法来。给定电流环带宽f_bw大概取1/5到1/10的等效开关频率。载波频率1.5kHz时等效开关频率接近15kHz但实际控制周期有限带宽取300~500Hz比较稳妥。然后根据等效电感L_eq和等效电阻R_eq算出kp≈L_eq×2πf_bwki≈kp×R_eq/L_eq或者直接按时间常数来。实际上这个公式出来是一个比较合理的初值仿真里微调10%~20%就能出不错的波形。Simulink里实现时控制器用离散化比较省事采样周期取100μs左右即可。PI块建议用Tustin法离散避免前向欧拉在大增益时产生极限环。4.3 直流电压外环与无功通道电流内环给了快速的有功/无功电流控制能力但电流指令谁给出有功电流指令一般来自直流电压外环。MMC的直流侧等效电容是几十个子模块电容串联的结果动态特性比两电平直流母线慢很多所以直流电压外环的带宽必须显著低于电流环。我习惯把外环带宽取电流环的1/5以下PI参数按同一套带宽法算出来的效果是直流电压缓慢而稳定地跟随给定不出现振荡。无功电流指令在仿真里可以直接设0实现单位功率因数并网。如果想看动态也可以给一个无功阶跃观察并网电流的无功分量变化。这里需要注意符号约定常见的电网电压定向坐标系里有功功率P1.5·ud·id无功功率Q-1.5·ud·iqiq方向定义不同会差一个负号调试前先把坐标变换方向确认清楚。4.4 控制输出如何折算到上下桥臂调制波控制器算出来的是三相交流侧的相电压参考值v_phase。MMC里这个参考值不能直接当调制波用因为上下桥臂各有各的直流偏置。我用的分配关系是上桥臂每个子模块的调制波v_up_j (Vdc/2 - v_phase_ref v_cir_comp) / N下桥臂每个子模块的调制波v_down_j (Vdc/2 v_phase_ref v_cir_comp) / N这里Vdc/2/N是子模块的直流电压偏置v_cir_comp是环流抑制器输出的共模补偿电压上下桥臂加的是同一个量不会影响交流输出电压。得到的调制波要除以子模块电容额定电压Vc做归一化落在0~1区间内参与PWM比较。这个接口是最容易出错的地方我见过不少模型在这里符号反了输出相电压直接少一半或者多一堆直流偏置波形怎么调都调不对。5. Simulink模型从零搭起的实操记录5.1 模型架构与交付物的层次一个能跑顺的MMC并网模型结构上一定要分层不然调试时你会迷失在几十个子模块的连线里。我的顶层模型分成五个子系统三相电网与并网接口、MMC主电路、调制与均压控制、并网控制器PLL外环内环、环流抑制器。网侧用一个理想三相电压源串线路阻抗即可并网点加一个断路器模拟0.2s左右合闸并网。主电路部分不推荐用Simscape自带的IGBT器件模型去搭60个子模块仿真代价太大我采用的是理想开关函数模型也就是每个子模块等效成一个受控电压源输出电压等于开关信号乘以电容电压电容电压则通过对桥臂电流做积分获得。这样既保留了子模块电容储能、电压波动和环流这些核心物理特性又避开了器件级求解的负担仿真速度可以接受。每个桥臂封装成一个子系统里面有10个子模块子系统和桥臂电感。子模块建议用Mask封装把C、Vc0作为参数暴露出来这样后续改电平数也就是改参数加复制模块的事。5.2 子模块理想开关函数模型的落地子模块理想模型的数学关系非常简洁开关函数s1表示子模块投入电容接入桥臂s0表示旁路电容被短路。子模块端口输出电压v_sm s × vc电容电流ic s × i_arm电容电压vc 1/C ∫ ic dt初始值设为Vdc/N在Simulink里这个模型可以写成离散化的Matlab Function也可以用积分器加逻辑运算搭。核心逻辑如下function [v_sm, vc_next] sm_ideal(s, i_arm, vc, C, Ts) % 理想半桥子模块模型 % s: 开关信号1为投入0为旁路 % i_arm: 桥臂电流从Simscape电流传感器获取 % vc: 上一时刻电容电压初始外部设为Vdc/N ic s * i_arm; vc_next vc (1/C) * ic * Ts; % 前向欧拉离散积分 v_sm s * vc; end这里有个关键坑如果直接用Controlled Voltage Source的输入输出和电流测量形成闭环很容易产生Simulink代数环模型跑不动或者结果明显不对。解决方法是把开关信号s通过一个Memory或者Unit Delay延迟一个仿真步长再送入子模块相当于PWM在执行上有一拍延迟。这个延迟在工程里本来就有仿真中接受它即可。5.3 启动、步长、代数环与数值发散仿真参数这块我的配置是定步长离散求解器步长取1e-5秒载波频率1.5kHz时一个载波周期有约66个仿真步长波形解析度足够。定步长主要理由是PWM比较信号在每个步长的确定性更好变步长求解器遇到开关时刻会频繁细化步长仿真慢且容易触发数值噪音。启动问题比参数更容易翻车。子模块电容初始电压如果设成0模型一开始就是一个低压电容串联进高压回路充电冲击电流能冲到额定值的几十倍波形完全失真。正确做法是把所有子模块电容初始电压设为Vdc/N让模型在启动瞬间就处在正确的直流偏置点附近并网断路器再延迟几十毫秒合闸进一步避免电网和主电路之间的初始相位冲击。数值发散还有一个常见来源控制器输出限幅没做好。调制度一旦超过1PWM进入过调制区输出波形出现大量低次谐波电流激增整个模型发散。调制波上限一定要钳位在0.98左右留一点死区别等到波形飞了再查。5.4 波形验证清单模型跑通之后我用一张检查清单逐项核对避免“看起来在动”就以为正确。这里给出正常和异常的特征对照调试时非常实用。检查项正常特征异常特征及可能原因相电压波形11级阶梯波叠加PWM纹波只有2~3级载波相位没错开或每桥臂子模块数设成了1子模块电容电压围绕2000V波动幅度约±5%个别模块发散排序未生效或初始电压没设置桥臂电流直流基波小幅100Hz分量100Hz分量很大环流抑制未开或参数太弱并网电流正弦THD约3%以下低次谐波大可能过调制或PLL锁相不稳直流电压稳定跟踪给定波动小持续振荡外环带宽太高或电流环带宽接近载波频率6. 从仿真到实物之前还有哪些坑要留个心眼6.1 标幺值换算与样机参数映射仿真模型用的是10kV/10MWA这个量级做完之后想往实验室样机迁移很多人直接按百分比缩小参数最后发现环流抑制效果和电容电压波动完全对不上。正确做法是按标幺值换算桥臂电感保持0.1pu左右根据样机电压和容量用LL_pu·V²/(ωS)反算实际亨利值子模块电容保持相同的储能时间常数和电压波动率反算实际法拉值。电压等级变了但标幺值体系不变控制参数和波形形态才能在工程上延续。6.2 器件数量、开关频率与冗余设计11电平MMC用了120个IGBT器件数量多故障概率也随之上去了。工程上通常会把每桥臂子模块数做N1甚至N2多出来的模块平时不参与调制坏了之后通过旁路开关顶上去。仿真里也可以模拟这个场景人为把一个子模块的开关信号改成旁路观察均压和环流会不会突变这是验证容错控制逻辑最直接的方式。单个子模块的开关频率低不代表散热压力小。MMC的损耗分布和两电平不一样导通关断损耗相对低但电容的纹波电流和电感的铜损可能更突出。做热设计时别把注意力全放在IGBT上子模块电容的纹波电流耐受能力往往是短板。6.3 我踩过的三个典型坑第一个坑是载波移相的相位没真正错开。我用了一个载波源复制出N路信号忘了给每一路加相位偏移结果所有子模块的PWM比较结果几乎同步变化相电压波形直接退化成两电平。排查方式很粗暴把N路载波信号画在同一张图上看相位是否均匀铺满一个周期。载波移相的“移相”二字落实在模型里就是每个子模块三角载波相位依次增加1/N周期。第二个坑是排序均压的采样频率不够。我开始把均压计算放在和控制系统一样慢的100μs采样周期上10个子模块的排序在一拍内完成看似没问题但实际效果很差电容电压有高频分量逃过了采样。后来把均压的执行频率提到和PWM载波一致的周期效果立刻改善。排序这种事时间分辨率决定上限。第三个坑是PR环流抑制器的离散化。直接在连续域设计好参数放到离散模型里谐振点会漂移100Hz的增益实际上落到90Hz或者110Hz环流抑制效果打折甚至引入新的低频振荡。解决办法是用Tustin变换加预畸变或者直接在离散域设计谐振器让中心频率精确对准100Hz。这个细节在文档里很少写但仿真结果差之毫厘失之千里。最后说一点个人体会。模型的每个数字都对应物理意义载波相位错开就意味着桥臂各子模块轮流分担电压排序均压就是让能量在时间和子模块之间重新分配环流抑制则是把三相之间来回倒腾的无功能量按回去。把这些想明白之后看波形就不再是“像不像正弦”这么简单你能从每一个纹波里读出它从哪来、过不过分。建议你把环流抑制这一路单独摘掉跑一次对比亲眼看100Hz分量在桥臂电流里涨起来的那一下对MMC的理解会扎实很多。