免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

MMC子模块电容电压均压控制:从排序算法到样机调试的完整实践指南

MMC子模块电容电压均压控制:从排序算法到样机调试的完整实践指南 做了快三年的MMC仿真和样机调试坦白说第一次把子模块电容电压均压控制策略写进控制器时我低估了这个看似简单的逻辑有多容易被细节击穿。说出来一句话——让桥臂上几十上百个直流电容的电压乖乖聚在额定值附近。但真把这套逻辑放进最近电平逼近调制NLM框架里你才会发现排序、投切、环流、采样、死区它们全搅在一起哪一环没照顾到波形就能给你脸色看。这篇不打算做成教材式的理论推导而是从为什么非做不可讲起把半桥MMC子模块电容电压均压的主流实现路线、排序均压的完整落地流程、关键参数怎么整定以及我从仿真到样机过程中踩过的那些教科书上没写的坑一次讲清楚。适合刚入门柔性直流、正在搭MMC模型的研究生也适合做工程样机的工程师——你大概率能在里面找到自己正在挠头的问题。1. 电容电压发散的物理根源——为什么非做均压不可1.1 半桥子模块的三种工作状态怎么决定电容充放电先回到最基本的拓扑。半桥子模块由一个直流电容和两个IGBTT1、T2组成每个IGBT反并联一个续流二极管。三种工作状态很多人背得很熟但没细想过电容电流路径状态T1T2电容状态电流路径特征投入导通关断电容接入桥臂参与充放电桥臂电流直接流经电容切除关断导通电容被旁路电压保持桥臂电流流经T2/二极管支路闭锁关断关断取决于电流方向二极管整流用于预充电和故障保护关键就在投入这个状态。当一个子模块被投入它的电容就串进了桥臂桥臂电流在电容上产生能量交换。如果电流方向是给电容充电电容电压上升反之则下降。而切除状态下电容被短路旁路电压基本保持不动。均压控制的一切逻辑本质上就是控制让哪个电容在什么时候接入桥臂。1.2 桥臂电流的交直流叠加特性与电容稳态波动的必然性那为什么电容电压会发散这要从桥臂电流的成分说起。MMC每相上下两个桥臂桥臂电流不是纯正弦而是交流分量和直流分量的叠加。以单相为例上桥臂电流大概等于相电流的一半加上三相不平衡导致的直流/二倍频分量下桥臂则相反。这就意味着一个子模块投入桥臂的时刻如果落在桥臂电流正半周它就充电落在负半周它就放电。问题是调制过程中每个子模块的投入时长、投入时刻并不是均匀轮换的。在最近电平逼近调制NLM下控制器只告诉桥臂这周期投几个具体投哪几个由均压算法决定。如果没有均压算法、或者均压算法失效那么某些子模块可能持续在充电方向被投入电压一路冲高另一些则被持续放电电压一路走低。时间长了高电压子模块的电容和开关器件可能直接过压击穿低电压子模块则让系统失去应有的电压支撑能力整体谐波和损耗都会恶化。1.3 不做均压的仿真现象从波形看发散速度我给一个直观参考。仿真参数别搞太复杂单端MMC每桥臂N16个半桥子模块电容C6mF桥臂电抗L15mH直流电压10kV交流侧带2MW负载。如果我在控制器里偷懒——只在调制层保证每相投入总数恒定投切选择完全不排序、不干预直接按固定顺序循环投入你猜波形什么样前50ms还能看电容电压还挤成一团跑到100ms以后部分电容电压已经冲到额定值的1.2倍左右另一部分跌到0.7倍到150ms基本就得触发过压保护了。而且这个发散速度在轻载时相对慢、重载时快得吓人因为电流越大每次投入的能量交换量就越大。实验现场看到这个波形你才能真切体会均压不是锦上添花是保命功能。2. 主流均压思路对比排序法为何成为工程首选2.1 排序均压的基本逻辑与实现框架现在该聊实现层面的路线了。均压控制的经典方案有好几套排序法、载波移相法CPS-SPWM、基于能量均衡的闭环修正法各有拥趸。我这里重点讲排序法因为它占据了工程应用的大头也是我实际用得最多的一套。排序法四个字概括就是看菜下饭采集桥臂内所有子模块电容电压Uc,k采集当前桥臂电流i_arm判断其方向确定本控制周期内需要投入的子模块数量n这个n由上层功率控制/调制模块给出本质上是最近电平逼近的量化结果如果桥臂电流在给电容充电就把电压最低的n个子模块投入让最饿的先吃如果桥臂电流在放电容的电就把电压最高的n个子模块投入让最饱的先消耗。这个逻辑非常直观而且它完全避开了对电容参数的精确建模——哪怕个别电容容值差10%只要电压排序是真实的算法照样能把电压拉回来。这是排序法最宝贵的性质对参数摄动天然鲁棒。2.2 载波移相法在均压上的先天短板载波移相法走的是另一条路每个子模块有自己的三角载波相位依次错开一个角度2π/N通过调整每个子模块输出占空比来微调电容电压。均压环通常做成电压误差经过PI调节器修正对应子模块的调制波。这套方法的问题在于开关频率固定、谐波特性确实好但均压动态响应慢。尤其在桥臂电流很大、电容电压偏差已经拉开的瞬态过程中靠PI慢悠悠修正经常压不住。而且N个子模块就需要N路彼此错相的载波通道子模块数量一旦超过二三十个控制器资源就是个麻烦事。工程上它更多用于子模块数较少、对固定开关频率有硬性要求的场景比如某些中压驱动或STATCOM。2.3 两种方案的核心指标对比我整理了一张对照表方便你在方案初期做取舍对比维度排序均压法载波移相均压PI法均压动态速度快一个控制周期内可达目标慢受限于PI带宽开关频率特性不固定需加优化否则偏高固定谐波特性可控计算量排序O(NlogN)N大时考验控制器较轻但N路调制通道消耗大对参数摄动鲁棒性强不依赖电容精确模型较弱PI参数依赖工况适用子模块数大中小均可尤其适合N较大适合小N场景一句话总结我在实际项目里的取舍原则子模块数少于10个载波移相法省心超过20个别挣扎了老老实实上排序法。超过50个还要在FPGA或控制器里考虑并行排序结构这是后话。2.4 排序均压法的改进空间保持优先与滞环思想排序法也不是没有缺点最大的毛病是开关动作次数不受控。一个极端的现象如果每个控制周期都重新排序并完全按电压高低切换状态那么在电压非常接近的时候相邻两个周期的排序结果可能差不了几个位置但被选中投入的子模块集合却在频繁换人。开关管今天要是能说话大概会骂人。所以工程落地时通常都要给排序法叠加两条补丁阈值滞环和保持优先。这两条补丁的实质都是牺牲一点点最优性换取开关频率的极大下降。具体的实现参数我在下一节展开讲。3. 排序均压算法的完整落地过程与关键参数整定3.1 从采样到投切一个控制周期的完整流程很多论文直接甩公式但实际在控制器里跑起来是一步一步的工程问题。我按一个控制周期内的真实执行顺序把排序均压的流程拆成六步同步采样采集本桥臂所有子模块的电容电压Uc,k通常在同一个采样中断里完成避免各通道瞬时值相位不一致以及桥臂电流i_arm。如果是多控制器架构电压值还要通过光纤或者高速总线汇总到桥臂主控制器。确定投入数量n上级电流控制器输出的参考电压v_ref经最近电平逼近得到本周期需要投入的子模块数量。注意这个n可能每个周期都在变原因就是为了产生交流电压的阶梯波。判断电流极性根据i_arm的符号确定分组策略。这一步看似简单实际有不少坑后面专门讲电流过零点的情形。排序对N个电容电压排序。当N小时用冒泡没问题N到几十上百之后要用归并排序或快速排序的思路并且尽量沿用上一轮的排序结果做增量更新避免每个周期全量重排。选择投入集合充电方向取电压最小的n个放电方向取电压最大的n个。更新驱动脉冲经延时补偿和死区生成下发到子模块控制器。3.2 排序周期与电容电压波动率的折中排序均压的核心控制周期通常和调制周期同步也就是Ts50μs或100μs对应10kHz或20kHz控制频率。排序一周期做一次没问题但每周期都做和每周期都允许投切状态大幅变化是两回事。排序频率越高均压响应越快电容电压波动幅度越小但代价是开关动作频率飙升。我在仿真里测过一组数据用N24子模块、Ts50μs、功率因数接近1的运行工况如果每周期都用最朴素的无滞环排序子模块开关频率实测能到接近调制频率本身约4kHz以上从均压角度看确实稳电压波动能压到±3%但IGBT的开关损耗曲线直接爆表散热设计根本扛不住。实际工程中我一般把目标定为电容电压波动控制在额定值的±5%~±8%以内子模块平均开关频率控制在额定设计值附近通常1~1.5kHz。这就需要配合滞环和保持优先策略而不是一味追求排得快、排得勤。3.3 阈值滞环与保持优先抑制高频投切的两种补丁先说阈值滞环。它的思想是并不是每次排序完都要立即更正某个子模块的状态只有当它的电压偏差越过一个设定的滞环带ΔU_hys时才允许它从切除翻到投入或者反过来。ΔU_hys典型取值是额定电容电压的0.5%~2%。我常用的是1%。再配合保持优先策略排序选择完投入集合后对比上一控制周期的开关状态——如果上一周期已经在投入状态的子模块本次排序结果仍属于应该投入的集合那么保持它的驱动信号不变只有上一周期投入、本次不在集合内的子模块才被列为待切除但优先切除电压最高的只有上一周期没投入、本次在集合内的子模块才被列为待投入但优先投入电压最低的。这个尽量少动开关管的原则能让子模块平均开关频率从4kHz直接压到1.2kHz左右。从控制理论上理解滞环和保持优先引入了死区或不敏感区它不追求每个周期的最优电压排序而是追求排序足够好且开关动作足够少。实践证明这个折中在绝大多数工业场景里都值得。3.4 仿真参数配置参考与伪代码示例我贴一组我常用的小规模三相MMC整流器参数方便你复现排序均压逻辑参数取值说明交流侧线电压10kV / 50Hz经隔离变压器接入直流侧电压±10kV20kV总单极对称每桥臂子模块数N24半桥拓扑子模块电容C8mF按桥臂能量常数约40kJ/MVA选取桥臂电抗L_arm12mH约0.1 p.u.含变压器漏感控制周期Ts50μs即20kHz调制/控制频率均压滞环ΔU_hys1%×Uc_ratedUc_rated≈833V排序均压核心逻辑的伪代码思路大致是这样# 每控制周期执行 function 均压选择(Uc_list, n_on, i_arm, prev_state, U_hys): # 按电压排序记录索引 sorted_idx argsort(Uc_list) if i_arm 0: # 充电方向优先投入电压最低的n个 target sorted_idx[0 : n_on] else: # 放电方向优先投入电压最高的n个 target sorted_idx[N - n_on : N] new_state zeros(N) # 保持优先上一周期已投入的尽量继续投入 for k 0..N-1: if prev_state[k] ON and k in target: new_state[k] ON target.remove(k) # 剩余目标从待投入集合里依次补入 for k in sorted_idx: if len(selected) n_on: break if k in target and |Uc_list[k] - Uc_rated| U_hys: new_state[k] ON target.remove(k) elif k in target and prev_state[k] ON: new_state[k] ON target.remove(k) else: # 电压偏差在滞环内且上一周期为切除可以不动作 continue return new_state上面这段是给仿真用的简化逻辑核心调试点就是把滞环判断和保持优先两件事放在选择循环里而不是在排序结果上做硬性替换。在MATLAB/Simulink里搭模型的时候我建议先把最朴素的纯排序逻辑跑通确认波形能压住再加这两层优化逐步对比均压效果和开关频率的变化这样能训练你对算法行为的感觉。4. 实测中的意外情况与研判思路从仿真到样机的距离4.1 开关频率爆炸FPGA资源与器件损耗的隐形压力第一个让我印象深刻的坑是样机调试时子模块驱动信号里的高频抖动。仿真里波形超大抖动看不出来样机上用示波器一看驱动信号在一个调制周期里来回翻转IGBT温升快得离谱。根因就是纯排序法没有任何滞环约束排序结果在两个相邻控制周期之间大幅换人。尤其电容电压非常接近、采样存在量化噪声时排序结果几乎随机翻转。解决思路前面已经给了滞环ΔU_hys直接有效但要注意滞环太大会降低均压动态。我做样机调试时习惯先给1%额定电压的滞环观察均压波形跟踪性能如果子模块开关频率还是高于设计值再按0.5%步进往上调直到两边都满意为止。这个波形性能-开关频率的平衡点每套系统不一样必须实测调。4.2 桥臂电流过零点附近的方向误判问题第二个坑来自于电流方向判断。排序逻辑里面if-else判断i_arm大于0还是小于0看起来无懈可击但工程现场电流总有测量偏置和噪声。当桥臂电流过零点时符号在一个采样周期内反复跳变导致均压选择集合跟着来回抖动开关频率同样飙升。我的处理办法是在电流方向判断上增加一个小死区当|i_arm|小于某个阈值比如额定桥臂电流的5%时认为电流极性不明确此时不改变投切方向的首选逻辑——保持上一周期方向或者暂时按电压偏差优先修正的策略处理避免符号抖动传导到开关动作上。这个方法在仿真里看起来多此一举在样机上却是刚需。4.3 均压与环流抑制的联动调试PI参数的经验整定再聊一个容易让人挠头的问题——二倍频环流。三相MMC的三相桥臂之间天然存在能量交换会在桥臂内部产生二倍频负序环流这个环流会叠加在桥臂电流上直接加剧电容电压波动。你均压算法压得再好环流控制没调好电容电压照样波动明显变大。因此均压问题不能孤立看我在系统调试时通常把环流抑制也作为间接均压手段。环流抑制控制器的经典做法是在静止坐标系下用PR控制或者旋转坐标系下的PI控制把二倍频环流分量压到接近零。PI参数方面如果桥臂电感L_arm12mH控制周期50μs我通常这样起步把环流控制环设计成典型I型系统期望闭环带宽ω_n取200~400rad/s那么Kp按L_arm×ω_n量级取值Ki按Kp×ω_n量级取值先给一组初值如Kp≈3~5Ki≈800~1500然后观察环流波形微调。具体数值因系统而异但先按桥臂电感建模、再用带宽确定初值、最后看波形微调这个思路是普适的。我见过不少人把均压效果差全归咎于排序算法不够高级其实先看看二倍频环流是不是已经大得离谱。环流压下来电容电压波动能立竿见影地改善。4.4 采样不同步、死区与测量噪声——工程现场的细节坑最后说几个藏在细节里、但杀伤力极大的问题。第一个是采样不同步。排序均压依赖同一时刻的电容电压值来做排序如果多路子模块电压采样不是同步触发或者各路ADC的采样保持时刻差了几微秒排序结果就混入了测量延迟误差。尤其是在开关动作瞬间电容电压会有快速的瞬变非同步采样会让某些子模块的电压读数偏高、某些偏低进而引发行人调都调不平的均压问题。样机调试时我坚持用统一硬件同步采样脉冲所有Uc在同一时刻采样而不是主程序轮询读一遍。第二个是IGBT死区。死区时间虽然只有几微秒但上下桥臂驱动不对称会在平均效果上造成等效电压偏差这个偏差对均压来说就是系统性摄动。如果均压算法里没有对死区的补偿或足够的滞环余量就会出现固定方向偏移比如总是同一批子模块电压偏高。解决方案是尽可能加死区补偿同时确保排序滞环大于死区带来的等效电压纹波。第三个是测量噪声。电容电压采样回路若滤波不充分噪声叠加进排序逻辑可能造成抖动型投切。我给电压采样通道加了一阶低通滤波截止频率约几百Hz即可既能平滑毛刺又不会明显延迟均压响应。4.5 从仿真到样机一个必须接受的认知差异仿真里调试得再漂亮样机阶段也得重新过一遍滞环-保持优先-电流死区-采样同步这四件套。仿真不会告诉你开关损耗多痛不会告诉你采样噪声多大更不会告诉你死区不对称带来的系统性偏差有多顽固。我在样机调试过程中逐渐形成了一个习惯每改动一个参数同时抓电容电压波形、桥臂电流波形和单个子模块驱动波形三路数据对照着看比只看电压均值靠谱得多。排序均压这个方向看起来老生常谈但它和环流抑制、调制策略、子模块控制器资源分配深度耦合每个系统都可以挖出属于自己的优化点。如果你正在做MMC相关项目希望这篇文章能帮你把基础逻辑理顺少走我走过的弯路。
返回列表