行业资讯
📅 2026/9/9 13:43:36
双端MMC-HVDC仿真建模全流程:参数设计到Simulink联调排错
做双端MMC-HVDC仿真这几年我踩过最多的坑不是拓扑画错而是模型搭完了一运行就发散或者波形难看、功率传不过去、直流电压建立不起来。MATLAB/Simulink里做MMC模块化多电平换流器和柔性直流输电系统仿真真正难的不是找一份模型而是搞清楚这个模型该怎么搭、参数怎么定、控制器怎么和主电路咬合以及出问题时怎么定位。这篇文章不打算复述课本上的MMC工作原理而是从实际建模的角度把一套双端MMC-HVDC系统在Simulink里从参数设计到联调排错的完整链路讲一遍给正要上手做柔性直流仿真的研究生和工程师一条可以照着走的路径。1. 动手搭模型之前先把三件事想明白很多人在Simulink里建MMC模型第一个动作就是打开模块库找IGBT、二极管、电容然后一顿拖拽封装。这个思路不能说错但往往会在仿真速度和精度之间把自己绕进去。我建议在动鼠标之前先回答三个问题。1.1 你要研究的是系统级问题还是器件级问题MMC-HVDC的仿真模型从详细程度上分大致有完整开关模型、戴维南等效模型、平均值模型三类。它们之间的取舍直接决定了你这篇博文或者课题能跑到什么程度。完整开关模型就是把每个半桥子模块里的两个IGBT、两个二极管、一个电容全部用Simscape Electrical元件搭出来。三相六桥臂每桥臂假设20个子模块那就是240个子模块、960个开关管。这种模型的好处是能真实反映开关过程、电容电压波动、换流机理但代价是仿真速度惨不忍睹。我曾经用4核机器跑一个带有详细开关模型的双端系统1秒仿真时间跑了快两个小时。适合只做单端、每桥臂子模块数不超过10个、仿真时长在100ms以内的场景。戴维南等效模型是目前学术界和工程界主流。它的思路是把一个桥臂上一串子模块等效成一个可变电压源串联一个可变电阻每次仿真步长内根据开关状态和电容电压更新等效参数。这种做法能大幅提升仿真速度同时保留子模块电容电压的动态特性是目前做MMC控制器设计、故障分析最常用的折衷方案。Simulink里实现戴维南等效需要自己写求解逻辑稍微有点门槛但很多开源模型都是基于这个思路。平均值模型则是把MMC看成可控电压源忽略子模块内部开关细节只保留桥臂电流和电容电压的宏观动态。MATLAB较新版本里自带的Average Modular Multilevel Converter模块就是这个思路。系统级研究——比如双端功率传输特性、直流电压控制、交流侧故障穿越——用平均值模型完全够用仿真速度可以做到接近实时。所以最稳的路径是先搭平均值模型把整个双端系统的控制逻辑跑通确认参数和控制参数合理之后再针对需要研究的具体问题切换成更精细的模型。别一上来就追求极致精细。1.2 子模块拓扑决定你能做什么实验MMC的子模块类型里最常见的是半桥Half-Bridge两个开关管一个电容输出0或Uc两种电平。半桥简单、损耗低但直流侧故障时没有反向电压能力很难实现直流故障清除。全桥Full-Bridge可以输出-Uc、0、Uc三种电平具备直流故障自清除能力但器件数量翻倍。混合型则是在同一个换流器里混合使用半桥和全桥子模块兼顾成本和故障穿越能力。这个选择必须在建模前定下来因为它在主电路层面决定了你的HVDC系统能做什么故障实验。如果只是想学习基本的功率传输半桥就够了如果后续要做直流线路极间短路和故障清除那全桥或者混合型是必要的。Simulink里把这些子模块都封装成子系统切换时改封装内部结构即可。1.3 单端、双端还是多端对模型结构影响巨大双端MMC-HVDC系统意味着有两个换流站一个通常运行在整流工况一个运行在逆变工况中间用直流线路连接。建模时两个站的主电路结构基本一样但控制系统分工不同。我需要提醒的是很多初学者把两个站的控制器完全做成一样这是错的。单端系统只需要一个换流站考虑对交流系统的控制双端系统则必须考虑两端控制器之间的配合——谁来定直流电压、谁来定有功功率、无功功率又要怎么分配——这会在后面专门展开。现在把这三个问题想清楚再去选模型、写封装后面调试的时间会少一半。2. 桥臂参数与主电路设计这些数字不是拍脑袋定的MMC主电路里最核心的参数是子模块电容、桥臂电感和交流侧连接阻抗。这三个参数决定了功率传输能力、电容电压波动范围和环流特性。我在第一次设计MMC参数时犯过的错是直接抄某篇论文的参数结果完全不适配自己的电压电流等级。实际上这些参数是有标准设计流程的。2.1 子模块电容先定储能常数再反算电容值子模块电容承担着吸收桥臂电流波动能量的作用。电容选得小电压波动大输出电压波形质量差甚至会烧毁功率器件选得大了浪费体积和成本。工程规范里通常用储能常数H来衡量MMC的电容储能规模定义为换流器总储能与额定容量之比H W_total / S_N其中W_total是整个换流器所有子模块电容储能的总和S_N是额定视在功率。对于MMC-HVDCH一般取30~40 kJ/MVA。这个值比两电平VSC通常2~5 kJ/MVA高一个数量级因为MMC的电容器件分散到几十上百个子模块里单个子模块电容的储能利用率很低。有了H就能算每子模块电容W_total N_total × 0.5 × C × Uc²C 2 × H × S_N / (N_total × Uc²)给一个我在仿真里常用的小规模算例额定功率10MW直流极间电压20kV±10kV每桥臂子模块数N20那么单相两桥臂共40个子模块三相总共120个子模块每个子模块额定电压约1kV。取H35kJ/MVAS_N10MVA计算可得C 2 × 35000 × 10e6 / (120 × 1000²) ≈ 5833μF取整选6000μF也就是6mF。在Simulink里按这个值预置再把波动范围拉出来看如果电容电压纹波超过正负10%就适当加大电容值重跑。2.2 桥臂电感兼顾环流抑制和故障电流限制桥臂电感是MMC中非常微妙的一个元件。它的作用主要有三个抑制桥臂间的二倍频环流、限制直流侧故障时的电流上升率、以及滤除高频开关纹波。电感选小了环流压不住选大了会降低系统动态响应并且增加成本。工程上桥臂电感的取值一般用标幺值表示常见范围是0.05~0.15 p.u.。换算方法是用交流侧基波阻抗作为基准值。三相系统里基准阻抗Z_base U_LL² / S_N其中U_LL是交流侧线电压有效值。接着L_arm k × Z_base / (2πf)k是标幺系数。还是用上面那个10MW的例子交流线电压10kVZ_base 10kV² / 10MVA 10Ω取k0.1工频50Hz下L_arm 0.1 × 10 / 314 ≈ 3.18mH在仿真里我会从3mH起步观察桥臂电流的二倍频分量和故障情况下的电流上升速度再微调到4~5mH。实际调的时候发现电感和环流抑制的深度几乎是线性的关系但电感过大会让内环电流控制的响应变慢注意别被环流抑制得越狠越好带偏。2.3 交流侧连接变压器和相位电抗MMC通常通过升压变压器接入高压交流电网变压器漏抗加上额外的相位电抗共同构成了换流器与交流系统之间的连接阻抗。这个阻抗既影响无功功率调节范围也影响内环电流控制的解耦效果。Simulink里建变压器时我推荐直接用三相双绕组变压器模块把漏抗标幺值设为0.1~0.15 p.u.额定容量选1.1倍换流器额定容量。相位电抗可以合并进变压器漏抗建模也可以单独再串一个三相互感。在平均值模型里变压器可以简化成理想变压器串R-L阻抗省掉励磁支路速度更快且对控制设计影响不大。3. 调制、均压和环流抑制Simulink里怎么落地主电路参数定好之后接下来就是怎么驱动这个换流器。MMC的调制和均压算法比两电平VSC复杂得多这部分也是整个模型里最容易写错的地方。3.1 最近电平逼近NLM的实现NLM的原理非常直观每个桥臂有N个子模块输出电压要尽可能逼近正弦调制波就在每个控制周期里决定投入多少个子模块、切除多少个子模块。投入个数 n_on 通过下面的映射得到n_on round((U_ref / Uc_dc) N/2)其中U_ref是该桥臂的参考电压Uc_dc是子模块电容电压的额定值。这个式子实现起来就几行代码但Simulink里真正要处理的是排序均压逻辑。在详细开关模型里每个控制周期必须知道投入哪几个子模块而不是只知道投入几个。标准算法是先检测桥臂电流方向电流为正给电容充电时投入电压最低的n_on个子模块电流为负电容放电时投入电压最高的n_on个子模块。这样能让各电容电压保持均衡。我写了一个简化的MATLAB Function代码片段放在Simulink的MATLAB Function模块里做每桥臂的均压选择核心逻辑是这样function [gate, idx] nlm_selection(Vc, i_arm, U_ref, N) % Vc: 每子模块电容电压向量 (Nx1) % i_arm: 桥臂电流正方向为充电方向 % U_ref: 桥臂调制电压参考值 Uc_rated 1000; % 子模块额定电压根据设计修改 n_on max(0, min(N, round(U_ref / Uc_rated N / 2))); % 排序索引 [~, idx_sorted] sort(Vc, ascend); % 电压从低到高 if i_arm 0 % 充电时投入电压最低的n_on个 idx idx_sorted(1:n_on); else % 放电时投入电压最高的n_on个即排序后最后面n_on个 idx idx_sorted(N-n_on1:N); end gate zeros(N,1); gate(idx) 1;这个函数的输出gate是每个子模块的触发信号。需要注意的是实际工程里为了避免每次切换都换一组子模块导致开关频率过高会引入滞环或者保持因子但学习模型里先跑通这个逻辑就够了。3.2 载波移相SPWM作为备选NLM适合子模块数较多的场景N≥20子模块数不多时还可以用载波移相SPWMCPS-PWM。实现思路是生成N个频率相同、相位依次错开2π/N的三角载波每个子模块的调制波都是同一个正弦波对于半桥将调制波与各自的三角载波做比较得到触发信号。CPS-PWM的优势是每个子模块开关频率固定、损耗均衡缺点是子模块数多时载波同步和PWM脉冲分配比较复杂。在Simulink里实现CPS-PWM可以用一个子系统封装N个比较器载波发生器用离散脉冲发生器或者自定义S-Function。我个人的建议是如果是学习MMC原理、做实验验证N≤10时用CPS-PWM更好观察调制细节如果是做HVDC系统级仿真、子模块数多直接用NLM代码短、逻辑清晰、仿真速度快。3.3 环流抑制器不是可选项MMC三相之间由于桥臂电压不完全相等会产生二倍频负序环流这个环流在三相桥臂之间流动不经过交流侧和直流侧只会增加桥臂电流有效值和损耗。在平均值模型里如果忽略桥臂内部动态环流可能不明显但只要切到详细模型或者戴维南模型环流立刻显现波形上桥臂电流会出现明显的二倍频波动。环流抑制的思路是把桥臂电流分解成三相共模分量然后在二倍频负序旋转坐标系-2ω下做PI控制输出补偿电压叠加到桥臂电压参考上。为了简化也可以使用准谐振控制器PR直接对二倍频分量进行抑制。在Simulink里我用的是后者实现简单不需要额外的坐标变换先从桥臂电流里提取环流分量一相上下桥臂电流之和的一半减去直流分量得到二倍频交流量送入PR控制器输出加在上下桥臂电压参考上符号相反。这个控制器调起来有个技巧PR谐振频率要精确设在100Hz二倍工频同时带宽不能太宽否则会抑制掉基波附近的正常分量。仿真里可以先断开环流抑制器观察桥臂电流的畸变再合上对比效果能很直观地理解这个环节在干嘛。4. 控制系统分层搭建与双端联调排错主电路和控制器的关系就像发动机和变速箱单看任何一个都转不起来。双端MMC-HVDC的控制器通常分三层最外层是系统级功率控制中间是MSC内环电流控制最内层是调制与均压。这一节讲清楚层与层之间怎么衔接以及双端联合调试到底按什么顺序做。4.1 外环控制器定功率、定直流电压和无功分配外环控制器的任务是计算出内环电流指令值。在dq旋转坐标系下有功电流id决定有功功率无功电流iq决定无功功率。一个换流站的典型外环结构包括一条有功类控制通道和一条无功类控制通道。有功类控制有几种模式定有功功率、定直流电压、定频率用于孤岛供电。无功类控制有定无功功率、定交流电压。双端系统里必须有一个站采用定直流电压模式来维持直流网络的电压稳定另一个站采用定有功功率模式来传输功率。这是最基本的一个定电压、一个定功率组合。在Simulink里外环控制器我用PI调节器实现。定电压站的PI输入是Udc_ref和Udc_meas之差输出是id_ref定功率站的PI输入是P_ref和P_meas之差输出同样id_ref。无功通道输入是Q_ref与Q_meas之差输出iq_ref。PI参数可以先按对称最优法估算然后通过试凑微调——我之前总是追求一上来就整定完美后来发现MMC这种高阶系统最佳路径是先让仿真跑起来再根据阶跃响应去微调PI参数。4.2 内环电流解耦控制不能照搬两电平VSC的参数内环控制器的作用是让测量电流快速跟踪外环给出的电流指令。dq轴下的电压方程为U_d U_gd - ωL·i_q K_p(idd_ref - i_d) K_i∫(idd_ref - i_d)dtU_q U_gq ωL·i_d K_p(iq_ref - i_q) K_i∫(iq_ref - i_q)dt其中ωL·i_q和ωL·i_d是d轴和q轴之间的耦合项必须通过前馈解耦。很多人直接把两电平VSC的内环PI参数拿过来用结果发现动态响应要么震荡要么慢吞吞。原因是MMC的等效时间常数比两电平VSC大得多桥臂电感和子模块电容的动态特性让系统阶数更高。建议把内环的PI带宽设置在两电平VSC的一半左右起步再逐步加快。我常用的整定思路内环PI的积分时间常数Ti取桥臂电感和等效电阻的比值L_arm/R_arm比例系数Kp取带宽ω_bw乘以L_arm。ω_bw从100rad/s开始观察电流响应逐步加到300~500rad/s。4.3 启动流程别一上来就解锁触发脉冲这是我在仿真中踩过最多次的坑。直接给MMC发触发脉冲的后果是子模块电容电压还没建立电容吸收大电流仿真直接发散或者过流保护跳闸。正确的启动顺序是先在闭锁状态下给换流器充电。闭锁状态下交流系统通过子模块的反并联二极管给电容充电这本质上是不控整流过程。电容电压逐渐上升并稳定在交流线电压峰值附近。需要等待一段时间仿真时间上可能是0.1~0.3s等电容电压建立起来后再解锁触发脉冲让换流器进入可控状态。在Simulink里实现起来很简单给门极信号加一个Enable开关用一个Step块或者定时器控制解锁时间。双端系统的启动顺序还要更讲究。正确的流程是先让定直流电压站整流站从交流系统充电并解锁建立直流电压然后直流线路充电再让定功率站逆变站通过直流侧或自身交流侧充电最后解锁逆变站并设定功率指令。如果两端同时解锁直流线路的充电电流可能超出预期。4.4 双端联调的完整排错链路有一次仿真功率怎么都提不上去波形就是平的我排查了半天发现是两端站的控制模式设置成了都是定功率直流电压没有站来支撑整个系统处于弱约束状态。后来总结出一套排查顺序分享出来第一步单站检查。断开另一端让整流站独立带RL负载运行。确认直流电压能稳定建立内环电流能跟踪指令电容电压均衡。这一步通过之后再进入双端。第二步双端空载对接。整流站定直流电压逆变站不控整流模式但不设功率指令。观察两个站的电容电压是否正常、直流电流是否接近零。第三步功率阶跃。给逆变站一个小的有功功率指令比如10%额定观察直流电压波动是否在允许范围、两端功率是否平衡。然后再逐步加大到50%、100%。第四步暂态验证。做一次功率反转从整流到逆变切换观察直流电压过冲和控制模式切换是否正常。再做一个交流侧电压跌落的故障测试看换流器能否实现故障穿越。这套流程走完双端MMC-HVDC系统基本就稳了。我每次搭新模型都会走一遍比直接堆大功率阶跃测试的调试效率高很多。5. 仿真跑得动和跑得快的平衡性能优化与数值坑最后一个大问题是双端MMC-HVDC模型动不动就几百上千个状态变量Simulink跑起来又慢又容易数值发散。这一节分享我实际使用中的性能优化手段和数值稳定性经验。5.1 仿真步长与求解器的选择求解器的选择对MMC仿真成败影响巨大。如果是详细开关模型必须用小步长来捕捉开关事件推荐用离散求解器步长取PWM载波周期的1/20~1/50。比如载波频率1kHz步长取10~20μs再小就纯粹是浪费算力了。如果是平均值模型步长可以放到50~100μs用ode23tb或ode15s这类刚性求解器。MMC系统里有大量时间常数跨度很大的环节——开关频率kHz级别、基波50Hz、直流侧动态0.1~1s——典型的刚性系统。刚性求解器能自动调整步长比定步长ode4高效得多。我遇到过一种很奇怪的数值振荡现象桥臂电流在开关时刻附近出现高频锯齿状波动但平均值又是对的。后来发现是simulation步长太大采样到了开关谐波。解决办法是缩小步长或者加一个小时间常数的低通滤波做后处理但治本还是得缩步长。5.2 平均值模型带来的陷阱平均值模型虽然在主电路层面大幅简化但控制系统的接口要特别注意。平均值模型输出的电压电流是基波分量不存在开关纹波所以PLL锁相环的响应会显得特别好环流抑制器甚至可能无事可做。如果后续切到详细模型控制器参数可能需要重新整定。其次平均值模型里子模块电容电压的波动范围通常比详细模型偏小因为忽略了开关离散化带来的额外纹波。如果用平均值模型做电容电压保护定值整定需要留出更多裕量。5.3 加速仿真的几招实用技巧第一尽量在离散域建模。连续求解器在MMC这种刚性系统里步长切来切去速度极慢。把控制器、调制、测量环节全部离散化仿真速度能提高好几倍。第二关掉不必要的高频采样模块。Scope模块本身不影响速度但Scope输入端的采样率如果设置过高会造成大量不必要的数据存储。第三使用加速模式。Simulink的加速模式Accelerator和快速加速模式Rapid Accelerator对MMC这种大规模模型提升明显我实测过Rapid模式在平均模型上能提速3~5倍。第四如果跑详细模型考虑把暂时不关注的桥臂用平均值替代只对目标桥臂保留详细模型这种混合建模在学术论文里越来越常见。我个人的体会是MMC-HVDC仿真模型的价值并不在于模型本身多复杂而在于你能不能快速迭代出可靠的运行特性。先把平均值模型跑通双端系统再逐级往详细模型切每切一级验证一次控制效果这条路最省时间也最容易定位问题。后面如果再往多端柔性直流、直流电网方向走这个双端模型就是最基础的积木把两端的控制逻辑和参数设计吃透了扩展起来只是线性叠加的事。