
级联型电力电子变压器的高压侧最后为什么都绕不开MMC早期做项目的时候我也试图用两电平拓扑硬扛结果IGBT直接串联的均压问题、输出谐波问题和开关损耗问题一个接一个折腾了快一个月样机还在冒烟。后来转向模块化多电平方案把控制器做成一套支持3到12级联的通用平台移相载波、最近电平逼近和两种混合调制全部跑通才算是把这个方向真正吃透了。这篇就把这套高压直流MMC控制系统从架构设计到三种调制策略的实现细节完整梳理一遍适合正在做电力电子变压器、储能变流器或者中压直驱的同行参考。1. 高压侧输入级为什么非MMC不可1.1 级联型PET的结构和MMC的角色级联型电力电子变压器的整体结构一般先用高压侧变换器把10kV甚至35kV的交流电整流成中压直流再经过高频隔离DC-DC环节降到低压直流或直接逆变成交流。高压侧的AC/DC环节就是MMC最典型的主战场。为什么高压侧不用普通两电平最直接的原因是IGBT串联。10kV交流系统整流之后直流母线接近15kV单个3300V或4500V的IGBT根本扛不住需要多个器件直接串联均压。串联器件的动态均压、栅极同步是个大工程而且两电平输出dv/dt非常大对电机绝缘、变压器绕组和对地寄生电容都是实打实的伤害。MMC用低压子模块串联每只IGBT承受的电压只取决于子模块电容电压一般设计在1.5kV到2.2kV的量级器件选型门槛低很多模块又能做成标准品。级联型PET里MMC的角色很明确它不是一个孤立的换流器而是整个能量链路的高压输入级。前面接高压交流电网后面接中压直流母线再通过隔离型DC-DC变换器和低压侧相连。MMC除了完成整流还要保证输入电流正弦、功率因数可调、中压直流母线稳定。控制器的性能直接决定了这台电力电子变压器能不能并网、能不能承受负载突变、能不能在电网电压跌落时撑住。1.2 控制系统要解决的三个难题MMC的拓扑优势也不是白来的控制上要给三件事兜底。第一是子模块电容电压平衡。每个子模块的电容器在投入时被充电或放电切除时基本保持不变如果不加控制电容电压就会发散轻则波形畸变重则IGBT过压击穿。第二是环流抑制。三相桥臂之间存在二倍频负序环流它不经过负载只在桥臂之间来回流动会明显增大桥臂电流有效值和电容电压波动。我们系统的桥臂电抗器是20mH在6级联、2kHz载波参数下不加环流抑制时桥臂电流会高出正常值15%左右。第三是调制策略。桥臂输出电压的质量、开关损耗、电容电压波动的平衡几乎完全取决于调制方案。这三件事不是独立的。调制决定了子模块的投入序列投入序列和桥臂电流共同决定了电容电压是否平衡。所以我在设计控制系统时实际上是把调制和均压放在同一个任务里做的而不是分开处理。这也是这套控制系统为什么在FPGA里同时实现PWM比较、载波管理、排序均压和环流抑制的重要原因。上层控制环路的输出最终都要落到“哪个子模块在什么时候导通”这一个基本动作上而这个动作就是由调制策略和均压策略共同决定的。2. “级联数可选”不是简单改个数而是整套控制器的架构升级2.1 为什么要求级联数可选做样机研究的都懂一个平台如果能覆盖多个拓扑参数调试效率是完全不一样的。我们最初按6级联设计后来为了验证8级联和12级联下的谐波特性改一次软件就要动一次FPGA逻辑非常痛苦。后来干脆把控制器的最大级联数放开到12实际运行级联数由上位机参数配置不烧录程序就能切换。“级联数可选”在工程上的意义不止是省编译时间。它还直接对应工业场景中的模块冗余某个子模块故障被旁路后系统可以在剩余模块下降额运行而不是整机停机。比如6级联系统旁路一个模块后变成5级联如果控制器的调制逻辑、均压逻辑写死为6系统就只能停机。所以级联数可选的本质是把硬件拓扑的灵活性交给控制软件。这套平台后来在一台10kV/1MVA的电力电子变压器样机上跑过也在一台3级联的实验室小功率验证平台上跑过同一版控制器固件差别只有参数配置。2.2 FPGADSP分工与载波通道设计我们用的是“DSP TMS320F28379D FPGA Artix-7”的双核架构。DSP负责上层控制电压外环、功率外环、环流抑制计算得到每相上下桥臂的参考电压FPGA负责一切和“快”相关的内容三角载波生成、PWM比较、NLM的计算、排序均压、故障封波和硬件保护。为什么不用DSP直接出PWM因为MMC的PWM输出路数太多了。12级联时三相上下桥臂共6个桥臂每个桥臂12个子模块一共72个子模块每个半桥有两路PWM互补输出就是144路PWM。DSP的ePWM外设再强也带不了这么多路。FPGA的IO资源就灵活得多而且PWM比较和相位管理在硬件逻辑里可以做到纳秒级同步。载波通道设计上FPGA内部为每个子模块分配一个独立的载波计数器计数频率是全局统一时钟计数上下限由载波频率参数决定。级联数为N时只需要让N个计数器参与比较多余的计数器保持静止并输出低电平。通过参数寄存器把N值、相位偏移量、排序队列长度全部变成运行时变量。这里最核心的设计原则是所有逻辑都不写死固定的N凡是和级联数相关的运算都从参数寄存器读取。2.3 动态生成排序队列和调制波表的细节级联数变化时排序算法处理的数组长度也在变。我们在FPGA里给排序器预留了最大12个元素的存储空间通过参数寄存器传入实际长度。排序结果不再直接驱动IGBT而是输出一个“投入模块编号表”PWM比较逻辑根据这个表和当前工作模式决定最终脉冲。调制波表也一样。DSP每周期把桥臂参考电压标幺值下发到FPGAFPGA根据当前调制模式把它换算成各子模块的调制波。换模式时只需要把换算逻辑切换一下而不需要修改外围电路。这样一套控制器就能服务多种样机也是后面能同时支持移相载波、NLM和混合调制的根本原因。3. 移相载波PSC-PWM调制的工程细节和实测参数3.1 载波相位角的计算以6级联为例PSC-PWM的原理不复杂桥臂内N个子模块共用同一个正弦调制波信号每个子模块使用独立的三角载波相邻载波之间的相位差固定为360°/N。仍以6级联为例子模块1的载波相位定为0°子模块2就是60°子模块3是120°依此类推。N个模块叠加的结果桥臂电压等效开关频率是单个模块开关频率的N倍而每只IGBT的开关频率还是单个载波频率这是它最大的价值用多模块并行换取了高频输出波形。相位偏移在FPGA里不是算角度而是算计数器的预装载值。假设载波计数器范围是0到1249对应2kHz载波时钟100MHz那么相位步进就是1249/6约208个计数单位。第i个子模块载波计数器上电时就先装载(i-1)×208之后每个载波周期都自由振荡。这样从宏观上看6个载波信号均匀错开60°非常直观。子模块编号载波相位偏移FPGA计数器初值10°0260°2083120°4164180°6245240°8326300°10403.2 载波同步对时的三个坑这里必须多说两句因为PSC-PWM最经典的坑就在载波同步上。第一个坑是计数器初值只在系统启动时装载一次运行中如果发生复位或干扰载波相位就会错位。比如某个子模块的计数器由于电磁干扰被清零后它和其余模块的相位差不再是规则角度桥臂电压立刻出现不均严重时会产生很大的模块间环流。我们的做法是每个控制周期在同步脉冲时对所有计数器的相位偏差做一次校正如果偏差超过±1个计数单位就重新装载相位初值。第二个坑是同步脉冲和PWM比较逻辑的时序竞争。同步脉冲一般由主控制器的定时器产生但PWM比较也要在载波顶点或底点翻转。如果同步动作发生在比较器翻转的同一拍两个逻辑会对同一个计数器写入不同的预期值造成抖动。解决办法是把同步脉冲延迟几个时钟周期确保比较器先完成翻转再做相位校正。第三个坑是高频干扰下光纤接收的PWM指令毛刺。这个问题不只在PSC但PSC对相位精度最敏感。我们在输出PWM去光纤之前加了一级双沿锁存比较器结果先进入一个跨时钟域触发器确认稳定后再发送到光纤发送器代价是增加两个时钟周期延迟换来的是相位抖动从几十纳秒降到几纳秒。3.3 PSC下的电容电压均衡修正PSC-PWM方案里所有子模块的调制波如果完全相同电容电压平衡靠的是自然平衡但这种平衡能力在调制比较深、负载波动大的时候是有限的。工程上常用的做法是给每个子模块加一个电压均衡修正量。修正量的逻辑是如果第i个子模块电容电压低于参考值并且当前桥臂电流方向是在给电容充电就稍微增大这个模块的占空比让它多投入一会儿。如果电流方向是放电就减小占空比。FPGA内部用了一个一阶PI环对每个子模块生成独立的修正量Δv_i叠加到公共调制波上。这个修正量的限幅必须做小否则会引入低次谐波我们一般把修正量限制在基波调制波幅值的5%以内。实际调试时还有一个细节PSC的自然平衡能力在高调制比时变弱所以修正量环路的PI参数需要跟着调制比做增益调度。最初我们用固定参数结果在调制比0.8附近电容电压纹波偏大改成增益调度后好多了。这套东西在6级联、2kHz载波参数下实测电容电压波动能控制在额定值的8%以内线电压THD大约1.8%作为整流器输入级是够用的。4. NLM最近电平逼近低开关损耗的取舍和排序优化4.1 NLM的计算逻辑与量化误差NLM的思路比PSC简单粗暴一点每个控制周期里根据桥臂参考电压和子模块电容电压平均值算出当前应该投入的子模块数n* round(v_ref / U_c_avg)。用这个整数直接决定桥臂的输出电平数不需要高频PWM载体。量化误差就是这个round带来的。最大量化误差是±0.5U_c当N6、U_c1.7kV时最大误差0.85kV相对于10kV直流母线大约8.5%。这在低压级联数少的场合是不可接受的因为低次谐波会很大。但当地平数足够多比如柔性直流输电工程中一个桥臂有200个模块量化误差摊薄到0.5%以下NLM的波形质量完全可以满足并网要求。NLM的优势在于开关频率低IGBT不需要高频开关只在需要增减一个电平的时候动作一次所以开关损耗远低于PSC。PSC的损耗是每只IGBT都在2kHz高频开关NLM下平均每只IGBT的开关频率往往只有几百赫兹甚至更低。在我们样机上做过对比全PSC方案12kV直流母线下的总损耗中开关损耗占比明显比全NLM高NLM的损耗优势在大容量场景下尤其突出。4.2 电容电压排序在工程里的优化NLM和均压是绑定在一起的。基本逻辑是如果桥臂电流正在给电容充电就优先投入电容电压最低的那些模块如果电流在放电就优先投入电压最高的模块。这样一轮投切下来电压低的充得多、电压高的放得多整体维持平衡。工程优化的重点在排序算法。冒泡排序在12个模块以内几乎没有成本FPGA里几百个时钟周期就完成了但一旦级联数到了几十上百每周期全量排序就会变成瓶颈。我们在这套平台上做过的优化有三个方向一是不重排所有模块而是每次只找出需要调整的少数模块基于上一周期的投入状态做增量调整二是用插入排序替代冒泡排序因为电容电压变化是缓慢连续的上一周期已经有序的序列这一周期插入调整几个元素就恢复了三是排序周期和投切周期分离排序可能每几个控制周期执行一次投切决策每个控制周期检查避免排序抖动导致频繁投切。排序方案最坏复杂度12级联时典型耗时适用场景冒泡排序O(N²)约1.2微秒级联数少、逻辑简单插入排序O(N²)最坏近似O(N)约0.3微秒电压变化缓慢的稳态增量调整法O(k)k为调整模块数约0.1微秒大级联数、动态要求高这里的时间是基于100MHz FPGA时钟的估算。对于12级联三种算法都能跑得动但对上百个模块的系统增量调整法几乎是必须的。4.3 适合NLM的边界条件NLM不是万能的。在我这套系统里当级联数小于8的时候NLM的谐波性能劣化明显尤其是滤波电感和EMC的要求高的时候就不太适合。反过来当级联数大于12的时候PSC的开关损耗会高到散热系统难以接受NLM就成了更优解。还有一个边界是暂态过程。NLM的量化输出在暂态时可能会出现电平跳变比如调制波快速变化时投入数一次跳变两个甚至三个电平电容电压波动会瞬间加大。所以我们在暂态模式下会限制投入数的变化步长每个控制周期最多增减一个模块代价是动态响应变慢一点但保护了电容和IGBT。这也是后面混合调制里分组分工能够各取其长的原因。5. 混合调制的实现分组分工和模式切换不产生电压冲击5.1 分组混合A组PSC精细调B组NLM扛基波这套控制系统里真正让我满意的是混合调制。它的思路是把一个桥臂内的子模块分成两组A组用PSC-PWM高频调制B组用NLM低频动作。以6级联为例子模块1和2作为A组载波相位差180°子模块3到6作为B组按最近电平逼近工作。总桥臂参考电压v_ref在0到6之间变化。B组根据最近电平原则输出整数电平n_B范围0到4钳位到0到4A组处理残差调制波就是v_ref减去n_B范围保持在0到2之间。这样B组以阶梯波形式承担大部分电压A组在残差部分做高频PWM精细填充。实现中要注意分配逻辑要钳位保证A组的调制波不会超出0到2的区间否则A组会进入过调制。实测下来这个方案在波形质量上接近6个模块全PSC开关损耗接近全NLM。B组模块的平均开关频率只有几百赫兹A组的两个模块按2kHz工作总损耗比全PSC下降明显。我也把A组和B组的比例做成参数33、24、15、42都试过最优配置和滤波电感、环流抑制参数有关不能一概而论需要仿真扫描加实验验证。5.2 参数化切换与滞环阈值设计另一种“混合”是按工况做模式切换。我们的上位机里有一个调制策略参数可以选PSC、NLM或AUTO。AUTO模式下FPGA内部判断当前等效级联数如果N小于8用PSCN大于12用NLM8到12之间根据调制比m做滞环切换。滞环是必须的不然边界处会出现模式振荡。比如调制比在0.55附近抖动若切换阈值是精确的0.55系统会在PSC和NLM之间来回切每次切换都会带来一次扰动。我们设置了0.05的滞环宽度从PSC切到NLM需要m0.575从NLM切回PSC需要m0.525。切换动作由一个状态机管理只有在上位机下发允许切换命令、且当前桥臂电流过零附近时才真正执行。5.3 切换时如何避免模块投入数跳变模式切换最怕的是投入数跳变。比如切换瞬间PSC逻辑还认为某四个模块是投入状态而NLM逻辑重新排序后选了另外四个模块那么在切换时间内桥臂就可能出现过压或欠压。我们用的方法是先保持后切换。状态机一共有四个状态PSC_RUN、HOLD_A、NLM_RUN、HOLD_B。在HOLD_A状态所有PWM输出冻结在切换前的占空比同时NLM逻辑开始按当前电容电压和桥臂电流生成投入模块表但不输出确认投入模块表稳定后再解除PWM冻结切到NLM_RUN。整个过程耗时约一个控制周期即100微秒电压冲击可以控制在额定值的2%以内。这个顺序反过来也一样适用总而言之切换期间绝不能出现“两边同时写PWM状态”的情况。实际上模式切换的代码是整个工程里最容易出bug的部分我们现在把它独立成一个小模块并且加了专门的示波器观测通道每次切换时同时记录切换命令、冻结使能、模块投入表、桥臂电压方便定位问题。调试初期有一次切模式直接触发直流过压保护就是靠这个观测通道抓到HOLD状态时间设短了投切表还没稳定就解除了冻结。6. 联调复盘四个容易被忽视的坑6.1 载波计数初值装载导致相位漂移第一个坑前面提过PSC载波同步。我要强调一下这个坑在仿真里完全看不出来因为仿真里计数器是理想同步的只有上了台架电磁干扰一进来相位漂移才会暴露。我们的排查路径是先观察桥臂电流出现明显的低频脉动再对比各子模块的PWM脉冲占空比发现子模块2的脉冲序列和其他模块的相位关系不稳定最终定位到计数器初值受干扰。解决办法是每个控制周期同步校正并给所有PWM输出加跨时钟域锁存。6.2 排序结果与PWM比较不同步NLM模式下排序器输出的投入模块表和控制周期是同步的但和PWM比较器的节拍不一定对齐。早期版本里排序模块在控制周期任意时刻更新投入表如果PWM比较器恰好在同一时刻完成一次比较两个逻辑对同一桥臂的模块投入数会产生不一致的中间态。实际现象是输出波形出现极窄的毛刺脉冲IGBT驱动偶尔误动作。后来我们把排序结果的更新动作统一放在控制周期的固定相位并且在比较器输出端加了一级寄存器延迟一拍让所有变化都只发生在时钟沿上问题就消失了。6.3 光纤回传的电容电压抖动影响排序电容电压采样是通过子模块控制板采集后用光纤回传到主控制器的。光纤通信本身有固定延迟但每个模块的采样时刻不同回传到主控制器的电压值就带有时间差。NLM排序时如果直接用这些带时延的电压值排序可能出现选错模块的情况某个模块显示电压低实际是因为它的数据晚了一个采样周期。我们的处理办法是在主控制器里给所有模块的电容电压做通道对齐同时每个模块的电容电压先做一阶低通滤波时间常数约10毫秒再进入排序器。低通滤波会稍微降低均压的动态响应但能明显减少排序抖动的误动作。这个滤波时间常数是一个值得仔细调的参数不同功率等级和电容容量下最优值不同我们后来在12级联大功率样机上把时间常数调到了15毫秒才稳定。6.4 故障封波后剩余模块的过压最后这个是模块化系统特有的坑。某一个子模块因故障被旁路或者IGBT闭锁后如果控制逻辑还按原来6个模块的均压策略分配投入数剩余5个模块承担的电压会被强行抬高很容易触发过压保护形成连锁故障。我们的做法是收到子模块故障信号后先把该桥臂的“有效模块数”从6改为5所有均压、排序、调制计算都按5个模块重新执行。同时桥臂参考电压的限幅值也要动态调整不能让输出参考电压超过剩余模块的物理能力。这一套逻辑加进去之后冗余旁路试验才算真正跑通连续旁路两个模块系统依然能降额运行。我在实际调试中还有一点很深的体会上述所有的问题仿真阶段几乎都发现不了因为仿真里的时钟永远是同步的、采样永远是理想的、模块永远不会故障。很多问题只有把控制器接上真实功率台架才会暴露。所以如果你也在做类似的控制系统建议尽早把单板保护、跨时钟域同步、排序节拍这些细节放进设计清单而不是等到联调阶段再补。先把调制算法跑通不难难的是让三种调制策略在同一套硬件上稳定切换、在故障后还能可靠降额运行。那些“最后一公里”的工作往往才是真正决定系统能不能交付的部分。