1. MMC 为什么值得花精力去啃
1.1 在众多主流拓扑里,MMC 的核心优势在哪
模块化多电平变换器(MMC)这几年几乎成了高压大功率电能变换场景里的默认答案。它最醒目的一点,是“模块化”和“多电平”两个词本身就点破了它和传统两电平拓扑的根本差异。两电平变换器要处理高电压,通常得把功率器件直接串联,还要做复杂的动态均压;而 MMC 把电压压力拆散到几十甚至几百个子模块上,每个子模块都是一个标准化的功率单元,电压等级低,器件选型容易,扩容时只需要增加桥臂里的子模块数量,不需要推翻整个主电路结构。
从应用侧看,MMC 已经覆盖了高压直流输电、海上风电送出、静止无功补偿、储能、中压变频驱动等大量场合。它输出的交流电压是逼近正弦的阶梯波,谐波含量低,很多时候可以省掉传统方案里体积庞大的交流滤波器。更关键的是,它的等效开关频率可以做得很高,但每个功率器件实际动作频率又很低,损耗和散热压力都被摊薄了。代价也很明显:需要在控制层面同时处理好电容电压均衡、桥臂环流抑制、子模块投切调度这几件事,这让它的控制链路比一般 PWM 变流器复杂得多。
我觉得所有刚开始接触 MMC 的人,第一反应都是“拓扑不复杂,但控制确实绕”。模块化的好处和控制的复杂度,本质上是一枚硬币的两面。想真正理解它,靠看论文里的公式很慢,靠搭硬件很贵,仿真反而是性价比最高的切入点。
1.2 仿真学习是理解 MMC 的最高效路径
很多人学 MMC 时,最先接触到的是一堆看起来非常劝退的波形:电容电压波动、二倍频环流、调制波和载波的相位关系、排序算法的开关动作……这些量在实物台上很难直接观测,因为子模块电位是悬浮的,你不可能拿示波器探头随便去挂电容两端。但在仿真里,每个子模块的电容电压、每根桥臂的电流、每个开关管的门极信号都是现成的,想看哪条就看哪条,根本不需要考虑测量安全。
仿真平台的另一个优势是可以分阶段验证。你可以先只运行一个单桥臂模型,把最近电平逼近和排序均压调通,再扩展到三相;也可以先关掉环流抑制器,看看桥臂电流里出现什么畸形,再打开抑制器看它怎么消除。这种“只改变一个变量”的调试节奏,在实物实验中很难做到,因为硬件电路里各个因素天然耦合在一起。
选平台时也不必纠结到某个固定工具。通用的电力电子仿真软件都支持 MMC 建模,区别主要在于模型复杂度、仿真速度和器件模型精度。如果只是想理解调制和均压逻辑,用最普通的离散仿真平台就够了;如果要研究器件损耗、故障电流关断这些更细的问题,再考虑更精细的器件模型。学习阶段最怕的不是工具不够强,而是模型太庞大,一个仿真跑半小时,调参效率极低。
1.3 适合谁,需要什么基础
我接触过几种典型读者:一种是电力电子方向的在读学生,正在做毕业设计相关课题;一种是刚从两电平变流器转向中高压传动或直流输电的工程师;还有一种是想快速了解 MMC 技术栈的电力系统从业者。这三类人的共同点,是已经有了三相交流、PWM 调制、闭环控制的基本概念,但还没系统梳理过 MMC 的控制链路。
如果一点基础都没有,建议先补两个前置模块:一是三相逆变器的 dq 解耦控制,理解交流电流内环是怎么工作的;二是 SPWM 和载波调制的含义,理解开关信号和调制波之间的关系。有了这两块底子,MMC 的学习难度会明显下降。反过来,如果一上来就被子模块排序算法绕进去,很容易在细节里迷失方向。
2. 从子模块到桥臂:先搞懂电平是怎么叠加出来的
2.1 桥臂拓扑的结构逻辑
MMC 的三相结构可以看成每相由一个上桥臂和一个下桥臂串联组成,上下桥臂的连接点就是交流输出端。每个桥臂内部,由 N 个子模块(Submodule,SM)和一只桥臂电抗器串联而成。直流母线电压加在上下桥臂的两端,通过控制桥臂内子模块的投入数量,就能在交流侧得到不同的电压输出。
这个结构里有一个容易忽略但很关键的点:桥臂电流并不只有交流分量。上桥臂和下桥臂之间流过的是直流电流与交流分量的叠加,所以桥臂电流既包含直流成分,也包含基波交流成分,还有二倍频环流成分。很多初学者盯着交流输出波形看,却忽视了桥臂电流的复杂性,后面仿真报警或者波形异常时就会找不到原因。
桥臂电抗器的作用也不只是滤波。它首先限制子模块之间的瞬态环流,其次在直流侧发生故障时限制故障电流上升率,而且它还参与桥臂能量交换过程。电感值和电容值一样,是 MMC 主电路参数设计里绕不开的两个核心量。
2.2 半桥子模块的状态逻辑
最常用的半桥子模块由两个带反并联二极管的开关器件、一个直流电容组成。它的输出端只有两个电平:当上管导通、下管关断时,子模块输出电容电压,称投入状态;当下管导通、上管关断时,子模块输出为零,称旁路状态。
实际的功率器件开关都会有死区,同一桥臂上下两个开关管不能瞬间完成切换,否则会出现直通短路。不过在模型层面,我们通常先用理想开关模型把控制逻辑打通,再逐步加入死区时间,这是很实用的建模顺序。加死区后,子模块在开关切换瞬间会出现一个短暂的“上下管都不通”的过渡状态,电流由二极管续流,子模块输出电平由电流方向决定。理解这个细节以后,看现场实验波形就不会觉得奇怪。
半桥子模块的电容电压在投入期间会随桥臂电流方向而充放电。充电还是放电,取决于子模块电流方向。这个“投入放什么电、旁路不参与充放电”的规律,是整个电容均压策略的基础,也是排序算法里为什么需要检测桥臂电流方向的原因。
2.3 相电压和线电压到底有多少电平
单看一个桥臂,N 个子模块只能输出 0 到 N 共 N+1 个离散电压台阶。三相 MMC 的相电压是由上桥臂和下桥臂共同决定的:上桥臂投几个、下桥臂投几个,决定了交流出口对直流中点的电位。当上下桥臂投入数量动态调配时,相电压就能在更大范围内呈现更多电平。
工程上常说 MMC 的输出电平数是 2N+1,指的是线电压能看到的电平数。NES,如果每桥臂 5 个子模块,线电压波形就是 11 电平。电平数越多,阶梯波越接近正弦,谐波表现越好。但代价是需要的子模块数、驱动通道和控制系统规模都成倍增加,所以实际工程会在电平数和谐波要求之间做权衡。
这种“离散电压台阶逼近正弦”的思路,是理解后续所有调制技术的大前提。不管用最近电平逼近还是载波移相 PWM,本质上都是在确定一个当前控制周期内“应当投入几个子模块”,以及“具体投入哪几个子模块”。
3. 调制技术:NLM 与载波移相 PWM 的工程实现
3.1 最近电平逼近:模块数量多时的天然选择
最近电平逼近(Nearest Level Modulation,NLM)的思路非常直接:每相电压参考值折算成“期望投入的子模块数量”,然后四舍五入到最近的整数,得到当前桥臂需要投入的子模块数 N_on。控制环节只需保证桥臂里任意时刻有 N_on 个子模块处于投入状态,其余子模块旁路。
NLM 的优势是计算量小、开关频率低,特别适合每桥臂有几十甚至上百个子模块的高压直流这类场景。当 N 很大时,四舍五入产生的量化误差很小,输出的阶梯波已经足够接近正弦。但注意,如果每桥臂只放 3 到 5 个子模块,量化台阶太大,输出电压的谐波性能会明显变差,这时候通常要换载波移相 PWM。
在仿真里实现 NLM 时,最容易犯的错是把调制波范围直接当成子模块数。正确的做法是先把参考电压归一化到 [-1, 1] 或者 [0, 1] 区间,再乘以 N 后取整。取整函数的选择也会影响波形,一般用四舍五入而不是直接向下取整,否则输出平均值会带一个直流偏置。
3.2 载波移相 PWM:模块数少时的精细控制
载波移相 PWM 的思路和传统 SPWM 一脉相承:每个子模块分配一路三角载波,所有载波频率相同、相位均匀错开 360°/N,各子模块共用同一个调制波。这样一来,每个子模块的输出仍是常规 PWM 波形,但 N 路 PWM 叠加之后,高频谐波互相错开,等效到交流侧的开关纹波频率被抬到了 N 倍载波频率,滤波压力大大下降。
我在学习阶段模拟过一个每桥臂 5 个子模块的案例,载波频率 1000Hz,输出侧等效纹波频率接近 5000Hz,谐波特性完全不是单个 PWM 可比。这也是为什么中压传动、中低电平 MMC 应用特别偏爱载波移相策略。
载波移相 PWM 的一个实现坑在于载波的初始相位分布。如果 N=5,五路载波相位必须是 0°、72°、144°、216°、288°,任何两路如果初始相位相同,叠加效果就退化,输出波形里会出现明显的畸形。在离散仿真环境里,还要让载波周期和采样周期匹配,否则每周期载波采样点数不同,调制波的更新时刻会出现抖动。
3.3 调制策略在仿真里的落地细节
不管选 NLM 还是载波移相 PWM,控制层输出的调制波都不能直接拿来开关管子,它还需要叠加直流偏置、环流抑制量和上下桥臂的协同分量。调制波生成后,再进入“子模块选择”层:NLM 用最近电平逼近得到目标投入数,载波移相则直接给每个子模块生成独立的门极信号。
仿真建模时有一个非常实用的中间方案:子模块用受控电压源代替。桥臂电流输入到子模块模型,根据当前开关状态决定电容是充电还是放电,再把这个电压反馈到主电路。这样既保留了子模块电容的动态特性,又不需要每个子模块都建立完整的开关器件模型,仿真速度会快很多。
我觉得调制技术这块最值得投入时间的地方,不是背公式,而是把仿真波形拉开:控制参考值一条线、实际输出电压一条线、两者之差就是调制误差。把误差来源分清楚,是对调制技术理解是否到位的试金石。
4. 电容电压均衡与环流抑制
4.1 电容电压为什么必须控制
子模块电容在投入期间充放电,在旁路期间电压保持。由于各子模块投入时间、开关动作先后、电容参数差异等多方面原因,如果不做任何干预,几十上百个子模块的电容电压会逐渐离散化,有的偏高、有的偏低。电容电压过高会直接威胁器件耐压,电容电压过低则会让输出电压波形失去预期形状。
解决这个问题的核心思路,是利用同一桥臂内子模块的冗余自由度。同一时刻,桥臂里需要的投入数量是确定的,但具体投入哪几个子模块是可以选择的。只要根据桥臂电流方向和电容电压状态,动态挑选最需要充电或者最需要放电的那几个子模块投入,就能把电容电压拉回到一个合理范围内。
这种办法不需要识别电容参数,不需要复杂的模型,只需要得到电容电压的排序信息和桥臂电流方向,因此也成为实际工程中最主流的策略。
4.2 排序均压的算法和最小开关动作技巧
最简单的排序均压逻辑可以这样描述:桥臂电流方向决定电容是充电还是放电。如果电流方向是充电,就优先投入电压最低的子模块,让低电压模块先充上来;如果电流方向是放电,就优先投入电压最高的子模块,让高电压模块先把能量释放掉。每次只要调整投入数量,就对当前处于投入状态的模块和旁路状态的模块分别排序,做一次选择。
function gate = select_sm(sm_vc, gate_old, arm_current, N_on_target) N = length(sm_vc); dN = N_on_target - sum(gate_old); % 需要的投入数量变化 if dN > 0 candidates = find(gate_old == 0); % 从旁路模块里选 if arm_current > 0 % 充电方向 [~, idx] = sort(sm_vc(candidates), 'ascend'); else % 放电方向 [~, idx] = sort(sm_vc(candidates), 'descend'); end pick = candidates(idx(1:dN)); gate = gate_old; gate(pick) = 1; elseif dN < 0 candidates = find(gate_old == 1); % 从投入模块里选 if arm_current > 0 % 充电方向 [~, idx] = sort(sm_vc(candidates), 'descend'); else % 放电方向 [~, idx] = sort(sm_vc(candidates), 'ascend'); end pick = candidates(idx(1:abs(dN))); gate = gate_old; gate(pick) = 0; else gate = gate_old; % 数量不变则不动作 end end上面的代码体现了“数量不变就不动作”的原则,这样能明显降低开关频率。实际工程还会加一道电压滞环,只有电容电压偏差超过阈值时才主动调整选择,进一步抑制不必要的投切。
现实中还有一种更聪明的做法:优先选择相邻子模块切换,或者保持上一周期的开关状态,尽量减少单个器件在一个控制周期内的开关动作。这对于降低损耗和电磁干扰都很重要。算力方面,当每桥臂子模块数达到几十个时,每次排序都用最快的排序算法,避免 O(N^2) 的复杂度拖累控制周期。
4.3 环流抑制:控制量怎么叠加进去
三相 MMC 里,桥臂电流之间不是完全独立的。上下桥臂之间、三相桥臂之间会形成水平方向的环流,其中最典型的是二倍频环流分量。它不参与交流输出,纯粹在直流母线和桥臂之间流动,导致桥臂电流的有效值增大、损耗上升,还给子模块电容电压带来额外扰动。
环流抑制的基本思路,是在每相上下桥臂的调制波上叠加一个大小相等、方向相反的修正量,主动产生一个抑制二倍频电压差的分量。最常用的控制器是比例谐振(PR)控制器,谐振频率设在 2 倍基频;也可以把二倍频负序分量变换到旋转坐标系,用 PI 控制器处理。
我调试时习惯先把环流抑制器关掉,观察桥臂电流里明显的二倍频扭动,再把控制器打开,看这个扭曲被拉回正弦形状。这种对比练习对理解“环流从哪里来、抑制到哪里去”非常有帮助。从控制链路看,环流抑制的输出是附加在调制波上的电压修正量,它不会改变总投入子模块数,但会影响具体每个子模块的占空比和导通时刻。
5. 仿真模型搭建与参数整定全流程
5.1 从最小系统开始:模型架构
搭建 MMC 仿真模型时,我强烈建议从最小系统开始,而不是一上来就搭一个完整的三相 201 电平系统。最小可运行系统的典型配置可以这样设计:
- 直流侧用理想电压源,电压设为 Vdc;
- 每桥臂 5 个半桥子模块;
- 每个子模块用理想开关管和电容建模;
- 桥臂电抗器取值具体数值;
- 三相负载用电阻或电阻电感负载;
- 控制部分包含参考电压生成、调制、排序、环流抑制。
采用理想开关而不直接用带详细半导体物理特征的器件模型,是为了先把控制链路跑通。开关过程细节留到以后再加。仿真求解器推荐用离散求解器和固定步长,比如 5 微秒或 10 微秒步长。固定步长能让 PWM 信号和控制更新时刻对齐,不容易出现代数环和非物理振荡。
模型里还要处理好信号采样时刻。如果用控信号直接采样主电路量,而采样时刻与控制更新时刻混在一起,会出现同一时刻信号相互依赖的代数环。常见解决办法是在采样后加一个单位延时或 memory 模块,让控制量滞后一拍更新。这一拍滞后在物理上是真实存在的,因为控制器本来就是“先采样、再计算、后输出”。
5.2 子模块电容和桥臂电感参数怎么估算
子模块电容的设计依据,是电容电压纹波允许范围和桥臂能量波动幅度。电容太小,电压波动会超过允许值;电容太大,体积成本直线上升。精确计算需要从桥臂瞬时功率积分得到能量波动峰峰值,但工程速算可以抓住一个基本公式:
C ≥ ΔE / (2 × Uc × ΔUc)
其中 ΔE 是一个周期内单个子模块电容存储能量的波动峰峰值,Uc 是额定电容电压,ΔUc 是允许的电压波动幅值。ΔE 可以从仿真波形里直接观察到:把单个子模块的瞬时功率积分,就能得到能量时域曲线,取最大值和最小值之差即可。
举个例子,假设每桥臂 5 个子模块,直流母线电压 10kV,子模块额定电压 2kV,交流侧视在功率 2MVA,基波频率 50Hz,目标电容电压纹波控制在 ±5%。先用理论经验或初步仿真得到单模块能量波动峰峰值约 20J,于是 C ≥ 20 / (2 × 2000 × 100) = 5 × 10^-2 F,也就是 50mF 左右。这个数量级对低压小功率仿真模型来说偏大,实际系统还要结合子模块数量和开关频率优化。对初学者来说,我更建议先取一个大概值,然后跑仿真看电压纹波,再逐步减小电容,直到电压纹波接近设计上限。
桥臂电感的选择通常按百分比阻抗考虑,常见范围是 0.1 到 0.15 倍额定基波阻抗。电感太大,系统动态响应变慢,电抗器体积也大;电感太小,环流抑制和故障电流限制能力不够。选取后同样看仿真里桥臂电流的畸变情况,再微调。
5.3 控制循环、采样与仿真求解器设置
控制循环是 MMC 仿真里最容易出问题的地方。一个典型控制周期包含几个固定步骤:采样主电路电压电流,计算调制参考,执行电容排序和子模块选择,最后更新开关信号。每一步都应该分配在特定的时间点完成,不能把计算逻辑全部塞进一个连续模块。
离散仿真里,载波频率与采样频率必须协调。载波移相 PWM 通常要求载波计数器和控制采样同步,比如在每个载波周期的峰值点更新调制波。这样既满足自然采样法的近似效果,也能避免不同步造成的低频拍频干扰。用双更新模式时,控制频率可以做到载波频率的两倍,动态响应更好,但也要求控制器计算时间足够短。
我见过很多初学者把仿真变步长设成默认值,结果某一步长特别小导致仿真时间暴涨,还有的把控制模块和主电路模块放在同一个代数环里,导致求解器完全卡死。这两个问题分别对应两个策略:一是模型能离散尽量离散,二是控制链路里主动插入单位延时。学会这两招,仿真稳定性会立刻提升一个档次。
5.4 评价指标:波形要怎么看才叫调好了
判断 MMC 仿真是否调通,不能只看交流输出波形长得很像正弦。至少要检查以下几项:
第一,所有子模块的电容电压是否在额定值附近波动,波动幅值是否符合设计目标,离散程度是否可控。第二,桥臂电流是否接近理论形状,二倍频环流是否被抑制在较低水平。第三,输出电压的谐波频谱是否在预期位置集中,NLM 对应阶梯波误差,CPS-PWM 对应载波倍频附近的高频簇。第四,开关频率是否合理,没有因为排序算法产生大量无谓开关动作。
用 FFT 工具观察输出电压谐波时,留意频谱基波附近有没有不该出现的边带。如果低频段出现杂乱谱线,说明调制和控制之间还有时序问题;如果高频段出现明显的单根尖峰,那可能是载波相位安排出了问题。每次调参只改变一个参数,把波形和频谱的前后差异记录清楚,比同时调三五个参数靠谱得多。
6. 常见异常排查与学习路线建议
6.1 典型异常波形速查表
| 现象 | 可能原因 | 检查方向 |
|---|---|---|
| 电容电压逐渐发散,不收敛 | 排序均压策略未生效,或桥臂电流方向判断反了 | 检查电流方向与投入选择逻辑 |
| 输出波形电平数不对 | 调制波归一化错误,或子模块数量取整有偏 | 核对参考电压范围和取整函数 |
| 桥臂电流里二倍频分量很大 | 环流抑制器未启用,或谐振频率参数不准 | 打开环流抑制,核对谐振频率 |
| 仿真速度极慢 | 开关模型太细,或变步长求解器反复缩小步长 | 改用理想开关、离散求解器、固定步长 |
| 启动瞬间冲击很大 | 电容未预充电,或调制波起步台阶大 | 加入预充电过程,或采用软启动 |
| 输出电压波形有严重毛刺 | 死区未设置,或控制器采样到异常尖峰 | 加入死区,检查采样滤波 |
这张表不可能覆盖全部异常,但它代表了一类排查思路:先定位现象是主电路问题还是控制问题,再检查对应逻辑。调试时不要凭感觉乱调参数,每一步都基于波形现象去反推。
6.2 循序渐进的学习路线
我建议把 MMC 学习分成四个阶段。
第一阶段,做单桥臂模型,只跑 NLM 和排序均压。目标不是输出漂亮的三相波形,而是理解“投入几个子模块”和“投入哪些子模块”这两件事是怎么拆开的。第二阶段,扩展到三相模型,加入环流抑制,看桥臂电流的改善过程。第三阶段,把调制方式从 NLM 换成载波移相 PWM,对比两种方案在不同子模块数量下的谐波特性。第四阶段,再加入故障、功率翻转、启动预充电等内容,把动态过程也纳入观察范围。
每一阶段都应该有一个明确的收尾产出。比如第一阶段完成后能画出桥臂电流和电容电压都正常的截图;第二阶段完成后能通过 FFT 看到二倍频被抑制的对照;第三阶段完成后能讲清楚为什么低模块数下 CPS-PWM 比 NLM 更有优势。这些产出既是检验自己理解的方式,也是后续做硬件或写论文时可以直接引用的素材。
6.3 一点仿真之外的经验
我对 MMC 仿真最大的体会是:多数问题不是出在主电路拓扑,而是出在控制时序和信号尺度上。调试时遇到波形不对,先不要怀疑数学公式,应该先确认每个信号的单位、范围、采样时刻对不对。一个看似不起眼的参考电压偏移,完全可以被排序算法放大成很明显的波形畸变。
另外,我会在仿真工程里专门加一组“观察信号”:所有桥臂电流、所有子模块电容电压、调制波、目标投入数量、实际投入数量、排序输出信号。这些信号平时不一定要看,但出问题时它们能节省大量排查时间。做技术分析,很多时候不是分析能力不够,而是信息不完整。把观察信号设计周全,问题往往一眼就能定位。这个习惯帮我节省了非常多的尝试成本,写在这里,希望对后来者有同样的帮助。