尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

三相PWM整流器FCS-MPC仿真:从离散模型到调参实战

三相PWM整流器FCS-MPC仿真:从离散模型到调参实战 三相PWM整流器在能量回馈、有源前端、电动汽车V2G这些场景里越来越常见说白了它就是一块能反过来发电的整流器把交流侧单位功率因数可控地变成直流母线电压。我最早接这个方向是因为一台要求频繁加减载、母线电压波动要小于5%的回馈装置当时用传统双闭环PI一版方案做下来稳态能压住一遇负载突变就露馅这才开始认真看有限集模型预测电流控制这条路。这篇文章把我从数学离散、Simulink建模到调参踩坑的完整过程写出来适合正在做三相PWM整流器仿真、想把FCS-MPC跑通并弄清楚内部细节的人参考也适合想从PI切换MPC但不知道第一步怎么下手的朋友。先说结论这套方案在Simulink里完全能复现动态确实比PI快半个身位但坑比想象中多尤其是离散模型、一拍延迟和权重因子这三件事处理不好就是满屏毛刺。1. 从PI双闭环的软肋说起FCS-MPC到底解决了什么问题1.1 三相PWM整流器的应用场景与核心痛点先捋清楚三相PWM整流器到底用在哪儿。最常见的三类场景一是电机回馈系统比如电梯、提升机、离心机原来靠制动电阻把能量烧掉现在用PWM整流器把直流侧能量反馈回电网省电二是UPS和电能质量治理设备的前级要求输入电流正弦、功率因数接近1同时直流母线电压稳定三是新能源并网和储能变流器本质也是一个双向AC/DC拓扑。它的核心能力就是四象限运行既能整流把交流变成直流也能逆变把直流回馈到交流而且输入电流是可控的正弦波不是传统不控整流的尖峰电流。这个拓扑一点都不复杂但控制上有硬要求母线电压要稳、电流波形要干净、动态响应要快。母线电压不稳会把后级逆变器的调制都带偏电流波形谐波大了过不了并网标准动态响应慢一点就可能触发过压或者欠压保护。所以控制策略一直是这个方向的研究重点。1.2 双闭环PI控制哪里不够用传统方案是电压外环加电流内环外环PI输出d轴电流给定内环PI控制dq轴电流再经过调制器SVPWM或SPWM输出开关信号。PI参数好好调一调稳态性能和动态性能在很多场合是够用的这也是为什么工业现场直到今天还是PI占大多数。但PI方案有几个先天问题。第一PI控制的带宽受限于调制和采样动态响应不可能无限快负载突变时直流母线电压会有明显跌落恢复时间靠PI积分慢慢扛。第二dq解耦是需要精确知道自己耦不耦合的电感参数如果和实际偏差大d轴、q轴电流会互相串扰动态过程会变慢甚至震荡。第三PI内环本质上是线性控制器处理非线性被控对象在整流器这种变结构强耦合系统里遇到大扰动时表现往往不理想。我实际测到的情况是PI稳态THD能做到不错比如5%以内但负载从半载切到满载时直流母线要掉20V以上恢复时间在100ms左右。某些回馈工况电流畸变更明显。这些就是我转向模型预测控制的直接原因。1.3 有限集到底是什么意思模型预测控制MPC的通用思路是根据被控对象模型预测未来几步的行为选一个能让代价函数最小的控制量输出。对于三相PWM整流器控制量是开关管的开关状态这个状态不是连续的二电平三相桥臂一共就8种组合所以叫有限集。FCS-MPC就是在这8个离散的开关状态里穷举哪个状态对应的预测电流最接近参考电流下一拍就输出哪个状态。这个思路最大的好处是直观、无需调制器。PI需要经过调制器才能生成PWMMPC直接把代价函数最小的开关状态给到桥臂本质上是一个在线优化问题。另一个好处是约束处理很自然比如你希望限制电流不超过某个值只要在代价函数里加一个惩罚项就行。当然代价函数怎么写、权重因子怎么调是后面所有麻烦的来源。不过先理解核心思想预测每一种可能的结果然后选最好的那一个就这么简单。2. 先把离散数学和开关状态算清楚后面才不返工2.1 三相PWM整流器的基本拓扑与开关函数建模是仿真第一步。三相PWM整流器主电路拓扑如下三相交流电源经滤波电感L和等效电阻R连接到三相桥臂——桥臂上半部分和下半部分各一只IGBT直流侧是支撑电容和负载。每相桥臂有且仅有两种状态定义开关函数S1表示上管导通、下管关断S0表示上管关断、下管导通。三相桥臂的组合就是二进制的000到111共8种状态对应8个电压矢量。其中000和111比较特殊交流侧被短路电流通过续流二极管续流输出电压矢量为零叫零矢量。剩下6个是有效矢量把三相电压空间分成了六个扇区。这里有个关键方向约定我采用本书最常用的整流器电压方程等下建模时所有开关状态对应的电压方向都以这个为准否则仿真结果全反电流会发散。2.2 αβ坐标系下的连续数学模型为了让三相系统在控制算法里好算先用等幅值Clarke变换把三相abc量转换到两相静止αβ坐标系。三相电压方程在αβ坐标系下可以写成L * (di_α/dt) e_α - v_α - R * i_α L * (di_β/dt) e_β - v_β - R * i_β其中e_α/e_β是电网电压在αβ轴上的分量v_α/v_β是整流器交流侧电压由开关状态和直流母线电压共同决定i_α/i_β是网侧电流。每个开关状态对应的整流器交流侧相电压按三桥臂的中点对直流负母线计算v_a Vdc / 3 * (2S_a - S_b - S_c) v_b Vdc / 3 * (-S_a 2S_b - S_c) v_c Vdc / 3 * (-S_a - S_b 2*S_c)再做Clarke变换得到v_α、v_β。做仿真之前把这8组值自己用Excel算一遍对照表如下后面看波形、排查问题都会非常方便开关状态(Sa,Sb,Sc)v_αv_β000001002/3*Vdc01101/3*Vdcsqrt(3)/3*Vdc010-1/3*Vdcsqrt(3)/3*Vdc011-2/3*Vdc0001-1/3*Vdc-sqrt(3)/3*Vdc1011/3*Vdc-sqrt(3)/3*Vdc11100这张表我会一直贴在模型旁边无论是查波形反了还是看某个扇区切换异常拿它核对绝对不会错。2.3 离散化公式与电流预测FCS-MPC要在数字控制器里运行必须把连续微分方程离散化。最常用的是前向欧拉法采样周期为Ts则i(k1) ≈ (1 - R*Ts/L) * i(k) (Ts/L) * (e(k) - v(k))这就是核心预测公式。式子很直观当前拍测得电流i(k)、电网电压e(k)和直流母线电压Vdc(k)代入8种开关状态对应的v(k)就能算出8种可能的i(k1)。再把参考电流i_ref(k1)和每一个预测值做差求代价值g (i_α_ref - i_α_pred)² (i_β_ref - i_β_pred)²取g最小的那一组开关状态作为下一周期的输出。注意参考电流这里的下标是αβ分量实际控制中一般通过电压外环得到d轴电流参考、q轴电流参考给0然后根据电网相位角做逆Park变换得到αβ参考值再进入代价函数。离散化这一步最容易犯的错是忘记单位、把电感值写成mH而不是H导致预测电流数值大得离谱代价函数永远选零矢量电流直接失控。我建议在MATLAB Function里先加一个断言让初始检查别溢出。3. Simulink分模块搭建每个模块都别想当然3.1 主电路三相电源、L滤波器、整流桥和负载我用的环境是MATLAB R2021b Simscape Electrical整套模型从主电路到控制算法大概两三小时能搭完。主电路模块选型如下三相电源Three-Phase Source设为星形Y接相电压有效值220V频率50Hz默认内阻可以设很小比如0.001Ω。滤波电感Three-Phase Series RLC Branch选成RL串联电阻0.1Ω电感5mH。因为实际电感总有内阻纯L会让仿真起步阶段有轻微直流偏置。整流桥Universal BridgePower Electronic device选IGBT/Diode桥臂数3Gate inputs选single pulses这一个设置很重要后面写门信号就只需要输出三路上管信号。直流侧并联一个电容C2200μF再并联一个可调电阻做负载。电容容量和电压纹波、动态特性直接相关后面讲参数时会细说。主电路接线要注意共地问题。Simscape Electrical里电感左边接三相电源右边接桥臂交流输入端直流负母线要连接到三相电源的中性点吗这取决于电源和负载接地设置。我的习惯是电源輸出侧用浮地不做额外接地Universal Bridge内部自带虚拟参考仿真模型才能正常求解。如果你发现仿真特别慢或者提示代数环大概率是接地和电气参考点设置有问题。3.2 测量、坐标变换和外环PI控制部分先从测量说起。需要采集的信号有三相电网电压、三相电流、直流母线电压。优先用Three-Phase V-I Measurement模块一次把电压电流都测量出来输出是Simulink信号后面好接控制算法比单独一个一个Voltage Measurement接Simulink转Simscape接口要省事得多。坐标变换分两步。第一步把测到的三相电压、电流用Clarke变换转到αβ直接写一个小的MATLAB Function公式是alpha (2/3)(a - 0.5b - 0.5c) beta (sqrt(3)/3)(b - c)第二步用PLL获取电网相位θ然后做Park变换得到dq电流d alphacos(θ) betasin(θ) q -alphasin(θ) betacos(θ)外环电压PI直流母线电压给定Vdc_ref减去测量电压VdcPI输出作为d轴电流参考i_d_ref。由于单位功率因数要求q轴电流参考i_q_ref设0。PI参数用工程整定法从带宽估先按Kp取L电流环带宽的对应值Ki取Kp的五分之一到十分之一作为基础再根据阶跃响应微调。我这里用过一组典型值Kp1.2Ki60积分限幅±20输出限幅±30。电压外环输出的是电流参考经过逆Park变换得到i_α_ref和i_β_ref才送入MPC核心模块。3.3 MPC核心MATLAB Function逐状态遍历核心算法用MATLAB Function实现输入为当前αβ电流、αβ电网电压、直流母线电压、αβ参考电流输出为三路上管门信号。下面是我一直在用的基础版本代码function [ga, gb, gc] fcs_mpc(ia, ib, ea, eb, vdc, iaref, ibref, Ts, L, R) % 8种开关状态S1表示上管导通下管互补 sw [0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 1 1; 0 0 1; 1 0 1; 1 1 1]; g_opt 1e10; ga 0; gb 0; gc 0; A 1 - R*Ts/L; B Ts/L; for k 1:8 sa sw(k,1); sb sw(k,2); sc sw(k,3); va vdc/3*(2*sa - sb - sc); vb vdc/3*(-sa 2*sb - sc); vc vdc/3*(-sa - sb 2*sc); valpha 2/3*(va - 0.5*vb - 0.5*vc); vbeta (sqrt(3)/3)*(vb - vc); ipa A*ia B*(ea - valpha); ipb A*ib B*(eb - vbeta); g (iaref - ipa)^2 (ibref - ipb)^2; if g g_opt g_opt g; ga sa; gb sb; gc sc; end end end这段代码的核心就是三步算电压矢量、预测电流、选最小代价。注意MATLAB Function输出默认是double型而Universal Bridge的门信号希望是逻辑或double都可以直接接就行。如果你在Simulink把MATLAB Function改为离散采样时间别忘了把Ts也设成和主控制周期一致防止出现“模块输出变化次数过多导致求解器闪变”。3.4 采样时间、求解器和仿真参数怎么设置仿真参数这一块看似不起眼其实会影响整个模型是否可信。控制采样时间Ts我取50μs即20kHz控制频率这个频率对FCS-MPC来说属于比较常规的选择。Ts太大比如200μs以上预测精度变差电流纹波会明显变大Ts太小比如10μsMATLAB Function每步遍历8个状态虽然不算重但和主电路电磁暂态的求解器耦合起来仿真会慢得让人失去耐心。求解器推荐用离散或固定步长。主电路是连续系统Simscape Electrical需要连续求解但控制算法是离散的这时用固定步长ode3或者ode4步长设为2μs比控制周期小一个数量级保证主电路状态在每个控制周期内有足够的插值点。如果你用变步长求解器控制算法和主电路模块之间的采样不匹配会引起抖动尤其是MATLAB Function这种自己定义离散更新率的模块我建议直接固定步长经验值仿真步长2μs控制周期Ts50μs。最后加一个单位延迟Unit Delay模块在MPC输出后面模拟数字控制器的一拍延迟这个后面第5章会专门讲为什么它很重要。4. 仿真结果怎么判读稳态、动态和权重因子4.1 稳态波形达到什么算合格模型跑通后第一步先看稳态。把负载设成额定功率比如10kW直流母线电压给定650V等波形稳定到2s以后观察几个关键指标输入三相电流是否正弦有没有明显畸变电流幅值是否和功率匹配10kW对应交流侧线电流大约15A直流母线电压是否稳在650V附近纹波峰峰值控制在10V以内已经算很好网侧电压和电流是否同相位功率因数接近1。我第一次跑出来的电流波形看着像那么回事但仔细看有比较明显的高频锯齿这就是FCS-MPC的基本特征——开关频率不固定谐波散布在较宽频带。做FFT分析时会看到谐波不像SVPWM那样集中在载波频率附近而是比较分散这是MPC天然的特点不是bug。如果你看到的是20kHz以上的连续噪声频谱反而是正常的。要检查电流有没有直流偏置看αβ电流瞬态值是否围绕零轴来回穿过如果有缓慢漂移基本可以断定离散模型里R或者e的符号反了。4.2 动态响应负载突变是试金石动态性能才是FCS-MPC的主场。仿真1s时把负载电阻从20Ω跳到10Ω观察直流母线电压波形PI控制的典型表现是母线先掉下去再慢慢爬回来掉落的深度由电容容量和环路速度决定恢复时间通常在80~150ms而MPC内环动态更快母线电压跌落幅度更小恢复时间通常可以压到50ms以内。这里有个容易误判的点动态响应快慢不完全取决于MPC内环还取决于外环PI。如果外环PI调得很软内环再快也没用母线电压恢复照样慢。FCS-MPC真正改善的是电流内环的跟随速度当电网电压突然波动、负载突加突卸时电流能够在几个控制周期内跟上参考变化。所以在对动态性能敏感的场合电压外环的带宽也值得同时拉高。4.3 代价函数里权重因子的影响如果只控制电流代价函数里不需要权重因子g就是两个电流差的平方和没有参数可调这是FCS-MPC最吸引人的地方。但很多实际应用里还希望控制直流母线电压就会把电压误差写进代价函数g (i_α_ref - i_α_pred)² (i_β_ref - i_β_pred)² λ_v * (Vdc_ref - Vdc_pred)²这时λ_v需要手工调。这个参数没有任何通解公式基本靠仿真试。λ_v太大的话系统优先压电压误差电流波形会变差甚至震荡λ_v太小电压误差权重上不来母线稳压效果差。我的经验是从0开始逐步增大每次看三个量电流THD、母线电压稳态误差、负载突变时的电压跌落深度。找到一个三者的平衡点。比如在一组参数下λ_v0.01时电压纹波有点大λ_v0.1时电流THD从3%涨到7%最后取0.05。这个方法很土但是有效。如果你希望完全不去调权重就老老实实保留外环电压PI内环只做电流MPC省心很多。5. 调试过程中真正让我头疼的四个问题5.1 采样时间不统一导致预测失败这是最容易犯的第一坑。Simulink中MATLAB Function的采样时间、Unit Delay的采样时间、Universal Bridge的Gate输入采样时间三者必须严格一致。我之前有一次把MATLAB Function设置成继承采样时间Unit Delay设置成离散50μs结果整个控制链路里各自为政预测公式里用的Ts和模块实际执行周期不一致电流波形出来像神经信号一样乱跳还不好排查。排查办法在Simulink的Sample Time Display功能里把所有模块的采样时间标出来肉眼找颜色不一致的地方。MATLAB Function建议固定设置为离散采样时间50μsUnit Delay也设置为50μsGate信号也要和它一致。这样逻辑才在同一个节拍上。5.2 一拍延迟补偿不是可选是必选前面提到我在MPC输出后加了一个Unit Delay。为什么要这样因为真实数字控制器在接收到电流采样值后要完成遍历寻优、代价计算、输出门信号这个过程至少要花掉将近一个控制周期。也就是说这一拍算出来的最优状态其实是应该给下一拍用的不是这一拍立刻就能用上。如果不加延迟补偿仿真里MPC输出立刻作用于下一瞬间你会在仿真里看到比实机好得多的结果这不真实尤其当你后面要移植到DSP时性能会突然变差让人摸不着头脑。正确做法有两步。第一步在MPC输出后加Unit Delay模拟一拍延迟。第二步需要修改预测算法来补偿这个延迟做法是在当前时刻k先用上一拍选中的开关状态或者说需要多一个输入上一拍的开关状态去预测i(k1)然后用i(k1)作为起始点再对8种状态预测i(k2)代价函数比较的是i(k2)和参考电流。这样当前拍算出的最优状态下一拍正好用上理论上把一拍延迟抵消了。如果不做第二步只看第一步动态响应会变得很差。实际模型里很多人偷懒只加Unit Delay不补偿也是错的。给一个简化的延迟补偿代码片段思路% 已知上一次输出的开关状态 sa_p, sb_p, sc_p % 第一步用上一拍的电压矢量预测 k1 电流 [i_alpha_k1, i_beta_k1] predict_current(ia, ib, ea, eb, vdc, sa_p, sb_p, sc_p, Ts, L, R); % 第二步在 k1 基础上遍历8个状态预测 k2 电流 % 用 k1 电流作为当前值对8种状态算代价选择最优输出这样改完虽然多算了一次预测但换来的是仿真行为和实机更接近。我用这个版本跑出来的结果和后面在快速控制原型上实测的波形趋势是一致的。5.3 MATLAB Function运行慢和代数环问题FCS-MPC的MATLAB Function本身计算量不大但要小心代数环。没有延迟时MPC输出直接连回Universal Bridge而Universal Bridge工作在主电路电气回路里如果再加个什么反馈直接引到输入很容易形成比较隐蔽的代数环。Simulink求解代数环会迭代仿真慢得离谱。解决办法所有从主电路反馈到控制算法的信号过一遍采样保持器或者Unit Delay切断代数环。我在电流测量和电压测量后面各加了一个Zero-Order Hold采样时间Ts50μs这样控制信号全部由离散采样值驱动。加了之后仿真速度提升了不止一倍而且波形更干净。5.4 电感参数不匹配时模型还扛不扛得住FCS-MPC是模型依赖控制预测公式里用了电感L和电阻R。如果仿真模型里的电感是5mH而算法里写的电感也是5mH性能自然好。事实是实机参数会因为温度、磁饱和而漂移电感可能从5mH变成4.2mH电阻也会变。仿真阶段就要做参数鲁棒性验证。我的做法是设计一组扫描算法内部保持L5mH不变把主电路的电感参数在4mH、5mH、6mH之间切换看电流THD和稳态误差怎么变化。实测下来电感误差在±20%以内系统仍然稳定只是THD会有1~2个百分点的变化如果误差超过30%电流容易在过零附近振荡因为预测模型和实际对象偏差太大控制器会在相邻的几个开关状态间反复切换。这个结论对后续硬件选型和参数辨识都有指导意义建议所有做FCS-MPC的仿真模型都顺手扫一遍这个参数灵敏度。6. 一组可直接复现的参数表以及往硬件走之前的几个提醒6.1 完整参数速查为了方便你复现整个模型我把上面全部参数汇总在一张表里项目参数值电网线电压有效值U_ll380V / 50Hz滤波电感L5mH电感等效电阻R0.1Ω直流母线电容C2200μF直流母线电压给定Vdc_ref650V额定功率P10kW负载电阻R_load20Ω额定10Ω过载控制周期Ts50μs固定仿真步长T_sim2μs外环电压PIKp / Ki1.2 / 60门信号Ga,Gb,Gc单脉冲上管下管互补这套参数在多数中功率模型里都能稳定跑起来如果你改功率等级按标幺化思想缩放就行电感感抗一般取系统额定阻抗的5%~8%电容支撑时间取1~2ms。6.2 从Simulink到快速控制原型和DSP的几点建议如果后面打算做硬件在环或者直接移植到DSP有几件事最好在仿真阶段就养成习惯。第一MATLAB Function采用C语言兼容的子集避免persistent变量在代码生成时出现意外尽量显式传入状态量。第二代价函数尽量用整数或定点数表达参数DSP上浮点计算不是不行而是做并行多步预测时开销大定点和查表能省不少周期。第三PLL不要省略不要因为仿真中三相电源角度可以精确知道就偷懒。并网场景下电网有谐波、频率偏移不锁相直接控制功率因数和动态都会打折扣。还有一个容易被忽略的点仿真里Universal Bridge和实际IGBT驱动板的延迟不同硬件驱动有死区时间而且死区会影响电流过零点附近的质量。仿真如果完全不建模死区会导致预测值比实际电流响应更快实机移植后面板要重新调。我建议在仿真中给门信号加一个死区模块虽然MPC实时计算复杂一点但结果更可信。6.3 还能往哪个方向改进FCS-MPC做完一版能跑后续有两条路值得走。一条是多步预测就是从预测一步扩展到两步三步代价函数需要展开的候选状态从8个变成64个甚至更多动态性能和控制性能都有增益但计算量爆炸式增长适合配合代码生成和并行计算用。另一条是无权重因子方法如果一定要把直流电压、开关频率、共模电压等目标都塞进代价函数与其盲目调λ不如用枚举排序或者模糊逻辑自动分配权重这几年论文里很多实测也确实能减少调参工作量。还有一个更工程化的方向是模型参数在线辨识。既然FCS-MPC依赖L和R那就做在线最小二乘或者卡尔曼滤波估计实时修正预测模型里的参数电感漂移的问题就能从根源上缓解。这些方向在Simulink里都能继续扩展组件和信号链路不用重搭。我个人的体会是FCS-MPC不是一个高不可攀的算法它的上限更多取决于你对被控对象离散模型的理解深度而不是算法本身有多玄。仿真阶段把每一步数学基础打扎实后面的硬件实验会顺很多。先跑通这一版再在它的基础上做改进是比较务实的路线。
返回列表