ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

模块化多电平换流器MMC整流:混合FCS-MPC控制仿真与代价函数调优

模块化多电平换流器MMC整流:混合FCS-MPC控制仿真与代价函数调优 整理资料的时候翻到了之前复现过的一个SCI二区IEEE论文项目基于混合有限集模型预测控制FCS-MPC的模块化多电平换流器MMC整流电路仿真模型。这个项目把MMC整流控制、FCS-MPC算法和Simulink仿真三件事拧在一起正好覆盖了电力电子方向最常被问到的几个点模型预测控制在换流器里怎么落地、MMC那么多子模块的电容电压怎么平衡、内部环流怎么压、整流器的直流电压和交流电流怎么一起管。这篇博文不打算只讲论文复现流程会把FCS-MPC的核心原理、MMC整流拓扑、代价函数与权重设计、Simulink建模步骤和调试经验全部摊开讲仿真参数和代码逻辑给到可以直接抄作业的程度。适合正在做毕业论文、写期刊论文或者想把手头的MMC仿真做深一档的同行参考。1. 项目整体定位与复现价值1.1 复现主线MMC整流、FCS-MPC、Simulink三者怎么咬合先说清楚这个项目复现的到底是什么。论文标题里有三个关键词理解顺序应该是被控对象是MMC整流电路控制算法是混合FCS-MPC验证手段是Simulink仿真。MMC模块化多电平换流器的核心结构不复杂每一相的上下桥臂各一串子模块Submodule, SM每个桥臂再串一个桥臂电感。整流模式就是把交流电源的能量通过这个换流器送到直流侧负载。常见的子模块是半桥结构一个电容加两个IGBT通过控制IGBT的开关把电容投入或者旁路让桥臂电压变成多电平阶梯波。FCS-MPC有限集模型预测控制则是另一条线的思路。传统控制是PI算出调制波再交给PWM调制器生成开关信号FCS-MPC直接跳过调制器枚举换流器所有可能的开关状态用系统模型预测每个状态下未来几个采样周期的输出再代入代价函数打分选分数最低的那个开关状态作为最终输出。用大白话说就像开车时每条路都试走一段挑一条代价最小的路走每隔几十微秒重新试一次。把这两者结合就是项目的主轴用MMC做整流器用FCS-MPC同时管理直流电压、交流电流、子模块电容电压和环流。Simulink负责把所有环节搭起来跑波形验证控制策略在动态负载、参考值阶跃下的表现。我在复现的时候是按这个顺序推进的先搭主电路再写控制器最后联合调试。如果一上来就把完整模型铺开出了问题很难定位是拓扑问题还是算法问题。1.2 从SCI二区论文里能学到什么纸面之外的东西复现SCI论文这件事很多人觉得就是把论文里的框图搬到Simulink里。实际操作过就会发现论文写得再详细也会留一堆坑第一是权重系数。论文里常常只写通过仿真调优得到权重不会告诉你具体怎么调。这条我后面会展开讲权重标幺化是绕不开的关键一步。第二是离散化方式。FCS-MPC的预测模型需要把连续微分方程离散化最常见的是前向欧拉法。但论文未必会写明采样周期取多少而这直接影响控制效果仿真步长差一个数量级波形可能完全不一样。第三是启动过程。论文波形里直流电压都是平滑上升到参考值的但直接合闸会有一个巨大的电容预充电电流冲击。实际模型必须在启动阶段处理预充电否则要么仿真发散要么波形和论文对不上。这些纸面之外的细节才是复现项目的核心价值。把论文的算法亲手实现一遍你对代价函数、权重、采样周期、排序算法的理解深度是看十篇综述都比不了的。复现的价值不在于跑出和论文一致的波形而在于知道波形是怎么来的。2. FCS-MPC原理与混合策略的核心逻辑2.1 FCS-MPC与传统控制的本质区别电力电子控制里传统路线是电流内环加PI控制器输出调制波然后通过SPWM或SVPWM产生开关信号。PI控制有一个绕不开的毛病它对非线性、强耦合、约束多的系统需要反复解耦和参数整定动态响应也被调制器的线性化处理拖慢。FCS-MPC完全不同。它把一个带约束的优化问题直接怼在离散开关状态上换流器能输出的开关组合是有限个那就把所有组合都算一遍选出最优。这样做有几个天然优势不需要调制器省掉一个中间环节控制结构更直接多变量可以一起放进代价函数交流电流、环流、电容电压不需要分开设计多个PI环对系统模型中的非线性项比如电流动态、电容电压波动可以直接用预测模型处理。代价是计算量大。一个三相MMC如果每桥臂N个子模块全部子模块开关组合是2^(6N)种N等于4时已经是2^24种组合根本算不完。这也是混合策略出现的根本原因——纯FCS-MPC在MMC上直接枚举是不现实的。2.2 MMC里的混合到底混了哪里我复现的论文题目里带混合两个字实际体现在两个层面。第一层是控制目标的混合。FCS-MPC的代价函数里同时放入交流电流跟踪项、环流抑制项、电容电压均衡项和开关次数惩罚项。这些目标在传统控制里是分成好几层、好几个控制器处理的在FCS-MPC框架下全部混合进一个代价函数通过权重系数统一权衡。这就是混合有限集模型预测控制最常见的一种理解。第二层是控制架构的混合。MMC子模块太多直接枚举全部开关状态不现实工程可行的做法是数量枚举排序分配的混合第一级对每一相枚举上桥臂投入子模块数量Nup和下桥臂投入数量Nlow。如果每桥臂N个SMNup和Nlow各有N1种取值0到N一相上下桥臂组合是(N1)^2种。N4时是25种三相各算一次计算量完全可控。第二级确定了投入数量后具体让哪几个子模块投入交给电容电压排序算法解决。基本原则是电容电压低的优先充电电压高的优先放电从而维持所有子模块电容电压均衡。这样整个控制器的实际构成是模型预测电流控制决定桥臂投入数 电容电压排序决定具体SM 环流代价项抑制二倍频环流的混合体。看起来不像教科书里那种纯FCS-MPC但正是这种混合结构让算法在MMC上真正跑得动。我在做仿真时也是按这个两级结构实现的MATLAB Function块里第一级枚举求最优投入数量第二级用排序选SM两个逻辑在一个控制周期内完成。2.3 代价函数设计与权重整定的实操经验代价函数是FCS-MPC的灵魂。通用的形式可以写成J (iac* − iac_pred)² λcir·(icir* − icir_pred)² λbal·Σ(Uc* − Uc_pred)² λsw·Δn每一项的物理意义第一项是交流电流跟踪误差保证整流器交流侧电流正弦且能快速跟踪参考第二项是环流抑制把内部环流压到接近零第三项是子模块电容电压相对额定值的偏差之和维持电容能量平衡第四项是相邻两个控制周期之间开关动作次数的变化用于限制开关频率。权重系数的整定是复现过程中的重灾区。我踩过的坑是直接用电流误差的绝对值去和电容电压误差的绝对值比大小结果代价函数被电压项完全主导电流波形一塌糊涂。正确做法是先归一化。我建议按标幺值设计电流误差除以额定电流的幅值电压误差除以额定电容电压环流误差也除以额定电流。归一化之后再取权重一般从λcir0.2~0.5、λbal0.02~0.1、λsw0.01~0.1起步。理由是两个变量如果量纲和幅值差异过大权重必须拉开几个数量级才能平衡贡献。调试节奏上先只保留电流跟踪项确认MMC能整流、直流电压能稳住然后加环流项观察内部环流波形是否被压下去再加电容电压均衡项看电容电压是否围绕额定值摆动最后才是开关次数惩罚。每加一项前面的波形可能会劣化需要回头微调权重这是一个来回迭代的过程别指望一次成型。3. MMC整流拓扑与控制目标解析3.1 拓扑结构和子模块工作原理MMC整流系统的主电路包含三相交流电源、进线电抗可选、三相MMC换流器、直流侧负载。每相由上桥臂和下桥臂组成每个桥臂是N个子模块串联后再串一个桥臂电感L_arm。交流侧的连接点在上桥臂电感和下桥臂电感之间直流侧正负母线分别接上下桥臂的外端。子模块以半桥型最常见一个直流电容C_sm两个IGBT T1、T2反并联二极管。T1导通、T2关断时电容投入输出电压等于电容电压UcT1关断、T2导通时电容旁路输出电压为0。通过控制每相上下桥臂投入的SM数量桥臂输出电压就能按Uc的整数倍变化叠加成多电平波形。N4时每相最多输出2N19个电平这就是多电平的来源。这个拓扑理解起来有点绕我用一个搭积木的类比每个子模块相当于一块积木投进去就提供一份电压Uc旁路就不提供。上桥臂和下桥臂总共能提供的电压之和必须匹配直流母线电压同时差值要能跟踪交流侧电压这就是桥臂电压调制的本质。整流运行时交流电源会交替对电容充电能量通过电容缓冲后送往直流侧。3.2 整流侧要同时管好四件事整流模式下的控制目标不止稳压一个。我复现时梳理了四个必须同时满足的目标第一是直流电压稳定。整流器的首要任务是把交流能量送到直流侧并稳定在参考值Udc*。在FCS-MPC框架里直流电压一般通过外环PI生成有功电流参考值或者通过代价函数里的直流项直接控制具体看论文的混合策略。第二是交流电流正弦且单位功率因数。整流器对电网而言是负载不做好功率因数控制网侧电流会畸变、无功会增加。电流跟踪项是代价函数的主项交流电流参考由直流电压外环输出的有功分量叠加锁相得到的相位构成。第三是子模块电容电压均衡。每个子模块电容电压必须稳定在Uc*≈Udc/N附近否则个别SM电压过高会损坏器件电压过低则影响多电平效果。这个目标靠排序算法实现。第四是环流抑制。MMC内部存在相间环流主要是二倍频负序分量它不流过交流侧只在三相桥臂之间循环会增加桥臂电流应力和损耗。环流抑制可以做成代价函数里的一个项也可以用独立的PI/准PR控制器这取决于控制策略的混合程度。这四件事互相耦合直流电压稳不住电流参考就乱电容电压不平衡多电平波形就畸变环流不压桥臂电流增大损耗上升。FCS-MPC的优势就是把这些目标统一到一个优化问题里通过权重系数协调。3.3 环流抑制与PI参数整定mmc环流抑制器的pi参数居然会出现在热搜词里说明这确实坑了不少人。环流抑制PI的参数比交流电流环难调原因是环流的主要成分是100Hz二倍频负序分量在同步旋转坐标系里看起来是一个交流扰动纯PI对这种周期性扰动的稳态抑制能力有限。环流抑制的常规做法有两种一种是把环流变换到二倍频负序旋转坐标系用PI控制另一种是在静止坐标系用准PR控制器在100Hz处提供高增益。前者需要对负序分量做坐标变换后者参数整定更直观。如果坚持用PI参数可以按这个思路估算。环流回路的被控对象近似是一个桥臂电感加等效电阻传递函数是1/(sL_arm R_arm)。按控制带宽ωc整定Kp ≈ ωc·L_armKi ≈ ωc·Kp/2~ωc·Kp。取桥臂电感L_arm8mH控制带宽选1000~3000rad/s那么Kp大约在8~24之间Ki大约在4000~36000之间。实际调试时可以先取Kp15、Ki8000起步观察桥臂电流里的二倍频分量。我实际调试的经验是先断开环流抑制把基波电流控制好记录环流的底噪水平然后加入环流PI从Kp较小值开始往上加直到环流幅值明显下降出现高频抖动就回调Kp稳态误差压不掉就加大Ki。如果纯PI在100Hz处始终压不干净可以在静止坐标系改用准PR谐振频率设在100Hz增益取50~200效果通常比PI好。4. Simulink仿真从零到出波形的完整搭建4.1 仿真环境与求解器配置软件版本方面MATLAB R2020b及以上都可以需要安装Simscape Electrical工具箱早期叫SimPowerSystems以及基础的Simulink。模型在R2021b和R2023a之间来回迁移过基本兼容但要注意高版本对一些电气模块的封装有改动老模型打开后可能需要更新。求解器配置是很多人忽略的第一步。FCS-MPC本质是数字控制器仿真必须体现离散采样和控制周期的概念。我的配置是求解器选离散定步长仿真步长T_sim1μs控制周期T_ctrl50μs即20kHz。控制周期决定枚举和优化的频率仿真步长则用于模拟电气连续过程。如果把仿真步长也设成50μs开关动作和梯形波会产生严重的数值误差波形毛刺很大。具体操作上在模型的Configuration Parameters里Solver选择discreteFixed-step size设为1e-6控制器的触发用Simulink的Discrete模块或者Triggered Subsystem实现一个控制周期内完成一次完整的枚举计算。另外建议把所有仿真数据记录格式改为Dataset避免To Workspace把大量变量存进base workspace拖慢速度。4.2 主电路建模与参考参数表搭主电路时三相交流电源用Three-Phase Source模块直流负载用串联R-L负载。MMC部分我建议用Simscape Electrical里的半桥子模块进行封装每个SM保留正负电气端口和脉冲输入端口然后按桥臂串联。这里遇到一个选择用Simscape的用电域模型还是用理想开关模型FCS-MPC控制的重点在算法验证子模块内部IGBT的导通压降、开关暂态反而会拖慢仿真。我在复现时用的是理想IGBT/二极管模型给每个IGBT设置snubber电阻默认1e5Ω左右这样既能正确模拟开关行为又能避免过长的仿真时间。一套可直接参考的系统参数如下按小功率实验台量级设计具体以论文原始参数为准参数数值说明交流电源线电压380V / 50Hz三相直流电压参考Udc*600V整流输出目标每桥臂子模块数N4相输出9电平子模块额定电容电压Uc*150VUdc*/N子模块电容C_sm2mF纹波约5%桥臂电感L_arm8mH约0.12pu直流负载R_load72Ω约5kW控制周期T_ctrl50μs20kHz仿真步长T_sim1μs离散定步长直流电压600V交流线电压380V峰值约537V满足整流侧直流电压略高于交流峰值的基本条件。N4时每个子模块额定150V电容2mF它们在50Hz周期里能量脉动幅值可以控制在10%以内排序算法轻松能压到5%左右。4.3 FCS-MPC控制器实现与MATLAB Function写法控制器部分我用MATLAB Function块实现输入是直流电压参考、三相交流电压、三相交流电流、桥臂环流、所有子模块电容电压输出是6N个子模块的脉冲信号或上下桥臂投入数量再配合排序模块。核心逻辑的伪代码如下function S_pwm fcs_mpc_block(u_dc_ref, v_g, i_g, i_cir, u_cap, Ts) % 输入直流参考、网侧电压电流、环流、电容电压、控制周期 % 输出所有SM的开关脉冲矩阵大小 6N x 2 N 4; % 1. 外环直流电压PI生成有功电流参考 persistent pi_dc; if isempty(pi_dc) pi_dc struct(Ki, 50, Kp, 0.5, prev_err, 0); end err u_dc_ref - u_dc; id_ref pi_dc.Kp * err pi_dc.Ki * pi_dc.prev_err; pi_dc.prev_err err; % 2. 每相枚举上/下桥臂投入数量 for ph 1:3 J_min 1e10; for Nup 0:N for Nlow 0:N % 由投入数量计算桥臂电压 v_arm_up Nup * u_cap_avg; v_arm_low Nlow * u_cap_avg; % 预测下一控制周期交流电流和环流前向欧拉 i_ac_pred i_g(ph) Ts/L_ac * (v_g(ph) - ... ); i_cir_pred i_cir(ph) Ts/L_arm * (...); % 代价函数含归一化权重 J (i_ref - i_ac_pred)^2 ... lambda_cir * (0 - i_cir_pred)^2 ... lambda_bal * sum((u_cap - u_cap_ref).^2) ... lambda_sw * abs(Nup Nlow - N_prev); if J J_min J_min J; Nup_opt(ph) Nup; Nlow_opt(ph) Nlow; end end end end % 3. 排序算法结合每个SM的电容电压和充放电状态分配具体SM % 电压低且充电的优先投入电压高且放电的优先投入 ...实际编码时注意几个细节。第一前向欧拉离散的预测模型要保持和主电路参数一致桥臂电感值变了控制器里的参数也要同步改否则预测误差大控制效果打折。第二MATLAB Function里不能用parfor但N4时一相枚举25种组合三相75次计算量完全没问题。第三所有persistent变量在仿真停止时不会自动清零重跑前用CtrlShiftF9刷新初始化否则可能带着旧状态启动。4.4 波形验证与效果指标闭环跑起来之后主要看四个波形直流电压、网侧电流、子模块电容电压、桥臂电流环流分量。直流电压应该平滑上升到600V并稳定动态过程中超调量建议控制在5%以内。网侧电流应该是正弦波和网侧电压相位一致实现单位功率因数电流THD在稳态时通常能做到5%以下。子模块电容电压应该围绕150V上下波动波动幅值在5%~10%之间四个SM的波形基本重合。桥臂电流中的二倍频环流分量应该被明显压缩理想情况是环流幅值低于额定电流的10%。在动态测试里可以对直流负载做阶跃变化比如从72Ω切换到50Ω观察直流电压的回落深度和恢复时间。FCS-MPC相对传统PI载波的优势会在这种动态场景里体现电流响应快电压跌落小。5. 常见问题与调试技巧实录5.1 仿真发散、启动冲击大怎么办复现初期最容易遇到的问题是合闸瞬间电流巨大或者干脆发散。根本原因通常是子模块电容初始电压为零MMC拓扑里所有桥臂电容在启动瞬间相当于短路路径冲击电流不受控。解决办法有两条。一是给每个子模块电容设置初始电压为额定值Uc*在电容模块的初始条件里直接填150V二是在启动回路里做预充电用一个小电阻串在交流侧等直流电压建立到一定水平后再切除预充电回路。论文波形里那种平滑的电压爬升基本都是预充电的结果。仿真发散还有一个常见原因桥臂电感没有初始电流路径时会形成数值刚性。给电感和负载并联一个足够大的电阻1e5Ω量级或者把求解器换成Backward Euler能解决大部分数值发散问题。另外IGBT的snubber电阻太小会让开关瞬间电流尖峰巨大snubber电容也不要设成0这些细节都要检查。5.2 子模块电容电压不平衡怎么定位如果波形里四个SM的电容电压明显散开先检查排序算法的执行频率。排序必须每个控制周期都执行不能每隔几步才执行一次。执行频率越低电压发散得越快。其次检查排序逻辑里对充放电方向的判断。排序算法不只是按电压排序还要考虑该SM当前是处于充电还是放电状态。整流工况下桥臂电流方向决定了投入某个SM时它是充电还是放电正确的做法是在充电阶段优先投入电压最低的SM在放电阶段优先投入电压最高的SM。这个逻辑写反了电压会迅速向两端分化。还有一种隐蔽情况上下桥臂投入数量的奇数组合导致某几个SM长期不投入。比如枚举结果总是Nup4、Nlow0那么下桥臂的SM永远在旁路电容电压完全不受控。遇到这种情况要对枚举结果做统计确认上下桥臂的投入数量分布合理。5.3 Bus Selector端口里没有可选信号这个是Simulink操作里的高频坑值得单独拎出来说。Bus Selector里看不到信号名绝大多数原因是输入线根本不是真正的总线Bus信号而只是Mux模块出来的向量信号。向量信号要用Demux选择不能用Bus Selector。排查方法很简单鼠标停在Bus Selector的输入线上看Simulink提提示的数据类型。如果显示1x1 double这类普通类型那一定是向量只有显示Bus: xxx才是真总线。另一种情况是信号虽然经过了Bus Creator但中间被Goto/From或者Signal Conversion断开了总线类型信息Simulink无法沿信号线追溯总线结构也会导致Bus Selector里没有可选信号。解决办法是让总线一直保持连续不经过任何类型转换模块或者在Bus Creator的输出端显式指定输出数据类型为总线对象。用Bus Selector前先刷新一下模型CtrlD有时候只是显示缓存问题。5.4 环流波形压不下去的几个排查方向如果环流PI已经加了但桥臂电流里的二倍频分量还是很明显先按下面顺序排查。一是参考坐标系搞错。环流在同步旋转dq坐标系里是100Hz的负序量如果你用了基波正序dq变换PI控制的稳态误差会很大。要么用二倍频负序旋转坐标要么在静止坐标用准PR。二是PI参数给出量级不对。很多人直接照搬交流电流环的PI参数这里是环流回路控制对象是桥臂电感加等效电阻参数数量级和电流环完全不同。按前面给的估算方法Kp大概十几到几十Ki是几千到几万先按这个数量级试。三是如果用FCS-MPC优先检查代价函数里环流项的权重有没有真正起作用。把λcir设到0.5以上观察J值中环流分量的占比如果占比一直很低说明权重太小环流项被电流项盖过了。四是桥臂电感模拟的是不是理想元件。把L_arm设成纯电感时理想开关模型下无论如何都会留有一定残余环流属于正常现象只要幅值在额定电流的10%以内就可以接受。5.5 仿真速度优化与模型版本管理MMC仿真因为子模块多、开关事件多跑起来往往很慢。几个有效的提速手段把没有必要内部观测的示波器改成本地存储或干脆去掉Recording Frequency设低一点使用Simscape的Local Solver功能把电气网络单独求解可以显著提速尽量用离散定步长求解器而不是连续变步长连续求解器在开关瞬间会频繁缩小步长。版本管理也提一下FCS-MPC调参时发散是家常便饭改任何一个权重或者增益前先备份最好用日期命名存一个版本。我试过在原来的模型上连着改了三个权重系数结果系统彻底发散又找不到是哪一步改坏了最后只能从备份重来。散个模型十分钟重新调一批参数是几个小时的事教训太深刻。关于复现这类SCI论文项目我个人的体会是权重系数先归一化再调别迷信论文里直接给的参数控制预测模型里的桥臂电感值必须和主电路完全一致哪怕差0.5mH都会让稳态波形劣化遇到直流电压稳不住的情况大概率不是PI参数的问题而是代价函数里电压项的权重和归一化出了问题先查这里比盲调半天参数效率高得多。这个项目做完之后往三相逆变、双向功率流动、N11甚至更高子模块数扩展都是顺理成章的路模型的核心框架不用大改把控制目标和枚举数量参数改一改就能继续用。如果你们在复现中遇到代价函数怎么调都稳不住直流电压的情况先检查预测模型里桥臂电感的微分项有没有漏掉这个坑最隐蔽。
返回列表