三相PWM整流器模型预测控制仿真:从原理到Simulink实现
1. 为什么我对三相整流器选择了模型预测控制先说结论做三相PWM整流器仿真传统双闭环PI控制确实稳但模型预测控制MPC是另一个维度的思路——它把“调制”这个环节直接干掉了。我拿到这个课题的第一反应就是这玩意儿的价值不在于“能整流”而在于“控制思路完全不同”。先聊聊背景。三相整流器说白了就是把三相交流电变成可控的直流电同时让输入电流接近正弦、功率因数接近1。传统方案是电压外环加电流内环内环用PI调节器再经过SVPWM调制输出PWM波。这条路线成熟、稳定、资料多但有个绕不开的问题PI参数整定依赖工作点负载突变或者电网电压波动时动态响应总是慢半拍。模型预测控制的思路就完全不一样了我不需要调PI参数而是利用整流器的数学模型去“预测”未来某个时刻的电流然后遍历所有可能的开关状态选一个让预测结果最接近目标的开关组合直接输出。一步到位不需要调制也不需要电流内环的PI调节器。这个方案适合谁适合已经掌握MATLAB/Simulink基础、想深入理解现代电力电子控制算法的人。如果你只是毕设需要凑一个仿真交差那传统PISVPWM就够了但如果你希望论文里有“算法对比”“动态性能分析”这种内容MPC会给你提供非常丰富的素材。需要的基础三相PWM整流器主电路拓扑、Clark变换至少知道αβ坐标系怎么来的、Simulink的基本操作。不需要懂太深的数学后面的预测方程推导我会一步一步拆开讲。2. 先从模型本身说起三相整流器的核心数学模型2.1 拓扑结构和坐标变换这两件事绕不开三相PWM整流器拓扑长什么样三相交流电源经三个滤波电感L接入六个IGBT组成的三相桥臂直流侧接电容C和负载。这个拓扑干的事很朴素通过控制六个开关管的通断让输入电流跟踪电网电压实现单位功率因数整流。但问题来了三相系统三个变量互相耦合直接在abc坐标系下做控制非常痛苦。所以我们要做坐标变换把abc三相旋转坐标系下的量变到静止的αβ坐标系下或者旋转的dq坐标系下。这里我选择αβ静止坐标系原因后面会讲到。Clark变换的公式不长但别背理解它就行——本质就是把三相向量合成为一个复向量。变换公式[ \left[ \begin{array}{c} u_\alpha \ u_\beta \end{array} \right] \frac{2}{3} \left[ \begin{array}{ccc} 1 -\frac{1}{2} -\frac{1}{2} \ 0 \frac{\sqrt{3}}{2} -\frac{\sqrt{3}}{2} \end{array} \right] \left[ \begin{array}{c} u_a \ u_b \ u_c \end{array} \right] ]电流和电压都用同一变换这个在仿真里直接用三相还是αβ分量的区别在于控制方程的形式。2.2 预测方程的推导这一小段数学是全文最关键的在αβ坐标系下整流器的数学模型长这样[ L \frac{di_\alpha}{dt} e_\alpha - R i_\alpha - u_{r\alpha} ][ L \frac{di_\beta}{dt} e_\beta - R i_\beta - u_{r\beta} ]其中(e_\alpha)、(e_\beta)是电网电压的αβ分量(u_{r\alpha})、(u_{r\beta})是整流器输入电压的αβ分量(R)是线路等效电阻(L)是滤波电感。这个方程的物理意义不复杂电感两端电压等于电网电压减去电阻压降再减去整流器输入电压。整流器输入电压取决于当前开关状态和直流母线电压(V_{dc})——八个开关状态对应八个电压矢量其中两个是零矢量。把连续微分方程用一阶前向欧拉法离散采样周期是(T_s)[ \frac{di}{dt} \approx \frac{i(k1) - i(k)}{T_s} ]代入得到预测方程[ i_\alpha(k1) \left(1 - \frac{R T_s}{L}\right) i_\alpha(k) \frac{T_s}{L} \left( e_\alpha(k) - u_{r\alpha}(k) \right) ][ i_\beta(k1) \left(1 - \frac{R T_s}{L}\right) i_\beta(k) \frac{T_s}{L} \left( e_\beta(k) - u_{r\beta}(k) \right) ]这句是点睛之笔给定了当前采样时刻的电流和电网电压再假定某个开关状态下的(u_{r\alpha})、(u_{r\beta})就能算出下一时刻的电流预测值。遍历八个开关状态算出八个预测电流谁的误差最小就选谁。用αβ坐标系而不是dq坐标系的原因也在这里——αβ坐标系下不需要锁相环PLL省掉一个复杂模块动态响应还更快。代价是代价函数里电流参考值是正弦波αβ下是交变分量控制的“目标”一直在变但这在仿真里根本无所谓计算量也不比dq大多少。2.3 代价函数的设计选状态不能只看电流误差代价函数是MPC的“决策准则”每个采样周期里控制器要回答一个问题八个开关状态用哪个最好最基础的代价函数直接比较预测电流和参考电流的绝对误差[ g \left| i_{\alpha,ref}(k1) - i_\alpha(k1) \right| \left| i_{\beta,ref}(k1) - i_\beta(k1) \right| ]这是一个“单目标”代价函数——只关心电流跟踪效果。实际仿真里我建议从它开始跑通了再扩展。想压制开关频率、减少器件损耗就加一项[ g g_{base} \lambda_{sw} \cdot n_{sw} ](n_{sw})代表当前开关状态相对上一个周期的开关动作次数比如三相桥臂里有两相动作那(n_{sw}2)(\lambda_{sw})是加权系数越大越偏向于减少开关次数但代价是电流谐波变大。还有一个常见扩展是直流侧电压控制。如果你不想用电压外环传统方案里是PI调节可以把电压误差加进代价函数[ g g_{base} \lambda_v \left| V_{dc,ref} - V_{dc}(k1) \right| ]预测(V_{dc}(k1))需要知道负载电流而负载电流取决于负载本身模型比较复杂。我的经验是仿真里先用电压外环PI把“电压任务”搞定MPC专注“电流跟踪”效果反而好。单靠一个MPC同时管电压和电流整定权重系数会让你怀疑人生——这个坑我踩过。注意代价函数里各项的量纲和数量级要统一否则大数值项会“淹没”小数值项。电流误差大概是几安培的级别电压误差是几百伏特不归一化的话电压项永远占主导电流就完全失控了。3. 仿真模型搭建Simulink里从零开始分模块拆解3.1 主电路建模三相电源、电感、桥臂的搭法打开Simulink新建一个模型。先搭主电路我习惯按以下顺序操作第一步放置三相交流电源模块。在Simulink库浏览器里找到Simscape Specialized Power Systems或者Simscape Electrical下的Three-Phase Source线电压设为380V对应相电压约220V频率50Hz。设置界面里注意电源内部阻抗设为很小值比如0.001Ω模拟理想电压源。第二步放三相滤波电感。直接用三个RLC分支模块Series RLC Branch配置成电感或者用Three-Phase Series RLC Branch一次性搞定。电感值设多少这个后面3.3节专门说这里先留个悬念。第三步放三相整流桥。Simscape里提供了Universal Bridge模块桥臂数选3功率器件选IGBT/Diode就是三相全桥整流器的标配结构。注意不要用自带的三相整流器模型那个是二极管不控整流不含IGBT开关控制逻辑。第四步接直流侧。直流母线接一个电容电容两端接一个可变负载比如Variable R Load或者拆成可控电流源模拟负载。电压测量模块装好后面控制要采样直流电压。所有模块连完之后记得加一个Powergui模块Simscape Electrical里必须有否则仿真报错并且在Powergui里选择离散求解模式设定离散采样时间——通常和控制采样周期设为同一个值。3.2 控制算法实现MATLAB Function写预测控制器控制器的核心是一个MATLAB Function模块它的输入是αβ电流参考值、当前αβ电流、当前αβ电网电压、上一步开关状态输出是三相桥臂的开关信号六个IGBT的触发脉冲。我实际用的核心代码经过简化后大概是这样的function [Sa, Sb, Sc, sw_prev_out] mpc_controller(... ialpha_ref, ibeta_ref, ialpha, ibeta, ealpha, ebeta, Vdc, ...) % 参数采样周期、电感、电阻 Ts 2e-5; % 采样周期 20us L 0.01; % 滤波电感 10mH R 0.05; % 线路等效电阻 % 常数项 c1 1 - R*Ts/L; c2 Ts/L; % 当前参考电流k1时刻的参考用当前值近似 ialpha_ref_k1 ialpha_ref; ibeta_ref_k1 ibeta_ref; % 八个开关状态的占空比组合分别是[Sa Sb Sc] % 这里使用alpha-beta坐标系下的整流器电压矢量查表方式 % 八个矢量对应的开关组合[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; Sa_opt 0; Sb_opt 0; Sc_opt 0; % 遍历所有开关状态 for idx 0:7 % 由开关状态计算整流器输入电压这里按编码顺序 if idx 0 Sa_t 0; Sb_t 0; Sc_t 0; elseif idx 1 Sa_t 1; Sb_t 0; Sc_t 0; elseif idx 2 Sa_t 1; Sb_t 1; Sc_t 0; elseif idx 3 Sa_t 0; Sb_t 1; Sc_t 0; elseif idx 4 Sa_t 0; Sb_t 1; Sc_t 1; elseif idx 5 Sa_t 0; Sb_t 0; Sc_t 1; elseif idx 6 Sa_t 1; Sb_t 0; Sc_t 1; else Sa_t 1; Sb_t 1; Sc_t 1; end % 理想的整流器输入电压忽略直流纹波 % 开关函数上管导通1下管导通0输出相电压 Sa*Vdc 以直流负极为参考 ur_a (2*Sa_t - Sb_t - Sc_t) * Vdc / 3; ur_beta (sqrt(3)/3) * (Sb_t - Sc_t) * Vdc; % 预测下一时刻电流 iap c1 * ialpha c2 * (ealpha - ur_a); ibp c1 * ibeta c2 * (ebeta - ur_beta); % 代价函数可加开关动作惩罚项 g abs(ialpha_ref_k1 - iap) abs(ibeta_ref_k1 - ibp); % 只选最优的 if g g_opt g_opt g; Sa_opt Sa_t; Sb_opt Sb_t; Sc_opt Sc_t; end end Sa Sa_opt: Sb Sb_opt; Sc Sc_opt; sw_prev_out [Sa_opt Sb_opt Sc_opt];这个代码看着短但里面有两个容易错的地方值得重点提一下。第一是整流器电压的计算。我用了(u_{ra} \frac{2S_a - S_b - S_c}{3} V_{dc})这一式子它是把三相桥臂开关函数映射到α相电压的简化形式。三相桥臂上管导通时(S_x1)下管导通时(S_x0)。如果你直接拿这个公式和αβ坐标变换对不上号检查坐标变换系数是否归一化——这里(\beta)项用了(\frac{\sqrt{3}}{3})而不是(\frac{1}{\sqrt{3}})根本原因是Clark变换有幅度不变和功率不变两种版本仿真里一定要统一。我踩过这个坑变换用功率不变整流器电压用幅度不变电流预测全都对不上电流畸变成一团。第二是电流参考值的生成。αβ坐标系下的参考电流是正弦波它是从哪来的答案是如果目标是单位功率因数整流参考电流应该和电网电压同频同相。最简单的做法是把网侧电流的参考直接设为“电网电压的αβ分量乘以一个比例系数”这个系数由电压环PI的输出决定。也就是说电压外环PI输出的是参考电流的幅值拿它乘上电网电压的单位正弦向量就得到αβ坐标系下的正弦参考电流。这个方法简单可靠还不依赖锁相环特别适合αβ坐标系下的MPC。3.3 关键参数计算电感、电容、采样周期怎么选这套参数是MPC模型的核心选不好仿真能跑但波形一塌糊涂。电感L的取值主要受电流纹波约束。三相整流器在MPC控制下电流纹波的粗略估算公式[ \Delta i_L \approx \frac{V_{dc}}{4 L f_{sw,eff}} ]其中(f_{sw,eff})是等效开关频率MPC下开关频率不固定但平均大约在(1/(3T_s))左右。如果(V_{dc}700V)(T_s20\mu s)(L10mH)[ \Delta i_L \approx \frac{700}{4 \times 0.01 \times 16667} \approx 1.05A ]对于额定电流几十安培的系统这个纹波完全可以接受。L选小了纹波大选大了动态响应慢还有一个副作用L过大会让预测模型中(1 - \frac{RT_s}{L})这一项接近1预测结果对L的参数误差非常敏感鲁棒性下降。直流侧电容C主要决定电压纹波和动态响应。简单估算公式[ C \geq \frac{I_{load}}{2 \cdot f_{grid} \cdot \Delta V_{dc,ripple}} ]比如负载电流10A允许电压纹波5V电网频率50Hz[ C \geq \frac{10}{2 \times 50 \times 5} 0.02F 20000\mu F ]这个值偏大实际系统里往往结合电压外环的PI调节允许更大的纹波用更小的电容。我仿真里常用的配置是额定功率10kW直流电压700VL5mH到15mHC2000μF到5000μF(T_s)从10μs到50μs都能跑。采样周期(T_s)的选择是个权衡。T_s越小预测越精确开关频率越高谐波越小但Simulink仿真步长要跟着缩小、计算量急剧上升。T_s大到什么程度会出问题当(T_s)和系统的电气时间常数(L/R)接近时离散化的误差会让预测失去意义。我的经验(T_s)至少要比(L/R)小20倍以上80倍以下。比如(L10mH)、(R0.1\Omega)那么(L/R0.1s)(T_s20\mu s)完全没问题。3.4 电压外环加MPC内环完整控制框图怎么搭只靠MPC管电流直流电压是控制不住的——MPC不知道功率要往哪流。所以电压环必须有。我用的结构是标准的串级控制电压外环PI调节器输入是(V_{dc,ref}-V_{dc})输出是参考电流幅值(I_m)。采样频率不用太高几百赫兹到一两千赫兹即可。电流内环MPC控制器输入是参考电流幅值I_m乘以电网电压单位向量得到的αβ参考电流再加上当前电流、电网电压、直流电压测量值输出开关状态。采样频率就是MPC的(T_s)。电压外环PI的参数整定用传统方法就行。我一般先把电流环看成理想环节MPC动态够快这个近似成立然后电压外环按典型II型系统整定。但仿真里有个小技巧直接用试凑法先设大比例系数让电压快速逼近参考值再加积分消除稳态误差。比如10kW系统典型PI参数可能是(K_p0.8)(K_i20)具体还得看你的电容值大小。搭建顺序可以参考我的步骤第一步先把主电路搭好用开环或者简单的PWM调制验证主电路接线正确。第二步把MPC控制器接上去先给一个固定的参考电流比如恒定幅值10A的正弦电流参考验证电流内环能正确跟踪。第三步把电压外环PI接上电压参考设为700V验证整个系统闭环稳定。这个顺序不要跳。很多同学一上来就把整个系统搭好结果一仿真波形乱七八糟也不知道是主电路错了、坐标变换错了还是控制器算错了排查起来极其痛苦。分步验证每步只验证一个环节是最笨但最可靠的方法。4. 仿真过程实操从建模到出波形的完整记录4.1 仿真参数设置与求解器配置模型搭完仿真参数是下一关。打开Simulink的Model Configuration Parameters求解器选择因为Powergui已经选了离散模式这里的求解器就选离散discrete不需要连续求解器。固定步长设置成和MPC采样周期一致或略小——我一般用固定步长1e-5秒10微秒如果(T_s)是20微秒步长1e-5刚好一个开关周期内计算两个控制周期波形曲线平滑。仿真时长怎么设我习惯先跑0.5秒看稳态再加负载突变跑1.5到2秒看动态。仿真时间太长没用MPC的Simulink仿真非常慢——毕竟每个控制周期要遍历八个开关状态你肉眼看着仿真进度条走得像蜗牛就知道“实时性”其实是MPC的痛点之一。我的建议稳态波形看0.3到0.5秒足够了动态响应看突变后0.2秒内的波形对焦要精准不要浪费时间跑全程。启动方式也要注意。我的做法电压环参考值先不要直接给700V而是给目标值300V等系统稳定后再在0.5s时突然把参考值跳到700V看动态响应。这比直接冷启动更容易观察MPC的动态行为因为冷启动瞬间电容充电电流非常大电流容易超调触发保护波形也没参考意义。4.2 电流跟踪和直流电压波形怎么看结果、怎么判断好坏仿真跑完把示波器里的波形拿出来看。我在实操中最关心的三个波形第一个是直流母线电压(V_{dc})。稳定后应该平滑地停在700V附近纹波峰峰值不超过几个伏特波形里不该有明显的PWM纹波电容滤掉了。母线电压在负载突变时会有一个短暂的跌落或过冲然后恢复到700V恢复时间反映电压环带宽。第二个是αβ坐标系下的电流跟踪波形。把MPC的控制器输出预测电流或目标电流和实际电流放同一张图里看。电流波形应该是一条平滑正弦线没有明显的锯齿或者台阶。锯齿明显说明开关频率太低或T_s偏大波形毛糙可能是采样噪声或数值问题电流和参考有明显相位差那是电压环PI参数不对。第三个是三相输入电流的abc波形和电网电压波形叠放在一起。单位功率因数就是电流和电压同频同相——看波形电流过零点应该和电压过零点重合。如果电流相位超前电压容性或滞后感性说明控制里存在相位误差多半是滤波器或者延迟补偿没做好。顺便说一下THD总谐波畸变率。Simulink里有THD测量模块或者用Powergui里的FFT工具直接看电流THD。我做的仿真在合理的L和T_s下MPC的电流THD普遍能低于5%好的配置能到2%左右这个指标比传统PI加SVPWM略差一点——但MPC的优势从来不在稳态谐波而在动态响应别搞混了。4.3 延迟补偿的问题这一步经常被忽略但影响极大做MPC仿真有个细节一开始就要思考数字控制器执行“采样-计算-输出”是需要时间的。你在Simulink的MATLAB Function里写“假设采集k时刻数据计算并输出k时刻的控制量”仿真器默认是在同一时刻完成的——这是理想情况。但真实控制器里从采样到来得及输出PWM总有一段计算延迟通常是一个或两个采样周期。仿真要不要加延迟补偿我的建议是先不加延迟把基本系统跑通然后加一拍延迟对比波形感受差异。加延迟补偿的方法也简单预测方程里不用k时刻的电流做预测起点而用k1时刻的预测值做预测起点——也就是“两步预测”。代码里改动很小% 第一步预测从k到k1假设当前用了上一个周期的开关状态 iap_1 c1 * ialpha c2 * (ealpha - ur_a_prev); ibp_1 c1 * ibeta c2 * (ebeta - ur_beta_prev); % 第二步预测从k1到k2枚举所有开关状态 for idx 0:7 ...计算ur_a、ur_beta... iap_2 c1 * iap_1 c2 * (ealpha - ur_a); ibp_2 c1 * ibp_1 c2 * (ebeta - ur_beta); ...计算代价函数... end这一步的差别在波形上非常明显不加延迟补偿电流在参考正弦波附近有明显的跟踪滞后波形看着“黏糊”加了补偿电流跟踪干净利落得多。建议你在仿真里同时保留两个版本论文对比图直接就能用上。5. 常见问题与排查技巧实录5.1 仿真报错和参数错误我踩过的最典型的坑仿真开始前最容易出的问题是模块连接不对。MATLAB Function的输入输出维度不匹配或者Powergui没放Simulink会直接报错。这些错误信息虽然烦但对排查很有帮助——字面意思读一遍基本就能定位。更容易忽略的是坐标变换的错误。仿真能跑但波形不对这种错误最头痛。我排查过一次特别典型的问题αβ坐标变换的输出看起来“似乎没问题”但电流波形明显扭曲。后来发现是Clark变换用了功率不变约束系数是(\sqrt{2/3})而整流器电压的合成用了幅度不变约束系数是(2/3)两者混用导致预测方程里的电压量级不对。这里要特别说明Simulink自带的坐标变换模块默认用的是功率不变约束但你手写的公式如果按常见教材用了幅度不变约束那就对不上。要么全部用功率不变要么全部用幅度不变千万别混。有个验证方法很实用αβ坐标系下的电网电压幅值应该等于相电压幅值幅度不变或者等于相电压幅值乘以(\sqrt{3/2})功率不变。跑一下坐标变换模块看输出幅值立刻知道是哪种方式。还有一个高频错误是MATLAB Function里用了中文注释或者分行问题导致编译失败这个纯粹是语法问题报错信息非常明确按提示改就行。5.2 波形畸变和失控状态这5个检查点对照排查有时候仿真能跑波形却惨不忍睹我整理了一个排查优先级按这个顺序查完基本能定位电流波形完全乱掉像是随机噪声先查采样周期T_s是否太大。T_s大于L/R的1/20左右离散化误差就会失控。把T_s从50μs改到20μs试试。电流波形有规律畸变过零点附近尤其明显查坐标变换系数是否统一再查电网电压采样是否经过滤波引入了相位延迟。如果用了滤波器滤波器的相位滞后再叠加给参考电流波形就会出现“过零畸变”。直流电压建立起来但稳不住、一直缓慢爬升或下降查电压外环PI的积分系数。积分太凶猛电压会过冲震荡积分太小电压升不到目标值。把参考电压分段给定看哪一段出了问题。负载突变后电流恢复极慢查电压外环的带宽是否太低。电压外环PI响应太慢负载突变后母线电压恢复时间就会拖得很长。提高(K_p)能明显加速。开关频率过高导致仿真极其缓慢查是否给代价函数加了开关惩罚项。如果没加MPC会启用一切可用的开关动作来追踪参考电流开关频率很高仿真步长被迫很小仿真自然慢。加一个(\lambda_{sw}0.01)左右的惩罚项开关频率会显著下降。5.3 实操心得MPC参数整定的优先级顺序我给MPC做参数整定时有一个固定的顺序这个顺序经过了多次验证合理高效顺序一先定采样周期(T_s)。这是其他一切的基础通常根据开关器件的允许频率、控制器的计算能力来定。仿真里一般选10μs到50μs器件是IGBT就取20到50μs如果模拟的是SiC MOSFET可以取10μs甚至更小。顺序二再定滤波器电感L。在T_s确定后L决定了电流纹波和预测模型的鲁棒性。先用经验公式粗算一个值然后在仿真里微调——看电流波形纹波大就加大L动态慢就减小L。仿真里改参数很方便但要注意每次改完都要重新验证稳定性和跟踪效果。顺序三最后调电压外环PI。电流内环搞定后电压环是最好调的。先只调比例系数让电压超调不过大再加积分消除静差。电压环PI对MPC的稳定性几乎没有影响因为电流内环的带宽远远高于电压外环。有些同学喜欢先调PI再调权重系数我觉得没必要。MPC最核心的是T_s和L这两个定好了控制效果已经八九不离十了。代价函数里的加权系数是锦上添花不是雪中送炭。5.4 验证模型正确性的一个偏方和传统PISVPWM对比最后一个建议也是我在实际项目里最常用来验证MPC模型正确性的方法搭一个传统的电压外环电流内环PI加上SVPWM调制的整流器模型使用同样的主电路参数对比两者在稳态电流THD、负载突变恢复时间上的差异。为什么说这是“偏方”因为MPC模型内部逻辑复杂出错了很难定位但对比结果几乎能立刻暴露问题——如果你的MPC效果比传统PI差得离谱那不是MPC不行而是你的MPC模型哪里错了如果MPC动态响应比传统PI还慢那肯定是电流内环的延迟补偿没做或参数没调好。对比时看三个指标稳态THD、负载突变时直流电压跌落幅度、恢复时间。MPC的THD大概率略逊于优化好的SVPWM但动态恢复时间应该明显更短电压跌落幅度也应该更小。如果你的结果是另一个方向大概率是哪里出了问题。这两套模型在Simulink里可以放在同一个工程里共用主电路拓扑只切换控制算法。这个对比实验做出来论文里的亮点和说服力直接上一个台阶。根据我个人的经验做三相整流器MPC仿真最大的价值不是那个“MPC比PI强”的结论——而是在这个过程中你会被迫把整流器的数学模型、离散化方法、数字控制器的时序逻辑全部捋得清清楚楚。这些功夫不会白费等你回头再看传统的双闭环控制理解深度完全不一样。如果后续有余力还可以把单矢量MPC扩展成双矢量或者三矢量在一个周期内输出两个或三个矢量用占空比合成那将把稳态波形质量和开关频率的平衡推进到另一个高度这也正好是当前研究的前沿方向。