MMMC与NLM建模仿真实战:从拓扑原理到电容电压平衡调试

发布时间:2026/10/8 4:07:41
MMMC与NLM建模仿真实战:从拓扑原理到电容电压平衡调试 做中压电机驱动和船用变频电源的方案预研时我绕不开一对比传统背靠背拓扑简单直接但直流母线电容的体积和寿命始终是痛点模块化多电平矩阵换流器MMMC拓扑复杂、控制自由度极高却能省掉整套直流母线储能直接把三相交流变成另一组三相交流。要把这条技术路线吃透仿真模型是最好的抓手而配合MMMC桥臂级调制的邻居电平逼近调制NLM更是绕不开的核心环节。这篇文章我会完整拆一遍MMMC与NLM的建模仿真过程从拓扑选型、调制原理、子模块建模到仿真参数的确定和跑通后的典型问题给正在做MMMC课程设计、毕业论文或者准备搭小样机验证算法的朋友一份可以直接参考的实操经验。1. MMMC拓扑的“为什么”交流-交流直通的代价与收益1.1 九个桥臂构成的三相变换矩阵MMMC的拓扑骨架不复杂输入侧三相节点各引出一条母线输出侧三相节点各引出一条母线两条母线之间用九个桥臂交叉连接排列成一个3x3的矩阵。每个桥臂由N个全桥子模块和一个桥臂电感串联而成。三个输入相分别是A、B、C三个输出相分别是U、V、W那么九桥臂就是连接A-U、A-V、A-W、B-U、B-V、B-W、C-U、C-V、C-W这九条路径。第一次看这张图的人都会问为什么不用6个桥臂因为三相输入到三相输出的单相变换理论上只需要3对桥臂比如A-U、B-V、C-W。但这样每一相的输出功率就只能来自对应的输入相无法实现能量在相间的灵活转移输入侧三相不平衡时系统直接崩溃。MMMC用9个桥臂把每一个输入相都同时馈给三个输出相每个输出相又同时从三个输入相取能量这种“网状”结构让能量分配自由度大幅提高代价是控制维度从简单的相轴控制变成了矩阵化的桥臂控制。MMMC没有直流母线电容但这不代表拓扑里没有储能元件——能量被“打散”到了每个子模块的电容里。输入侧电压经过子模块电容的充放电传递给输出侧电容电压的波动控制因此成了整个MMMC仿真中最敏感的问题。1.2 为什么子模块必须用全桥而不是半桥做MMC仿真的朋友对半桥子模块很熟一个半桥只能输出0或Vc两种电平所以MMC的桥臂电压只能从0往上叠加。但MMMC的桥臂连接的是两个交流系统桥臂两端电压差时正时负桥臂电压必须能够双向输出。全桥子模块通过四个开关管组成H桥每个电容可以提供Vc、0、-Vc三种输出状态串联N个全桥后桥臂总电压可以从-NVc连续步进到NVc。这个双极性能力直接决定了NLM在MMMC里的实现方式参考电压为正时投入正方向的子模块参考电压为负时投入负方向的子模块零状态所有子模块旁路。如果贸然用半桥负半周的参考电压没有任何物理实现途径调制算法再精确也没有意义。1.3 MMMC与MMC的本质差异很多人以为MMMC就是MMC的“矩阵版”建模仿真时把MMC的桥臂直接搬过来就能用。实际上两者的差异远比名字上的区别大这里列一张我认为最重要的对比表对比项MMC模块化多电平换流器MMMC模块化多电平矩阵换流器桥臂数量6个三相上下桥臂9个3x3矩阵输入输出交流到直流交流到交流子模块类型半桥/全桥均可必须全桥有无直流母线有没有能量控制维度上下桥臂间能量均衡输入相间、输出相间、纵向环流多维均衡典型应用HVDC输电中压变频驱动、风电汇集、电力电子变压器仿真模型的搭建层面上MMC的桥臂电流主要由直流分量和基波交流分量组成桥臂电容电压波动规律相对固定。MMMC的桥臂电流里同时存在输入侧频率和输出侧频率的分量还附带环流分量电容电压波动的幅值和频率组合都会更复杂。所以MMMC仿真模型的调试重点不是“拓扑能不能收敛”而是“九个桥臂的电容电压能不能同时稳定”——这一点会在后文重点展开。2. NLM调制在MMMC桥臂里的量化与落点选择2.1 从连续参考电压到离散电平最近电平逼近调制NLM的核心思路一句话就可以说清把理想桥臂电压参考值用离它最近的离散电平去逼近。假设一个桥臂有N个全桥子模块每个子模块电容电压为Vc桥臂能输出的电平档位就是从-NVc到NVc共2N1个离散值相邻档位间隔正好是Vc。NLM要做的数学运算其实就是一个取整n_ref round(u_ref / Vc)。这里的round不是四舍五入到小数而是取到最接近的整数。由于电容电压会有波动实际计算时应使用该桥臂的平均电容电压而不是额定值n_ref round(u_ref / Vc_avg)。得到n_ref之后还需要做限幅处理让n_ref落在[-N, N]区间内防止参考电压超过桥臂能输出的最大电平。量化误差是NLM天生的属性理想电压与输出阶梯电压之间的误差最大不超过Vc/2。这个误差会直接反映到输出电压谐波里。N4时的台阶感非常明显N20以上才会让输出波形接近正弦。这也是NLM适合高电平数场景的根本原因。2.2 全桥子模块的三种输出状态n_ref是一个带符号的整数。比如某时刻桥臂参考电压等于1.3Vcround之后n_ref1那么就需要一个子模块正向投入输出Vc其余子模块旁路输出0桥臂总电压近似等于Vc。如果参考电压等于-0.7Vcn_ref-1就需要一个子模块反向投入输出-Vc。写仿真模型的时候一定要把子模块投切状态设计成带符号的状态量s取值只能为1、0、-1s1正向投入输出Vcs0旁路输出0s-1反向投入输出-Vc桥臂总电压等于所有子模块s_i乘以各自电容电压再求和。NLM确定了“需要几个子模块投入”和“投入方向”但没确定“具体哪几个子模块投入”这个落点选择直接关系到电容电压均衡效果。2.3 电容电压排序NLM之外的必修课实际运行中各子模块电容电压不可能完全一致。如果每次NLM都固定让某几个子模块投入那几个电容的充放电次数就会持续累积电压最终发散。工程上最常用的方法就是排序法根据桥臂电流方向选择对电容电压均衡有利的子模块投入。判断规则并不难流过子模块的桥臂电流如果与子模块输出电压方向一致就会给该子模块电容充电方向不一致就放电。为了让电压低的电容多充电、电压高的电容多放电应让低电压子模块在充电状态优先投入高电压子模块在放电状态优先投入。写成MATLAB Function块里的逻辑如下function s_vector nlm_balancing(u_ref, vc_arm, i_arm, N) vc_mean mean(vc_arm); n_ref round(u_ref / vc_mean); n_ref max(-N, min(N, n_ref)); % 限幅 s_vector zeros(N, 1); n_abs abs(n_ref); if n_abs 0 return; end [~, idx_sort] sort(vc_arm, ascend); if i_arm 0 idx_sel idx_sort(1:n_abs); % 充电状态选电压最低的投入 else idx_sel idx_sort(N-n_abs1:N); % 放电状态选电压最高的投入 end direction sign(n_ref); s_vector(idx_sel) direction; end这段代码是基础版本足够跑通教学模型。但它在实际工程里有个明显短板——排序法会让子模块频繁地在投入、旁路之间切换等效开关频率可能高得离谱。这个问题我在后文“跑通之后必须处理的四个实际问题”里专门说仿真建模时先跑通、再优化。3. Simulink建模的核心取舍与搭法3.1 子模块模型开关级还是受控源等级MMMC仿真模型跑得慢九成是因为子模块建模方式选错了。开关级模型把每个全桥的四个IGBT和反并联二极管都画进电路里一个桥臂N个子模块就是4N个开关器件九个桥臂加起来器件数量极其庞大再加上NLM的离散跳变导致仿真步长频繁收缩跑一个工频周期可能要好几分钟甚至更久。更实用的做法是用受控电压源等效模型。每个子模块用一个可控电压源串联在桥臂回路中输出电压由投切状态s和电容电压Vc决定u_sub s * Vc。电容电压并不用真实的电容元件去仿真而是用一个积分器计算能量变化。全桥子模块投入时桥臂电流流过该子模块电容功率近似为P_sub s * i_arm * Vc所以dVc/dt s * i_arm / C。把这个式子写进积分器电容电压的动态特性就完整了。这种简化模型的优势非常明显没有高频开关瞬态仿真步长可以放到10微秒甚至更粗一套九桥臂矩阵在普通PC上很快就能跑完几十个工频周期。它损失的是开关损耗、死区效应和器件压降但这些细节对验证NLM逻辑和能量控制来说并不是主要矛盾。3.2 每相桥臂的结构与信号流向我习惯把每个桥臂单独封装成一个Subsystem端口固定为输入侧节点、输出侧节点、桥臂电流测量输出、NLM投切向量输入。内部结构是N个受控电压源串联再串联一个桥臂电感L_arm同时用电流测量模块获取桥臂电流。桥臂电流这个信号必须引出来一路给到控制侧的NLM和排序模块一路给到每个子模块的积分器。串联回路的电流处处相等所以N个子模块的积分器共用同一个i_arm这一点在连线时很容易漏。漏掉之后电容电压就会保持初值不变桥臂输出电压全靠受控源按额定Vc硬撑波形看起来正常实际上能量交换完全是错的属于仿真模型里最隐蔽的一类错误。受控源等效模型的另一个细节是数值稳定性。积分器计算dVc/dt时s_vector在NLM切换时刻会发生跳变积分器要能处理这种非连续输入。在MATLAB Function块里直接写状态方程再用内部积分器或者在Simulink里用普通积分器接s_vector和i_arm的乘积再除以C两种方式效果差不多。注意给积分器设一个合理的初值通常取额定电容电压比如200V。3.3 九桥臂矩阵接线与参考地选择九个桥臂的接线听起来复杂实际搭建时按矩阵逐点连就行。输入三相电压源A、B、C各引出三个桥臂一端桥臂另一端按列汇合到输出相U、V、W。也就是第一行的三个桥臂都接到输入A相但输出端分别接U、V、W第二行接输入B相第三行接输入C相。输入侧建议用理想三相电压源串一个小电感或电阻防止桥臂电流产生数值突变。输出侧接三相RL负载负载可以星形连接并将中性点接地这样整个仿真系统有明确的参考电位便于观察波形。实际样机里输入和输出往往通过变压器隔离未必有公共地但仿真教学阶段先按有参考地处理让模型先跑起来隔离与共模问题属于控制器设计层面的话题这里不做过度展开。3.4 开环参考电压的给法NLM和排序模块的输入之一就是桥臂参考电压。最早搭模型时我习惯用开环方式给参考先不接任何闭环控制直接用输入相电压减去期望输出相电压再叠加一个微小的共模分量作为每个桥臂的参考电压。例如桥臂A-U的参考电压可以写成u_ref_AU u_in_A - u_out_U_ref。其中u_out_U_ref是期望输出相电压的瞬时值。如果输出频率为25Hz、幅值200Vu_out_U_ref就是200sin(2pi25t)的某相表达式。共模分量根据能量平衡需求再叠加一个几伏到十几伏的修正量。按照这种开环方式模型可以动起来桥臂NLM能够正确实现电平逼近电容电压平衡也会起到一定效果。但要说彻底稳定还得靠外环把九个桥臂的平均电容电压控制到同一个水平这就是第四章要说的内容。4. 抄作业级参考参数与NLM模型的调试思路4.1 参数间互相制约的几条主线仿真参数不是孤立的前两个参数往往决定第三个参数的下限。三条主线分别是桥臂子模块数N与额定电容电压Vc共同决定桥臂最大输出电压能力。最高桥臂电压出现在输入相峰值与输出相峰值同相叠加时N*Vc必须覆盖这个峰值并留出15%以上的裕量。N越小Vc就得定得越高NLM的量化台阶也越明显。子模块电容C由允许的电容电压波动决定。MMMC的电容波动能量与输出频率关系很大低频工况下桥臂电流在一个周期内对电容持续充放电波动幅度成倍增加。估算时可以用半个基波周期内的能量变化除上允许的电压变化幅度先算出初值再在仿真里逐步加大到波动满足要求。桥臂电感L主要限制桥臂电流纹波和短路电流上升率。L太小仿真波形毛刺明显L太大电流响应变慢电压降也大。经验上先按0.08~0.12 p.u.取再根据电流纹波微调。4.2 一套可直接运行的演示参数我给出了一套用于教学验证的N4参数输入侧三相380V/50Hz输出侧25Hz的交流负载足够跑通整个模型参数数值说明输入相电压峰值311V380V线电压对应输入频率50Hz电网频率输出频率25Hz演示变频工况输出相电压峰值200V期望输出电压桥臂子模块数N4每次NLM最多投入4个额定电容电压Vc200V每个子模块子模块电容C3mF先按波动要求估算后微调桥臂电感L_arm1.2mH限制桥臂电流纹波负载电阻R10Ω输出Y形负载负载电感L_load20mH输出滤波电感仿真步长10us等效模型固定步长仿真时长0.5s10个输入周期12.5个输出周期这套参数下NLM量化误差对应一个子模块电压200V左右输出波形会明显呈梯形台阶状这是N4的固有现象适合先验证逻辑不适合跟正弦波比THD。真正体现NLM优势的场景一般是N取10以上。4.3 平衡环节为什么不能省开环仿真跑起来之后你很可能会发现电容电压总体趋势还算正常但九条桥臂之间飘得厉害有的桥臂平均电压慢慢爬到230V有的掉到170V。这背后的原因是MMMC的环流自由度太多输入相间、输出相间、输入到输出之间的环形能量路径都会影响桥臂净能量。最简单的桥臂能量平衡做法是给每个桥臂的参考电压叠加一个修正项。先算全局平均电容电压和该桥臂平均电容电压的差差值为正说明该桥臂能量偏高应让它多放电那么修正项的方向要让桥臂电流对该电容多放电。实际操作中可以用一个简单的PI调节器输出功率修正量再换算成参考电压修正量。误差量不要直接叠加在NLM的输入上而不加限制修正幅度一般控制在额定参考电压的5%以内否则会干扰正常的电压合成。我在模型里通常把九个桥臂的平均电容电压都取出来用总线汇集再进一个平衡控制Subsystem输出九路修正参考电压加到各自的NLM输入上。这样既能保证子模块间均衡由排序法负责也能保证桥臂间均衡由外环负责分层清晰调试起来也方便定位问题。5. 跑通之后必须处理的四个实际问题5.1 排序算法把开关频率拉满的问题基础排序法能很快把电容电压压均匀但它不关心每个子模块上一时刻处于什么状态。可能出现的情况是上一周期第1、2号子模块投入这一周期排序结果变成第3、4号投入下一周期又回到第1、2号。投切指令在几个子模块之间来回跳每个子模块的开关动作频率远超NLM所需的最低值。降低开关频率的经验做法是加“保持优先级”在当前周期的投入数量不变的情况下优先让上一周期已经被投入的子模块继续投入不够的再根据排序结果补齐如果数量减少了优先切除上一周期投入但当前电压最高或最低的那部分。这种方法在工程里叫“最小开关次数排序法”对NLM的N值越大收益越明显。5.2 低电平数下NLM量化误差过大N4的量化台阶是200V/阶输出波形在零点附近尤其难看负电平到正电平之间是直接跳变谐波含量很高。你如果拿这篇文章的参数去仿真一定不要急着怀疑模型搭错了——这个台阶是NLM的数学属性决定的不是bug。如果要改善波形有两个方向一是把N提高到10以上台阶降到几十伏波形明显平滑二是在NLM基础上叠加占空比补偿让处于边界的子模块在高频PWM周期内按比例投入等效于在两个离散电平之间插入连续调制这也是工程上常说的“NLM载波移相混合调制”。教学模型不建议一上来就搞混合调制先把纯NLM的台阶特征看清楚再逐步加补偿更容易理解两者的差异。5.3 桥臂间电容电压漂移除了前面提到的平均能量平衡外桥臂内部N个子模块的电容电压排序也不可能做到完全无差。NLM是离散的只有在变换器运行足够多个周期后排序法才能让每个子模块的累计充放电量趋于一致。仿真中观察电容电压时应该在稳态后截取几周波波形来看波动范围不要看前几个周期的瞬态值。如果某个桥臂的平均电压持续上升第一步检查该桥臂电流测量和投切状态的方向是否匹配。受控源模型里最常见的问题是受控电压源输出电压极性与积分器的电流方向定义反了导致电容不仅不充电反而持续放电。检查时先断开电网只给桥臂一个直流参考电压看电容电压变化方向是否符合物理直觉。这个方法适用于所有MMC家族拓扑排查效率很高。5.4 仿真速度和步长的经验值等效受控源模型的步长不要盲目往小了压。固定步长10微秒对于NLM的基波动态完全够用再小只会白白增加仿真时间。如果你觉得波形毛刺多优先怀疑的是桥臂电感太小或受控源切换瞬间的代数环而不是步长不够。开关级模型如果非得跑建议只保留一两个桥臂来验证驱动信号逻辑别拿完整的九桥臂开关级模型做长时间稳态仿真。我的经验是开关级模型跑通功能、等效模型跑控制和参数扫描两者配合效率最高。另外一个容易被忽略的加速点是关闭不必要的波形存储。Simulink默认会把大量中间信号存进工作区给“To Workspace”模块或者Scope的“Log signal data”选项关掉只保留需要分析的几个关键物理量模型速度经常能提升一倍以上。最后说点个人体会这套MMMC加NLM的模型我第一次完整跑通花了将近一周最难熬的不是NLM函数本身而是九个桥臂的电容电压在开环状态下总有两条桥臂压不住。后来想明白一个道理——MMC仿真默认上下桥臂对称能量平衡压力小MMMC的不对称来自输入和输出频率不同环流自由度多必须显式地把桥臂能量控制写进模型指望纯NLM排序自动收敛是不现实的。如果你准备在这个方向深入建议把N4模型里的C从1mF往上调亲眼看一看3mF和5mF时电容电压波动幅度差多少这个直观体验比读十篇论文都有用。