聊到MMC,也就是模块化多电平换流器,很多刚接触仿真的朋友第一反应就是那一大排IGBT、电容和乱七八糟的均压逻辑,觉得门槛太高。前阵子我自己调一个4电平MMC仿真模型,电压等级不高,但该踩的坑一个没少踩。回头再看,其实4电平MMC是一个非常合适的入门切入点:结构上保留了MMC最核心的子模块级联特征,调试起来又不会被几十个子模块的排序和通信问题淹没。这篇文章就把我从拓扑理解、参数估算、调制均压到最终搭出能跑模型的完整过程梳理一遍,重点聊聊4电平MMC的构建思路、环流抑制和常见坑。如果你正准备入手多电平变流器的仿真,或者手头正好需要一个不太复杂但能验证控制算法的MMC模型,这篇文章应该能帮你少走不少弯路。
1. 4电平MMC的结构原理与电平数换算
1.1 模块化多电平的基本骨架
先理清MMC的基本构成。一个三相MMC换流器,每一相有两个桥臂,上桥臂和下桥臂,桥臂之间通过一个交流输出节点相连。每个桥臂由若干个完全一样的子模块SM串联,再串一个桥臂电感。这个桥臂电感不是可有可无的滤波电感,它是抑制桥臂间环流的关键元件,后面我会专门说。
每个子模块内部,最常见的是半桥结构:两个IGBT反并联二极管串联,再并一个直流电容。两个开关管的状态互补,一个导通另一个就关断。T1导通时,子模块输出电容电压Vc,称为投入状态;T2导通时,子模块输出电压约0,称为旁路状态。通过控制每个桥臂里投入多少个子模块,交流侧就能得到阶跃的电平波形。
这里有个关键认知:MMC不是靠单个器件承受高电压,而是把电压分摊到一串子模块电容上。每桥臂的子模块数量越多,单个器件耐压要求越低,输出波形越平滑。但代价是控制复杂度成倍上升。所以入门选低电平数非常合理,4电平正好能看清原理又不会把调试成本推得太高。
1.2 “4电平”究竟是哪4个电平
很多朋友把“电平数”和“子模块数”混在一起,其实这是两个概念。通常说的N电平,指的是交流侧相电压对直流母线中点,或者说对参考点,能划分出的电压阶梯个数。
对于每桥臂N个半桥子模块的MMC,相电压理论上可以得到N+1个电平。所以“4电平MMC”对应的就是每桥臂3个子模块,N=3。直流母线电压是Vdc,每个子模块电容的稳态电压约Vdc/3。相电压在0、Vdc/3、2Vdc/3、Vdc这四个台阶之间切换。
我见过不少例子,有人把每桥臂4个子模块也叫做4电平,那其实是5电平。这种命名差异在教学资料里经常出现,讨论问题之前最好先约好定义。按最通用的学术口径,4电平就是N=3。线电压的话,电平数会更多,是2N+1,7个台阶。不过平时口头说“4电平MMC”,指的都是相电压阶梯数。
1.3 为什么拿4电平入门最合适
如果按实用性看,实际工程里的MMC动辄几十上百个子模块,仿真里SVG图和波形密密麻麻,参数稍微调错一点都很难定位。而4电平MMC只有每桥臂3个子模块,全模型共18个子模块,刚好能看清楚:
- 电容电压排序均压的逻辑,投入数量的变化规律;
- 桥臂环流的二倍频分量在波形上的表现;
- 新增一个子模块接入对输出电平的实际影响。
从4电平跑通后再扩展到11电平、21电平,控制框架基本不用变,只需要把排序数组、载波数量这些参数改一下。这就是拿它当“最小可行案例”的价值所在。别一上来就挑战高电平,除非你只是想看平均模型下的正序波形,而不是想理解每个子模块是如何被调度起来的。
2. 仿真平台选择与建模前的参数估算
2.1 主流仿真工具怎么选
目前做MMC仿真的主流工具主要集中在三个:MATLAB/Simulink、PSCAD/EMTDC、PLECS。我自己的主战场是Simulink,主要原因不是它比别的强多少,而是库元件全、示波器模块顺手、查资料方便,控制部分可以直接用现成的模块搭,不用自己造轮子。
PSCAD在电磁暂态分析上很有优势,尤其是和电网交互的工况,它的解算器对开关动作处理得比较稳,但MMC子模块数一多,模型规模上去之后,运行速度经常让人着急。PLECS则胜在开关损耗分析和热仿真,适合做器件选型和效率评估,但要做完整闭环控制,习惯上不如Simulink顺手。
如果你只是要搞明白“子模块怎么投切、均压怎么做、环流怎么抑制”这三个核心问题,Simulink完全够用。模型规模小的时候,详细开关模型也不至于跑不动。等后面子模块数量多了,再考虑用平均值模型或者换实时仿真工具也不迟。
2.2 详细模型还是平均值模型
这里有个模型精度的选择题。详细模型就是每个子模块都用开关管、电容、二极管真实建模,可以看到每一个SM的电容电压纹波和开关动作细节,但计算量大。平均值模型则把整个换流器等效成受控电压源或电流源,仿真速度快上几个数量级,适合验证控制策略的宏观响应,却看不到均压和环流的微观现象。
我自己惯用的路线是:先用平均值模型把双闭环控制器的PI方向和参数摸清楚,再切换回详细模型,加入均压算法和调制策略,仔细调波形。这样做有个直接好处,控制方向错了不用在详细模型上等半天才能看出来。平均值模型跑一次只要几秒钟,调PI参数效率高得多。
4电平MMC的子模块数量不多,很多初学者干脆直接搭详细模型,也能跑。但如果你打算后续扩展到更高电平,建议从一开始就养成封装子模块的习惯,把SM做成一个带标签的子系统,然后通过数组信号批量管理,后期会轻松很多。
2.3 建模前先把参数估算做出来
参数是建模的地基,我建议动手搭模型之前,先把一组具体数值写下来,不要随手设。下面是一套参考算例,直流侧20kV,额定容量2MVA,工频50Hz,每桥臂3个子模块。
| 参数 | 符号 | 数值 | 依据 |
|---|---|---|---|
| 直流母线电压 | Vdc | 20 kV | 设计输入 |
| 子模块数每桥臂 | N | 3 | 相电压4电平 |
| 子模块电容电压 | Vc | 6.67 kV | Vdc/N |
| 额定容量 | S | 2 MVA | 设计输入 |
| 交流线电压有效值 | Vll | 11 kV | 调制比约0.85 |
| 基波阻抗基值 | Zbase | 60.5 Ω | Vll²/S |
| 桥臂电感 | Larm | 19 mH | 0.1pu 电抗 |
| 子模块电容 | Csm | 100 μF | 储能常数法估算 |
桥臂电感这里展开算一下。取电抗标幺值0.1pu,基值阻抗Zbase等于11kV的平方除以2MVA,大概是60.5Ω。0.1pu就是6.05Ω,在50Hz下换算成电感,6.05除以314,约19mH。这个值作为初值很合适,既能压住环流,又不会因为电感太大导致桥臂电流动态响应太慢。
子模块电容按储能常数40kJ/MVA估算。总储能W等于40kJ/MVA乘以2MVA,80kJ。整个换流器共6N个电容,也就是18个子模块电容,每个电容储存的能量就是80kJ除以18,约4.4kJ。再由0.5倍的C乘以Vc平方等于4.4kJ,反算出C约100μF。这套估算方法不用背复杂公式,工程上快速选初值很管用,后面仿真中再根据电容电压纹波大小微调。
3. 调制策略选择与电容均压算法实现
3.1 NLM和CPS-PWM的取舍
4电平MMC的调制策略,我实际调下来主要有两条路:最近电平逼近NLM和载波移相PWM,也就是CPS-PWM。
NLM的思路很简单:把正弦调制波映射到0到N之间的整数,这个整数就是当前时刻应该投入的子模块数量。比如N等于3,调制波数值在0到3之间连续变化,取整后得到0、1、2、3的阶梯值。每个控制周期只需要决定桥臂投入几个SM,然后交给均压算法去选具体是哪些SM投入。NLM的开关频率低,器件应力小,尤其适合电平数很多的大功率场合。在4电平下它的缺点是谐波偏大,台阶比较粗,需要靠桥臂电感配合滤波。
CPS-PWM则是给每个子模块分配一个独立的三角载波,载波频率相同,相位依次错开360度除以N。这样每个子模块的开关频率不高,但桥臂合成的等效开关频率被抬高了好几倍,波形质量更好。代价是每个SM都要有独立的调制波和载波比较逻辑,实现起来比NLM复杂。
对于4电平入门,我更推荐先做NLM,因为它把“投几个”和“投哪些”两个问题拆开了,非常适合观察均压逻辑。等NLM版本的模型稳定运行后,再改CPS-PWM对比波形,理解两种调制策略的差异会非常直观。
3.2 排序均压算法的落地写法
MMC有个天然约束:每个桥臂必须保持投入的子模块总电压接近Vdc的一半附近,否则上下桥臂电压不平衡会产生巨大环流。但每个子模块电容电压会因为充放电而波动,所以必须动态选择投入哪些SM,这就是电容电压平衡算法。
最经典的做法是排序法。逻辑非常直接:采样当前桥臂所有SM的电容电压,然后根据桥臂电流方向决定优先级。如果桥臂电流对电容充电,就投入电压最低的几个SM;如果桥臂电流对电容放电,就投入电压最高的几个SM。这样每次充放电都优先选择电压偏离目标值最远的电容,总能把各SM电压拉回平均值附近。
伪代码可以写成这样:
% arm_cap_voltages: 当前桥臂各SM电容电压,长度为N % arm_current: 桥臂电流,正方向定义为对电容充电 % n_on: 当前周期需要投入的SM数量 function gate = sort_balance(arm_cap_voltages, arm_current, n_on) N = length(arm_cap_voltages); [~, idx] = sort(arm_cap_voltages); gate = zeros(N, 1); if arm_current > 0 % 充电状态下,优先投入电压最低的 n_on 个SM gate(idx(1:n_on)) = 1; else % 放电状态下,优先投入电压最高的 n_on 个SM gate(idx(N-n_on+1:N)) = 1; end end这个算法的关键在于每个控制周期都重新排序,然后对被选中SM与上一周期状态做比较,决定开关动作。注意不要在排序逻辑里让多个SM同一时刻频繁动作,可以加一个滞环或者最小动作时间限制,否则开关频率会很高。
3.3 调制与均压怎么配合才稳定
在实际模型里,NLM产生的是投入数量n_on,排序算法产生的是具体的开关状态。这两步必须放在同一个控制周期里执行,而且电容电压采样和控制命令输出最好不要跨周期延迟,否则容易出现电压判断和实际动作不匹配的振荡。
另一个容易忽视的点是上下桥臂的投入数量。上桥臂和下桥臂的SM投入数量相加应接近固定值,这个值就是N。比如上桥臂根据调制波算出需要投入2个SM,下桥臂通常就是1个。上下桥臂的参考电压基本互补,上桥臂参考是0.5减去0.5倍的调制量,下桥臂则是0.5加上0.5倍的调制量。这样直流侧电压才能被上下桥臂瓜分,交流侧才能得到期望的正弦输出。
还有一个小技巧,排序算法不要每个仿真步长都执行。控制周期放到100微秒到500微秒之间足够,尤其在详细开关模型里,太高的均压频率会让仿真速度骤降,还会让开关管频繁动作。先把控制周期拉长,确认均压逻辑能稳定工作,再提高频率去压缩电容电压波动范围。
4. 环流是怎么来的,怎么把它压下去
4.1 二倍频环流从哪里来
三相MMC的桥臂电流里除了负载电流分量,还有一个在相与相之间流动的分量,叫环流。它不经过交流侧,也不进入直流侧,只在三个相单元的桥臂之间形成回路,却实实在在地增加桥臂电流有效值和开关损耗。
环流的主要成分是二倍频负序分量。原因并不难理解:MMC的电容电压存在二倍频波动,而电容电压波动又会通过子模块投切在相单元间产生电动势差,这个电动势差正好是二倍频负序性质。即使4电平MMC子模块少,环流也一样存在,只是幅值占比在不同工况下有差别。
在仿真波形里,你通常能看到桥臂电流不是标准的正弦加直流,而是叠加了一个明显的2倍频纹波。如果桥臂电感设得不够,这个纹波甚至会大得让桥臂电流畸变。
4.2 桥臂电感的取值逻辑
桥臂电感是抑制环流的第一道防线。它串在每个桥臂上,直接增加环流路径的阻抗。取值太小,环流压不住;取值太大,系统动态响应慢,而且电感上的压降会占用输出电压余量。
工程经验上,桥臂电感标幺值在0.1到0.15左右是常见区间。前面那个19mH就是按0.1pu算出来的。这里我再补一个经验判断:如果在仿真里看到桥臂电流里的二倍频纹波幅值超过基波幅值的20%,优先检查桥臂电感是不是偏小,再考虑加环流抑制控制器。
需要注意,桥臂电感不能只靠增大数值硬压。电感过大的话,电流变化率受限,控制器跟踪指令会变得拖沓,可能出现“波形平均电压对,但动态响应别扭”的情况。所以最终取值要在环流抑制和动态响应之间折中。
4.3 环流抑制控制器的基本做法
除了加大电感,更主动的方案是加环流抑制控制器。原理是把二倍频负序分量变换到特定坐标系下,用PI或PR控制器产生一个补偿电压,注入到调制波里抵消环流电动势。
在4电平MMC里,如果想快速验证环流抑制效果,最简单的做法是在控制回路里加一个针对二倍频的谐振控制器,也就是PR控制器,谐振频率设在100Hz。把桥臂电流中的环流分量提取出来,经过PR控制器后生成补偿项,分别加到上下桥臂调制波里。调好谐振增益后,桥臂电流里的二倍频分量会有立竿见影的下降。
我自己的调试习惯是:先把桥臂电感定在0.1pu附近跑一版,观察环流波形,再打开环流抑制控制器,对比投入前后的波形差异。这样能清楚看到两种手段各自的效果。不要一上来就同时调大电感又加PR控制器,那样出了问题都不知道是谁在起作用。
5. 实操:手把手搭建4电平MMC仿真模型
5.1 主电路与控制结构
到这一步,我们把前面所有知识点汇总成一个能跑的模型。这里以Simulink为例,先说主电路怎么组织。
每个子模块封成一个子系统,内部是半桥结构:两个IGBT串联,反向并联二极管,电容并联在直流侧,输出从两个IGBT的中点引出。每个桥臂的3个子模块串联后接入桥臂电感。三相一共6个桥臂,6个桥臂电感。交流侧接三相负载或电网模型,直流侧接直流电源或直流负载。
控制部分我建议按三层组织:
- 第一层是外环控制:定直流电压控制生成有功电流参考,定无功电流参考为0;
- 第二层是内环电流控制:在dq坐标系下做电流PI调节,输出调制电压;
- 第三层是底层控制:把调制电压换算成上下桥臂的投入数量,再交给排序均压算法生成各SM的门极信号。
第三层是MMC特有的,传统两电平变流器根本没有这一层。它把每相期望的相电压转成上下桥臂各自的子模块数量指令。
5.2 关键参数与仿真环境设置
用回前面估算的那组参数,我再补几个控制参数的经验值。电流内环PI的带宽取500Hz左右,比例系数可以先按桥臂电感的阻抗来估算,积分系数设为比例系数的十分之一附近,然后再看波形微调。直流电压外环带宽放低一些,100Hz左右,避免内外环相互干扰。
仿真求解器推荐用定步长离散求解器,步长设置在5微秒到20微秒之间。详细开关模型下,步长太大会出现脉冲宽度丢失,导致输出波形明显异常;步长太小会拖慢仿真速度。我一般先用10微秒步长调试逻辑,逻辑跑通后再根据精度需求调整。
启动过程要留意。直接给直流电压源额定电压,电容充电瞬间冲击电流会很大。可以给直流电压一个斜坡上升,几百毫秒从0升到20kV,让电容逐步充电,启动波形会干净很多。或者加预充电电阻,本质上也是限制充电电流。
5.3 波形观测与验收标准
模型跑起来之后,重点看4个位置的波形:
- 交流侧相电压:应该出现清晰的4电平阶梯;
- 线电压:7个阶梯层次分明;
- 桥臂电流:直流分量加交流正弦,交流分量里二倍频纹波越小越好;
- 子模块电容电压:三个SM电压都围绕6.67kV附近波动,波动幅度在5%到10%以内算合格。
如果电容电压明显发散,先查排序方向,也就是上节说的充电和放电逻辑有没有配反。如果相电压阶梯没有,多半是调制波或投入数量换算有问题。如果桥臂电流波形看起来像被什么东西拽着周期性波动,优先怀疑环流抑制没做好。
5.4 调参顺序建议
我最开始调这个模型的时候,顺序是乱的,哪里波形不对就调哪里,结果越调越乱。后来总结出一个相对稳定的顺序,你可以直接参考:
- 先把纯开环调好:给定固定调制波,确认桥臂电流、相电压阶梯正常;
- 加入排序均压算法,确认电容电压能够稳定在目标值附近;
- 加入内环电流控制,确认交流侧电流能跟踪指令;
- 加入外环直流电压控制,让直流侧电压稳定;
- 最后加入环流抑制控制器,优化最后5%的波形质量。
每一步都等波形稳定了再进下一步。这样一来,当某一步出现问题时,你很清楚问题大概率出在新加入的模块里,排查范围被压缩到很小。
6. 仿真中容易踩的坑与排查实录
6.1 电容电压不均衡的原因与解决
排序算法逻辑看起来简单,但实际跑起来最容易出问题的是“充电与放电方向判断”。Simulink里电流方向定义可能和你的直觉相反。如果充电方向判断反了,均压算法不仅不能把电压拉平,反而会让电压发散得更快。
排查方法是暂停仿真,在某个投入变化时刻检查:桥臂电流为正时,被投入的应该是电压较低的SM,还是电压较高的SM。用一个简单的测试:把所有SM初始电压设成微小差异,第一个控制周期结束后看差异是变大还是变小。若差异变大,把电流方向判断条件取反就行。
另外,投入数量的突变也要留意。如果在某几个周期内n_on在2和3之间来回跳,对应的子模块会高频反复投切。解决办法是在NLM取整之前加一个小的滞环,或者限制每个控制周期的投切数量变化。
6.2 启动瞬间电流冲击过流的处理
详细的MMC模型,直流侧突然给额定电压时,电容预充电还没完成,桥臂电感相当于被短路,冲击电流会很大。很多初次搭建的模型在启动瞬间就因为过流保护跳闸。如果不是电力电子硬故障模型而是普通开关模型,波形上能看到电流尖峰特别高。
最实用的处理办法是直流电压斜坡启动。把Vdc从0开始,经过0.2到0.5秒缓慢升到额定值。这样电容充电过程跟随着直流电压缓慢上升,冲击电流就压下来了。如果交流侧连着理想电压源,还需要注意交流源的初始相位和电网同步问题,最好先空载开环启动,稳定后再接入闭环和负载。
6.3 波形毛刺和数值振荡怎么看
每次子模块状态切换,Simulink详细模型都会产生很尖的dv/dt和di/dt。如果你发现波形上有密集的高频毛刺,先看仿真步长是不是偏大;再看求解器是否用了变步长算法。定步长离散求解器对开关模型的数值振荡控制通常要好一些。
还有一种情况是示波器采样时间太粗,看起来像毛刺,其实实际波形是正常的。用“示波器采样时间”这个参数,把它设成仿真步长的一到两倍,避免因为数据抽取造成假毛刺。真实的开关振铃如果用理想开关模型是看不出来的,需要加入寄生参数才有,所以先别被波形上的锯齿吓到。
6.4 仿真速度慢怎么优化
4电平MMC如果所有子模块都用理想开关管建模,跑起来其实还能接受,但调PI参数时频繁修改再重新跑,累积等待时间也不少。优化手段由轻到重排列:
- 把均压算法的控制周期从10微秒提到100微秒,减少排序调用的次数;
- 把不必要的波形观测模块先删除,示波器存的数据越少跑得越快;
- 等控制逻辑全部验证完,再把详细模型切换到平均值模型做长时间的运行测试。
对于4电平模型,我通常不会用平均值模型来做最终验证,因为均压和环流是必须观察的现象。但调试PI参数时用平均模型确实能大幅节省时间。这一步千万别省。
6.5 容易忽视的数值问题
最后说一个细节:电容电压的初始值设置。如果不设置初始值,仿真启动时电容电压从0开始,均压算法在电容电压极低的情况下可能会产生很奇怪的开关逻辑。合理的做法是让每个SM电容初始电压等于理论值Vdc/N附近,也就是6.67kV左右,微小的随机偏差可以保留,用来观察均压算法能否把差异消除掉。
数值类型方面,控制部分最好统一用连续信号处理,离散信号之间的代数环容易导致步长报错。我见过好几次模型莫名其妙报“代数环”错误,查到最后都是控制信号和图连接顺序的问题,调换一下顺序就好了。
自己在实际调试中还有一个小习惯,所有关键告警模块,比如过压过流保护,先不接入主回路,等开环开环模式跑通后再加进去。保护模块一旦参数没设对,会影响你对主回路真实状态的判断,白费很多排查时间。等主回路确认没问题了,再把这层保护加回去,模型就完整了。