我在搭一套 N=6 的模块化多电平换流器(MMC)开环仿真模型,用 Simulink 跑波形。第一次以为只是把子模块复制粘贴就好,结果仿真出来一堆乱跳的电压,后来才发现问题几乎全出在载波相位、电容初值和桥臂参考波这三个地方。这篇文章把我从参数计算到模型搭建、从波形验证到踩坑排错的完整过程写出来,给准备做 MMC 仿真的同行一个可以直接复现的版本。内容默认按三相 MMC 来讲,N 表示每个桥臂的子模块数,N=6 对应每相 7 电平输出、线电压 13 电平,规模适中,特别适合用来理解多电平调制和后续闭环控制的开发。
1. 为什么先用开环模型:N=6的规模与验证目标
1.1 MMC的基本结构与N的物理意义
模块化多电平换流器最核心的结构特征,是每个相单元由上下两个桥臂串联组成,而每个桥臂又由 N 个子模块(SM)串联,再加上一个桥臂电感。半桥子模块是最常见的子模块类型,里面是两个带反并联二极管的开关管和一个悬浮电容,输出只有两种状态:投入时输出电容电压,旁路时输出 0。因为每个子模块输出的都是离散电压,当 N 个子模块串联起来以后,这个桥臂的输出电压就是一堆离散台阶的组合,N 越大,台阶越多,波形越平滑。
这里必须强调一个容易搞混的点:N=6 不是说整个模型只有 6 个子模块,而是每个桥臂 6 个。三相 MMC 一共有 6 个桥臂,所以子模块总数是 6N,N=6 时就是 36 个半桥子模块。如果只是搭单相模型,也有 2 个桥臂,12 个子模块。题目里只写了 N=6,一般默认是按三相模型来做,我下面的参数和步骤也按三相来展开。
MMC 这种拓扑之所以在直流输电和中压驱动里这么受欢迎,就是因为它能把高压分成大量低压子模块来承受,每个开关管只需要处理一个子模块电压,不需要像两电平变流器那样让所有功率器件直接扛整个直流母线电压。同时输出电压电平数多,谐波含量低,输出侧可以不接或者少接滤波器。N=6 的模型虽然达不到工程级的电平数,但已经足够看出多电平波形的典型特征。
1.2 开环仿真的定位
很多同学一上来就想做带电容电压排序、环流抑制、功率外环的“完整版”MMC,结果模型又大又慢,波形乱了根本不知道是控制算法的问题还是模型本身的问题。我的建议是先做开环,别嫌它“不够工程”。
开环并不是说模型里没有控制信号,而是说调制比和相位是固定给定的,控制器不会根据采样到的电压电流去调整开关状态。这样做的最大好处是,把“MMC 的电压合成是否正常”这个问题单独拎出来验证。你自己心里清楚参考波是什么、载波相位是什么,如果输出波形还不对,那问题一定出在拓扑搭错、参考波算错或者 PWM 生成方式不对,而不是一堆控制器参数纠缠在一起。
开环模型的价值还在于,它是后续所有闭环算法的基准。后面无论做电容均压排序、环流抑制还是有功无功控制,都需要先确认调制层没有问题。我见过有人开环波形里相电压明显只有 3 个电平,还急着去调均压算法,那就是在烂地基上盖楼,浪费时间。
1.3 为什么N取6而不是2或20
N 的选择直接决定仿真规模和波形效果。N=2 时每个桥臂就 2 个子模块,相电压只有 3 电平,开关谐波很大,波形看起来和普通两电平变流器差不多,很难体现 MMC 的多电平优势。N=20 时波形确实漂亮,但三相就是 120 个子模块,Simulink 里光封装和连线就很痛苦,仿真步长一紧,运行速度会让你等到怀疑人生。
N=6 是个很舒服的中间值。相电压能到 7 电平,线电压能到 13 电平,已经能用肉眼看出阶梯波逼近正弦的效果,同时每个桥臂只有 6 个子模块,36 个 SM 的规模在普通电脑上还能接受。另一个实际原因是,N=6 时 Vdc/N 往往是整数,手算验证方便。比如直流母线取 12 kV,那每个子模块电容电压就是 2 kV,电平间隔正好也是 2 kV,看波形时一眼就能看出台阶对不对。如果取 N=7 或者 N=11,电平间隔不是整数,波形对照起来就会更麻烦。
2. 核心参数计算:从直流母线到桥臂参考波
2.1 子模块电容电压与直流母线电压的关系
半桥子模块投入时输出电压等于电容电压,旁路时等于 0。一个桥臂上 N 个子模块全部投入时,桥臂输出电压就是 N 倍的电容电压,而这个电压从拓扑上看要能覆盖整个直流母线电压,所以额定电容电压就是 Vdc/N。
我模型里设 Vdc=12 kV,N=6,所以每个子模块电容电压 Uc=2 kV。这个关系是硬性的,别自己随便改。如果把电容电压设得比 Vdc/N 小,桥臂全部投入时电压不够,交流侧输出会削顶;设得大,子模块的开关管和电容又要承受更高电压,仿真里可能看不出安全问题,但波形和实际工况会对不上。
子模块电容的容值也值得说一句。电容太小,充放电很快,电压波动大;电容太大,模型启动慢,直流电源要给一大堆电容充电。教学模型里常见的做法是选一个能让电压波动在额定值 5% 到 10% 以内的容值。我用的是 5 mF,配合 12 kV 和 2 kV 的电压等级,仿真波形和电压波动都还比较干净。具体到你的模型,要根据负载电流大小调整,不要直接照抄。
2.2 桥臂参考波与调制比的生成公式
MMC 每相上下两个桥臂是配合工作的。以 a 相为例,假设交流侧期望得到的相电压是va = m*(Vdc/2)*sin(ωt),m 是调制度,ω 是工频角频率。那么上桥臂电压参考值应该是:
vp = Vdc/2 - va = Vdc/2 * (1 - m*sin(ωt))
下桥臂电压参考值则是:
vn = Vdc/2 + va = Vdc/2 * (1 + m*sin(ωt))
上下桥臂参考电压相加恰好等于 Vdc,交流侧得到的 va 等于下桥臂电压减去上桥臂电压的一半。因为半桥子模块不能输出负电压,所以每个桥臂都必须带着 Vdc/2 左右的直流偏置工作,这也解释了为什么桥臂参考波是“0 到 Vdc 之间摆动”的信号,而不是像普通两电平调制那样直接从负到正。
在 Simulink 里生成调制波时,我会先把这些电压归一化成 0 到 1 的信号,方便和 0 到 1 的三角载波比较。归一化之后,上桥臂第几个子模块共用的调制波是:
ref_p = 0.5*(1 - m*sin(ωt))
下桥臂是:
ref_n = 0.5*(1 + m*sin(ωt))
调制比 m 我取 0.9,留一点裕量。m 超过 1 会进入过调制区,桥臂输出电压需求超过子模块能合成的最大电压,波形会出现削顶和大量低次谐波。开环模型里最好把 m 固定在 0.8 到 0.95 之间,先把波形跑对了再实验其他工作点。
2.3 载波移相PWM的相位分配
MMC 的载波移相策略是:同一个桥臂里的 N 个子模块共用同一个调制波,但每个子模块的三角载波相位依次错开 2π/N。N=6 时,相位差是 60 度,所以 6 个子模块的载波初相位分别是 0、60、120、180、240、300 度。
我列的这样一个表格,建模时可以直接对照着填:
| 子模块序号 | 载波初相位(度) | 载波初相位(弧度) |
|---|---|---|
| SM1 | 0 | 0 |
| SM2 | 60 | π/3 |
| SM3 | 120 | 2π/3 |
| SM4 | 180 | π |
| SM5 | 240 | 4π/3 |
| SM6 | 300 | 5π/3 |
这样做的效果是,每个桥臂的 6 个子模块开关时刻均匀错开,任意时刻总有部分子模块投入、部分旁路,桥臂输出电压的阶梯变化比较平滑。如果图省事让所有子模块用同一个载波,那它们会同时导通、同时关断,输出电压直接从 0 跳到 6Uc,根本谈不上多电平。这个点我在后面章节还会单独讲,因为它是新手最容易踩的坑之一。
3. Simulink模型搭建的关键步骤:子模块封装与桥臂拼装
3.1 半桥子模块建模
搭 MMC 模型的第一步是做好一个半桥子模块,并且封装好。我用的元件来自 Simulink 的 Simscape Electrical 库,选择两个 IGBT 加反并联二极管的半桥结构。T1 在上,T2 在下,两个管子中间点作为交流输出侧,电容跨接在整个半桥的直流侧。T1 导通时,电容接入输出回路,子模块输出电压接近 Uc;T2 导通时,电容被旁路,输出电压接近 0。
仿真用途的开关管选 Ideal Switch 或者理想 IGBT 模型就行,不要选带详细热阻、结电容的物理模型,那样仿真速度会慢很多,而原理验证阶段完全用不上那些细节。二极管也需要和开关管并联,因为感性负载下电流需要续流通道。
封装的时候把端口做成四个:正端 P、负端 N、上管门极 G1、下管门极 G2。电容参数里有一项 Initial voltage,这里一定要设成 2 kV。很多模型跑偏就是忘了设初值,电容从 0 开始充,启动暂态特别长,波形迟迟不是 7 电平。
T1 和 T2 的门极信号要保持互补,理论上 T1 给 PWM,T2 给 PWM 逻辑取反。工程上还要加死区,防止上下管直通。在纯原理仿真里可以先不加,但要明白不加死区只是图省事,看效率时会有误差。
3.2 载波移相信号生成
载波移相信号的生成是整个模型的主干。我在模型里用六个三角载波源,幅值都设成 0 到 1,频率都设成 1 kHz,唯一不同的是初始相位,按上一节表格设置。注意这里的“相位”是三角波的初始相位,不是时间延迟,有的模块里要填弧度,有的填度,先看清楚参数单位,不然相位错得乱七八糟。
调制波用 Simulink 标准正弦模块生成。三相 a、b、c 分别相位差 120 度,然后按公式0.5*(1 - m*sin(ωt))和0.5*(1 + m*sin(ωt))分别得到上桥臂和下桥臂的参考信号。实现时不用写复杂的代码,用常数模块、增益模块、加法器和正弦模块就能搭出来,也可以用一个 MATLAB Function 模块直接输出六路参考波。
比较器用 Relational Operator 模块,比较规则设为“大于等于”。调制波大于载波时输出 1,否则输出 0。这个 0/1 信号就是某个子模块 T1 的门极信号,T2 用 Logical Operator 的 NOT 取反。在这里我特别说一下:同一个桥臂的 6 个子模块用的是同一个调制波,但载波相位不同,所以同一时刻比较出来的 PWM 占空比会随相位差而错开,这正是载波移相的精髓。
3.3 桥臂拼接与三相组装
把封装好的子模块串联成一个桥臂时,顺序是:前一个子模块的 N 端接下一个子模块的 P 端。每个桥臂串联完 6 个 SM 后,再串一个桥臂电感 L。电感的作用是限制桥臂间环流和开关暂态的电流变化率,不能省。我取 L=5 mH,原理验证阶段这个量级能让电流波形比较平滑。电感太小,环流会很难看;电感太大,会在交流侧引入电压降,输出幅值偏低。
三相模型一共六个桥臂。上桥臂的一端接直流正极,另一端接交流输出节点;下桥臂的一端接交流输出节点,另一端接直流负极。三个交流输出节点分别接三相负载,负载可以是纯电阻或者阻感负载。我这里用了 10 Ω 的电阻加 10 mH 的电感,既能看到电流波形,又能模拟实际系统的阻抗。
连线容易乱,建议用 Mux 把每个桥臂的 6 路 PWM 门极信号合成一路总线,再进子模块阵列。三相模型可以先搭好一相,确认这一相波形正常,再复制两次并修改三相正弦波相位。我实际做的时候就是先搭单相,跑通以后再补成三相,排查问题会快很多。
3.4 求解器与仿真设置
这个模型必须使用 Simscape 里的 powergui 工具,并且把它配置成离散仿真模式。连续仿真在电力电子模型里经常会因为开关事件太密集而变得极慢,而且步长不好控制。离散步长我取 5e-6 秒,也就是 5 微秒。载波频率 1 kHz,一个载波周期内有 200 个仿真点,PWM 边沿信息保留得比较充分。步长再大,比如 1e-4 秒,载波边沿会丢失,波形会明显失真。
仿真时长不用太长,先设 0.4 秒,让模型从启动暂态进入稳态,足够看几十个工频周期。直流侧我直接用一个理想直流电压源 12 kV,这样模型简单,也不会出现直流侧电容充电的额外暂态。如果后面想研究直流侧动态,再换成可控电压源或者直流线路模型。
4. 开环调制波形的电平验证:结果分析与谐波核对
4.1 电平数量怎么看
N=6 的 MMC 理论上相电压是 7 电平,线电压是 13 电平。为什么相电压是 7 电平?因为每一相上下两个桥臂合计可以合成的相电压取值范围是从 -3Uc 到 +3Uc,也就是 -6 kV 到 +6 kV,中间以 Uc=2 kV 为台阶,一共 7 个等级。两个相电压相减得到的线电压,因为两个相的电平台阶相互组合,可以得到 13 个等级。
仿真跑起来以后,不要直接看交流输出电压就算完,要把 Scope 里的标尺打开,数一下相电压在半个工频周期内出现了几个台阶。正常时你会看到类似 0、±2 kV、±4 kV、±6 kV 这种离散跳变。如果 m=0.9,最大输出约 ±5.4 kV,所以正负 6 kV 这一级不会出现,但台阶还是 7 个。线电压因为两相叠加,台阶更密,直接看的时候会像一条很粗的正弦波,细分才能看到 13 电平的特征。
这里有个细节:上下桥臂的输出电压并不是正弦波,而是一堆带直流偏置的阶梯波。你要测量相电压,必须把电压表接在交流输出点和三相负载中性点之间,或者接在一个虚拟直流中点之上。如果直接把电压表接在桥臂两端,看到的是不对的电压,很多新手在这里被误导。
4.2 正常波形特征与常见异常对照
把模型跑通以后,理想的相电压波形是多电平阶梯波,交流电流接近正弦,桥臂电流中能看到明显的二倍频环流分量。这是因为上下桥臂的电压参考波里有一次和直流分量,它们相互作用会产生环流。开环模型里没有环流抑制,桥臂电流会有一点畸变,这属于正常现象,不代表模型错了。
我用一个表格总结最常见的问题和排查方向:
| 波形现象 | 可能原因 | 检查点 |
|---|---|---|
| 相电压只有两三个大台阶 | 载波没有移相,所有 SM 同时开关 | 检查 6 个三角载波相位是否为 0/60/120/180/240/300 度 |
| 上桥臂和下桥臂电压明显不对称 | 调制波参考波极性接反 | 检查 ref_p 和 ref_n 公式里的正负号 |
| 相电压阶梯存在但整体逐渐下跌 | 电容初始电压未设置或负载太重 | 检查每个 SM 电容 Initial voltage |
| 波形出现明显削顶 | 调制比 m 超过 1 | 把 m 降到 0.9 以下 |
| 电流波形发散,数值巨大 | 仿真步长太大或电感太小 | 缩小步长到 5e-6 s,增大桥臂电感 |
| 输出波形 50Hz 分量正常但附加毛刺特别多 | 死区时间设置不合理 | 检查 T1/T2 互补信号死区 |
这张表是我调试时的排查清单,基本能覆盖八成的问题。
4.3 用FFT核对谐波频率
开环模型跑对之后,最好再做一次 FFT 分析,确认谐波分布和理论对得上。用 powergui 的 FFT 工具,选择交流侧相电压或者线电压,分析窗口取稳态部分,采样频率至少 20 kHz。
对于单个子模块载波频率 1 kHz、N=6 的载波移相方案,桥臂等效开关频率是 N 倍的载波频率,也就是 6 kHz。因此 FFT 频谱中基波 50 Hz 分明,谐波主要集中出现在 6 kHz 附近以及它的边带频率周围,低频段的谐波分量应该很小。如果你看到 250 Hz、350 Hz 这些低次边带幅值异常大,就要怀疑是调制比过高、正弦波采样点数不足,或者死区效应被放大。
FFT 不用追求更低的 THD,开环模型的目的是验证谐波集中频段和理论接近。如果你连 6 kHz 这个特征都看不到,说明载波移相逻辑大概率还没有生效,回头检查载波相位比继续调参数更有意义。
5. 开环仿真中最容易翻车的三个细节:步长、电容初值和载波同步
5.1 步长与PWM边沿
离散仿真步长和载波频率的关系是我反复踩过的一个点。最开始我把步长设成 50 微秒,想着仿真时间能跑快点,结果相电压波形边沿乱七八糟,看起来像是有一堆随机毛刺。我一开始还怀疑是载波移相没做对,后来把步长缩小到 5 微秒,波形立刻干净了。
原因是 PWM 比较器输出的开关信号是高频边沿事件,步长太大的时候,三角载波一个周期内只有十几个采样点,比较器无法准确反映调制波和载波相交的时刻,输出脉冲占空比误差很大。一个实用的经验是:每个载波周期至少有 100 到 200 个仿真点。载波 1 kHz,步长 5 微秒对应一个周期 200 点,够用;如果想看更细的开关暂态,可以进一步缩到 2 微秒。
另一方面,步长太小会让人失去耐心。36 个子模块、每个模块两路开关信号,simulation 的数据量不小。所以我的建议是先用 5 微秒把模型跑通,再根据需要对局部时间段用更小步长,不必一上来就追求极端精确。
5.2 电容初始电压不匹配导致的启动过流
子模块电容初值看起来是个小事,实际上影响非常大。如果所有电容 Initial voltage 都设成 0,那么仿真开始瞬间,直流电压源要通过桥臂电感和各个子模块的开关管给 36 个电容充电,充电电流尖峰可能达到正常电流的几十倍。这种情况下你看到的第一眼波形一定是电流爆炸,然后才慢慢建立电压。
我后来把所有电容初值都设成 2 kV,启动过程瞬间平稳,第一毫秒内的电流尖峰大幅下降。这意味着模型从一开始就处在接近正常的工作点附近,可以更快进入稳态。如果你是想专门研究 MMC 启动预充电过程,那可以故意不设初值或者设一部分初值,但目的是做调制验证时,初值必须按 Vdc/N 设置。
另外一个和初值相关的坑是,多个电容初始值如果设置得不一样,即使都接近 2 kV,启动瞬间也会造成桥臂间不均流。检查模型时,每相上下桥臂六个电容初值要完全一致,别因为复制粘贴时参数窗口的某个值漏改,导致波形不对称。
5.3 载波相位同步与“同相误区”
最后这个坑我认为是最容易让新手怀疑人生的。很多人搭完子模块之后,为了省事,直接用一个三角波载波接到六个比较器上,只把调制波或者阈值改一下,以为这样也能得到多电平。这实际上是传统两电平里常用的“载波层叠”思路,用在半桥 MMC 上完全不对。
载波移相 PWM 要求每个子模块有独立的三角载波,载波同频同幅,只是相位错开。N=6 时,如果六个载波同相位,六个子模块会在同一时刻同时开通、同时关断,等效出来的 PWM 仍然是两电平,只是电压幅值变成了 6Uc,电平数和波形没有一点多电平的意思。这时候相电压上只有几个大幅跳变,和实际物理逻辑完全不符。
所以你检查载波时,不能只看每个子模块有没有 PWM 信号,要确认 6 个载波源之间的相位差确实是 60 度,并且相互之间没有因为模块参数继承导致相位覆盖。我在调试中还发现,如果把上下桥臂的载波相位也搞成偏移 180 度,波形并不会更好,反而会引入额外的开关谐波。上下桥臂使用同一套移相载波是足够的,关键在于每个桥臂内部要错开。
6. 后续扩展方向:从开环到闭环中间还差几步
6.1 加入电容电压排序均压
开环模型跑通不代表电容电压能一直平衡。由于每个子模块参数存在微小差异,导通损耗和电容特性不可能完全一致,时间一长,各电容电压会逐渐分化。工程 MMC 里最常用的办法是电容电压排序均压:在每个控制周期采集所有子模块电容电压,根据桥臂电流方向决定投入电压偏高还是偏低的子模块,然后把 PWM 脉冲重新映射到对应的子模块索引上。
这个算法说起来简单,实际做的时候要考虑排序频率、脉冲切换次数限制、以及避免某个子模块频繁开关的问题。开环模型里没有这些,但你可以把它当成一个扩展点,在现有模型上加入电容电压采样和排序逻辑,观察桥臂电流方向和电压排序的关系。这一步做完了,模型才真正接近“可持续运行”的状态。
6.2 环流抑制与功率控制
开环模型中桥臂电流的二倍频环流是自然存在的。如果不加以控制,环流会增大桥臂损耗,严重时能让桥臂电流波形明显畸变。工程中通常在控制器中加入环流抑制环,提取桥臂电流的二倍频分量,用比例谐振或者同步坐标系下的 PI 控制去生成一个附加的桥臂电压修正量。
同时,开环模型里没有功率控制,所以交流侧输出完全由调制比和负载决定。加上有功无功外环以后,控制器会根据系统需求的功率调整调制比和相位,这就从“验证波形”跨到了“控制系统设计”。到这一步,你手头的那套开环 MMC 模型就不再只是教学工具,而是可以作为闭环仿真的基础被控对象。
最后聊一点我自己的体会。N=6 的开环模型虽然规模不大,但把 MMC 的核心概念都包含了。我建议每个准备做 MMC 的人,都先把开环波形跑到“相电压 7 电平、线电压 13 电平”这一步,再去碰闭环算法。调试时每次只改一个参数,改完看波形,否则多个问题混在一起很难查。如果条件允许,先搭单相版本,把两个桥臂 12 个子模块跑顺,再复制成三相,能省不少时间。等这套模型跑稳了,后面加电容排序、环流抑制和功率控制,都是水到渠成的事。