ARTICLE DETAIL

资讯详情

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

MMC整流器模型预测控制与环流抑制:Simulink仿真实践与排坑指南

MMC整流器模型预测控制与环流抑制:Simulink仿真实践与排坑指南 之前整理MMC整流器仿真模型时我实际上踩了一周的坑。理论部分背得滚瓜烂熟模块化多电平换流器、模型预测控制、环流抑制每个词都能写出一段解释。但一放到Matlab Simulink里问题全出来了要么电容电压直接飘到天上要么环流压不下来导致桥臂电流畸变要么仿真慢得让人怀疑人生。后来把模型预测控制MPC和环流抑制放进同一个控制器框架里以每个桥臂的插入数量作为优化变量才算跑出一套能稳定复现的波形。这篇内容就完整记录一下我在Simulink上搭建MMC整流器MPC仿真模型的思路、参数和踩坑经验。如果你正准备做类似的东西或者已经被电容电压发散折磨到想摔电脑这篇应该能帮你少走不少弯路。1. 整流器工况比逆变器难在哪三个控制目标互相打架先说清楚MMC本身的结构。三相MMC一共有六个桥臂每相上桥臂和下桥臂分别串联N个子模块SM桥臂之间还有电感L_arm。子模块最常用的是半桥结构两个IGBT加上一个直流电容。逆变器工况下能量从直流侧流向交流侧控制的核心是交流侧输出电压但整流器工况方向反过来了能量从交流侧流向直流侧而且交流侧接的是电网不是无源负载。这意味着整流器工况下控制系统要同时盯住三件事交流侧电流要能快速跟踪指令保证单位功率因数或者任意功率因数运行子模块电容电压不能发散否则整个桥臂电压会失去平衡系统直接崩溃相单元内部存在环流这个环流如果不抑制会让桥臂电流明显畸变还会加大损耗和电容电压波动。麻烦在于这三个目标不是独立的。交流电流的跟踪需要改变桥臂插入的子模块数量而插入数量一变电容的充放电状态就变电容电压平衡就受影响环流的本质是三相相单元之间的能量交换它跟桥臂电压的对称性直接相关而桥臂电压又由MPC的输出决定。所以我在Simulink里第一件事不是急着搭控制器而是先把这套耦合关系想清楚。模型预测控制在这个场景下最大的优势是它天然是一个多目标优化框架完全可以写成交流电流误差环流误差电容电压误差三个惩罚项的线性组合然后在一个成本函数里统一优化。这也正是标题里把模型预测控制和环流抑制放在一起的原因——它们不是两个控制器而是一个控制器干两件事。2. 主电路与Simulink分层搭建既要拓扑像又要仿真跑得动2.1 主电路参数怎么起步我建议不要一开始就上大容量、多电平的完整模型。先用一个规模较小的系统把控制逻辑跑通再慢慢加大N。我实际用的起步参数如下参数数值说明直流侧额定电压 Vdc20 kV整流器输出侧交流侧线电压有效值10 kV / 50 Hz电网或理想电源子模块数量 N每桥臂4起步用4验证后改8子模块电容 C3 mF按每桥臂储能经验公式估算桥臂电感 L_arm8 mH兼顾环流抑制与电流响应速度额定功率 S5 MVA控制目标计算用控制周期 Ts50 usMPC执行周期桥臂电感这个参数比较关键。L_arm太小环流抑制需要的电压差能力不足二倍频环流很难压下去L_arm太大交流电流的动态响应会变慢MPC在短预测步长内做出来的控制量可能不够剧烈。工程上常见的做法是按标幺值选取L_arm大约取0.05~0.1 pu。按我这里的额定容量和电压估算的话基准阻抗 (Z_{base} V_{ll}^2 / S)线电压按10kV算大约是20 ohmL_arm取0.04 pu左右折算下来约2.5 mH我在仿真里取8 mH相当于0.13 pu环流抑制余量给得比较足代价是交流电流阶跃响应稍微慢一点。这组参数不需要跟真实工程完全一致仿真模型的重点是让环流、电容电压波动这些现象能被明显观察到同时又留出足够的调节空间给控制器。2.2 子模块建模与控制接口主电路我用的是Simscape Electrical的Specialized Power Systems库。如果不熟悉库路径可以在Simulink库浏览器里搜索Universal Bridge和Capacitor但更推荐直接搜索MMC较新版本的Simulink自带了MMC示例模型里面包含了半桥子模块和桥臂电感的完整结构。如果使用自建子模块半桥SM内部就是两个理想IGBT、两个反并联二极管和一个直流电容。仿真初期强烈建议把IGBT设为理想开关模型不要启用导通电阻和详细损耗模型。原因很直白六个桥臂、每个桥臂N个SM开关级模型加变步长求解器仿一个0.5秒的工况可能要跑一下午。理想开关能把仿真速度提升一个数量级对验证控制算法完全够用。控制信号接口这里有个很容易出错的地方。每个桥臂有N个子模块所以每相需要生成两路门控向量每个向量长度是N。不要试图把门控信号一根一根连进Scope那会看得你眼花。正确做法是子模块门控端口接收的是1×N的脉冲向量MPC控制器输出每相上桥臂插入数量np和下桥臂插入数量nn再经过排序平衡算法变换成1×N的门控向量用Data Type Conversion模块把double类型的逻辑值转成boolean防止Simulink报数据类型错误。电容电压测量也是一样每个桥臂的N个SM电容电压合成一个1×N向量送进MPC模块。这样整个控制器输入接口就非常干净六个桥臂电流、三相交流电流、直流侧电压、六个桥臂电容电压向量输出六组门控向量。2.3 仿真步长和多速率问题MMC模型预测控制的本质是把连续系统离散化后做滚动优化所以仿真必须使用定步长离散求解器不能用变步长。我用的是discrete定步长求解器步长直接设置为Ts50us也就是MPC的控制周期和仿真步长一致。如果后续你想让MPC每200us执行一次而仿真步长50us就需要在控制器里做好采样保持。这个多速率配置很容易产生代数环问题尤其是当MPC的输出又直接反馈到主电路开关信号上时。建议在MPC输出端加一个Memory或Unit Delay模块切断代数环这个细节如果不注意模型会在仿真一开始报代数环错误或者明明没报错但波形像心电图一样乱跳。3. MPC预测器的Matlab实现状态方程、枚举逻辑与权重设计3.1 桥臂电流和环流的离散预测模型MMC做模型预测控制时最经典的状态变量是桥臂电流和电容电压但如果你把六个桥臂的N个SM电容电压全部当状态状态维度会爆炸预测计算完全跑不动。我在项目中采用的是一套文献中常见的简化模型用每个桥臂的插入数量np和nn作为控制变量电容电压只跟踪桥臂总电容电压和具体到每个SM的均衡交给排序算法来处理。定义j相的上桥臂电流为(i_{pj})下桥臂电流为(i_{nj})交流侧输出电流为(i_{sj})环流为(i_{cirj})。由电路关系[ i_{pj} \frac{i_{sj}}{2} i_{cirj},\quad i_{nj} -\frac{i_{sj}}{2} i_{cirj} ]桥臂电流的动态方程可以写成[ L_{arm}\frac{di_{pj}}{dt} \frac{V_{dc}}{2} - v_{pj} - u_j ][ L_{arm}\frac{di_{nj}}{dt} \frac{V_{dc}}{2} - v_{nj} u_j ]其中(v_{pj})和(v_{nj})分别是上下桥臂投入的子模块总电压。把两式相加得到环流动态[ L_{arm}\frac{di_{cirj}}{dt} \frac{V_{dc}}{2} - \frac{v_{pj} v_{nj}}{2} ]两式相减得到交流输出电流动态[ L_{arm}\frac{di_{sj}}{dt} v_{nj} - v_{pj} - 2u_j ]这个推导非常关键因为你马上会看到环流和输出电流是可以通过桥臂电压差分别控制的。MPC的作用就是选择一组((np, nn))等效为选择(v_{pj})和(v_{nj})同时让(i_{sj})和(i_{cirj})都逼近目标。离散化用最简单的前向欧拉法就够了[ i(n1) \approx i(n) \frac{T_s}{L_{arm}} \cdot \frac{di}{dt} ]不需要用更高阶的离散方法因为MPC本身就是在一个很短的时间窗内做优化欧拉法在50us控制周期下精度足够。对电容电压总和的预测我用的是[ V_{sum,pj}(n1) V_{sum,pj}(n) - \frac{n_{pj} \cdot i_{pj} \cdot T_s}{C} ]注意这个式子是近似模型它假设同一桥臂内的SM电容电压基本均衡所以总电压变化可以按每个SM电容的充放电累加来估算。只要排序平衡算法每步都在工作这个近似就是可靠的。3.2 最优开关组合的直接枚举流程在我这套简化方案里MPC的输出不是直接写IGBT门控而是给每个桥臂输出一个插入数量。每个桥臂的插入数量范围是0到N所以每相上下桥臂的组合数是((N1)^2)。N4时只有25种N8时是81种直接枚举完全没问题Matlab Function模块里一个双重循环就搞定。核心伪代码如下function [np_opt, nn_opt] mpc_predict(i_s, i_cir, Vsum_p, Vsum_n, Vdc, u_g, Ts, Larm, C, N, i_s_ref, i_cir_ref, Vc_ref) J_min 1e10; np_opt 0; nn_opt 0; for np 0:N for nn 0:N % 等效桥臂电压 vp_est np * Vsum_p / N; vn_est nn * Vsum_n / N; % 预测输出电流 di_s (vn_est - vp_est - 2*u_g) / Larm; i_s_next i_s Ts * di_s; % 预测环流 di_cir (Vdc/2 - (vp_est vn_est)/2) / Larm; i_cir_next i_cir Ts * di_cir; % 预测电容总电压 Vsum_p_next Vsum_p - np * i_s_cal * Ts / C; Vsum_n_next Vsum_n - nn * i_s_cal * Ts / C; % 计算成本函数 J ... lam1 * (i_s_next - i_s_ref)^2 ... lam2 * (i_cir_next - i_cir_ref)^2 ... lam3 * ((Vsum_p_next - N*Vc_ref)^2 (Vsum_n_next - N*Vc_ref)^2); if J J_min J_min J; np_opt np; nn_opt nn; end end end end这里有两点需要提醒。第一(i_s_cal)在预测电容电压时应该用桥臂电流的实际方向充电为正、放电为负方向搞反了电容电压必炸。第二(Vsum_p/N)和(Vsum_n/N)是当前桥臂平均SM电压作为估算(v_{pj})的方式足够粗糙也足够快。3.3 排序平衡算法和MPC怎么配合MPC只决定每个桥臂投入几个SM具体投入哪几个必须交给排序算法完成。否则即使mpc算出了正确的np电容电压也会因为总是投入同一批SM而迅速失衡。排序算法的逻辑并不复杂每个控制周期开始时采集某桥臂的N个子模块电容电压并测当前桥臂电流方向对N个电压做升序排序如果桥臂电流方向是给电容充电正向则投入电压最低的np个SM让它们充电把电压拉起来如果桥臂电流方向是放电负向则投入电压最高的np个SM让它们放电把电压压下去。代码实现起来很短function g sort_dispatch(Vsm, np, i_arm, N) [~, idx] sort(Vsm); g zeros(1, N); if i_arm 0 sel idx(1:np); else sel idx(N-np1:N); end g(sel) 1; end这里有个细节很容易被忽略排序算法在每个桥臂上独立运行但np来自MPC而MPC预测电容电压变化时用的是投入数量np和桥臂电流i_p的乘积。如果你的排序算法选出的SM跟MPC预测时假设的平均电压差异过大模型预测就会失真。因此MPC模块里估算桥臂电压时要使用当前桥臂实时平均电压而非额定电压。实际操作中这个组合已经能保证电容电压在很窄的范围内波动。4. 环流抑制为什么要和MPC放在同一个成本函数里4.1 环流的物理根源二倍频负序分量MMC的环流是所有相单元共有的电流分量它不流回交流侧只在三个相单元与直流母线之间活动。为什么会有环流因为每相的瞬时功率不是恒定的在交流电压和电流都为正弦的情况下单相瞬时功率包含二倍频脉动。三相总功率是恒定的但每相的能量脉动需要地方释放于是就在三相相单元之间形成二倍频环流。从数学上看环流的主要成分是二倍频负序也就是以 (-2\omega) 旋转的分量。如果不抑制它会让上下桥臂电流不再是纯正弦叠加直流分量而是出现明显的二倍频畸变直接影响损耗、电容电压波动和电容寿命。4.2 把环流误差写进成本函数既然MPC本身是一个多目标优化器那我就不需要额外加一个PR控制器或者PI控制器来专门压环流直接把环流预测值和环流参考值的误差加进成本函数就行。问题马上来了环流的参考值应该是多少正常情况下直流侧电流大致均分到三个相单元所以每相环流的直流分量应该等于(I_{dc}/3)。如果整流器输出功率是P直流电压是Vdc则[ i_{cir,ref} \frac{P}{3 V_{dc}} ]至于二倍频分量我们希望它是0。所以成本函数里的环流项就写成[ J_{cir} \lambda_2 \left( i_{cir,pred} - \frac{I_{dc}}{3} \right)^2 ]MPC在枚举每个((np, nn))组合时会自动寻找那个能让环流最接近直流分享值的组合。你会发现只要这个代价函数的权重给够上下桥臂的电压之和就会自动被压到接近Vdc的水平因为环流方程的右侧就是((Vdc/2 - (v_pv_n)/2))这正是MPC可以控制的量。4.3 权重的经验调节方法关于权重系数我踩过一个很深的坑。最初我把三个权重都设为1结果交流电流跟踪得还行但环流纹波非常大电容电压波动也超标。后来看了几篇文献的调参思路才总结出一套经验法则。(\lambda_1)负责交流电流跟踪这是首要目标设成1作为基准(\lambda_2)负责环流抑制一般先取0.1~0.3再往上加。加到能看到环流明显收敛为止。但不要加太狠否则MPC会牺牲输出电流跟踪来压环流(\lambda_3)负责电容电压总能量跟踪取0.01~0.05量级它的作用是防止总电容电压缓慢漂移不需要太大。举个例子我调试后稳定下来的一组权重是(\lambda_11)(\lambda_20.25)(\lambda_30.02)。如果你发现调(\lambda_2)效果不敏感先检查采样频率。控制频率太低的时候二倍频环流的相位信息已经丢失MPC根本来不及响应。我的经验是Ts要做到50us以下也就是20kHz的控制频率对50Hz系统来说一个工频周期能执行400步优化MPC对环流的压制能力才发挥得出来。5. 从发散到稳定我的仿真调参复盘全记录5.1 问题一电容电压持续漂移第一版模型跑起来后交流电流波形还行但六个桥臂的电容电压整体往下掉最后触发保护停机。排查链路是这样走的先把MPC输出门控断开单独用一个固定插入数跑看电容电压是否稳定。结果固定插入下电压能稳住说明主电路模型和电容参数没问题再检查MPC成本函数里的电容电压项发现我在预测电容电压变化时桥臂电流的方向符号写反了。充电工况写成放电导致MPC每次都选错排序方向修正符号后电容电压还是缓慢漂移但不再快速跌落。这次问题出在排序算法与MPC插入数不同步MPC认为投入了4个SM但排序算法由于桥臂电流过零判断不准确有时候只投入了3个。最终的解决办法是在排序算法里加入一个过零滞回判断避免电流方向在0附近反复抖动导致SM频繁投切。5.2 问题二环流压不下来电容电压基本稳住后Scope里看桥臂电流还是会看到明显的二倍频包络。我一开始觉得是(\lambda_2)不够直接调到1.5。结果环流确实小了但交流电流THD上来了波形顶部明显削平。这是个典型的权重失衡现象。回头看问题出在两个层面环流参考值设置不对。我最初用(I_{dc}/3)但直流侧电流没经过滤波包含二倍频分量导致参考值本身是抖动的控制频率不够。当时Ts取值100us整整一个工频周期只有200个控制点二倍频环流的抑制需要更密集的更新。改进措施是先用低通滤波器处理直流电流测量再计算环流参考值同时把Ts从100us降到50us。调整后环流纹波从约15%降到了6%左右桥臂电流波形明显干净。5.3 问题三仿真速度慢到不能忍N8之后排序算法要处理每桥臂8个电容电压MPC枚举81种插入组合Simulink在每个步长都要跑一遍Matlab Function0.3秒的仿真时间跑了整整两个小时。我用的几个优化手段Simulink里Matlab Function的代码尽量用向量化计算避免在循环内调用sort等内置函数过多排序算法只在MPC输出改变时才重新排序但MMC的每个控制周期输出都在变所以这个优化空间不大更有效的是把排序逻辑写成C Mex文件或者用MATLAB Function的代码生成选项让Simulink把控制器编译成C代码再跑仿真时长控制到0.2~0.3秒足够观察稳态波形和暂态响应不需要跑满1秒。5.4 稳定后的性能表现调通之后我记录了一组典型的稳态数据指标数值交流侧电流THD4.8%直流侧电压纹波1.2%电容电压波动范围额定值的±4%环流二倍频分量峰值额定桥臂电流的6%这个结果对比不加环流抑制项的对照组有明显的差别对照组环流峰值达到桥臂电流的18%电容电压波动也接近±8%。所以MPC里那一个环流误差项实际起的作用比我预想的大得多。6. 后续可以继续扩展的几个方向这个模型跑通之后我最近在往两个方向延伸。第一个方向是整流器/逆变器工况切换。整流器模型的控制器和逆变器差别不大主要是参考值方向不同把交流电流指令的符号逻辑改一下就能覆盖能量双向流动的工况。这个对做微电网双向变流器的人比较有用。第二个方向是把环流抑制从固定权重改成自适应。现在(\lambda_2)是固定值实际运行中如果电网电压波动固定权重很难同时兼顾稳态和暂态。我准备做一个简单的一维模糊调节当环流误差超过阈值时自动加大(\lambda_2)等到环流收敛后再降回来。这个改动在Simulink里用一两行逻辑就能实现但对控制性能的提升比较明显。最后分享一个小技巧调试MMC这种多变量系统时一定要先把Scope改成Stairstep方式显示否则连续变化门控信号下看到的波形会很乱很难判断MPC是不是真的在切换插入数量。这个细节不花什么时间但对排查控制器故障能省很多事。
返回列表