六种DPWM策略Simulink仿真:从零序注入到钳位实现
做三相逆变器的朋友应该都有这种感觉SPWM、SVPWM听着简单但真要把系统效率做上去把器件温降压下来工程上绕不开DPWM。我这次把三相两电平逆变器底下的六种DPWM策略——DPWM00、DPWM01、DPWM02、DPWM03、DPWMMIN、DPWMMAX——全部搭成了Simulink仿真模型逐一跑波形、对比开关动作、估算损耗影响。这篇文章就来拆解这套模型的设计思路、核心公式和实现细节顺便把调试中踩过的坑一并交代清楚。1. 项目概述六种DPWM到底在调什么1.1 从SVPWM到DPWM把“一直开关”变成“轮流休息”做三相两电平电压源逆变器的人基本都从SPWM起步再进阶到SVPWM。SVPWM的优势是直流电压利用率高、电流谐波小但有个容易被忽略的特点三相桥臂的六个开关管在每个开关周期内都在动作一个基波周期里每相开关管要开关上百次甚至上千次。开关管每动作一次就有一次开关损耗频率越高损耗越可观。大功率IGBT模块的开关损耗占总损耗比重很大散热器体积、系统效率都受它制约。DPWM的核心思想很简单既然某一段时间里某相电流的瞬时值不大让这一相停下来不开关岂不是省钱于是就有了“不连续调制”的思路——在每个基波周期的某个区间内让某一相桥臂钳位到直流母线正端或负端该相开关管保持常通或常断开关动作完全消失。从SVPWM角度看DPWM就是改变了零矢量的分配方式。SVPWM通常用两个零矢量V0和V7各占一半时间得到七段式开关序列三相都在动作。如果把某个零矢量的作用时间压到零开关序列就变成五段式甚至三段式有一相在一个开关周期内完全不切换。这一压开关次数少了损耗自然降下来。1.2 六种命名的背后钳位位置是关键变量说起DPWM文献里常见的是DPWM1、DPWM2、DPWM3有人也写成DPWM0、DPWM1、DPWM2、DPWM3。标题里的DPWM00到DPWM03加上DPWMMIN和DPWMMAX其实是把DPWM族按钳位窗口的位置做了编号DPWM00连续调制本质等同传统SVPWM作为对比基准。DPWM01钳位窗口中心落在扇区边界也就是经典DPWM1工程上最常用。DPWM02钳位窗口相对DPWM01整体平移30度相当于经典DPWM2的位置。DPWM03钳位窗口再平移30度对应经典DPWM3的位置。DPWMMIN全周期钳位到负母线。DPWMMAX全周期钳位到正母线。理解这套命名不需要死记编号核心只有一件事钳位窗口放在哪个角度区间。选的位置不同开关动作和负载电流重叠的程度就不同损耗下降效果、谐波性能也跟着变。2. 核心原理零序电压注入是DPWM的统一数学框架2.1 一个公式解释所有DPWM先给一个基本结论无论哪种PWM策略最终作用到桥臂上的调制波都可以写成“三相参考电压加同一个零序电压”的形式。三相三线制系统里相电压中叠加一个相同的分量不会改变线电压和负载电流却能重新分配开关状态。设三相参考电压标幺化后为ua m*cos(theta) ub m*cos(theta - 2*pi/3) uc m*cos(theta 2*pi/3)m是调制比线性区范围0到1.15。传统SVPWM的零序电压取三相参考电压最大值和最小值的中间点u0_svpwm -0.5 * (max(ua,ub,uc) min(ua,ub,uc))这样三相调制波关于零轴对称幅度刚好控制在[-1,1]内这就是连续调制。DPWM的思路完全不同。如果想让某一相钳位到正母线直接选择零序电压u0 1 - max(ua, ub, uc)电压最大那一相加完u0后恰好等于1也就是桥臂上管常通这一相在接下来一段区间内不再开关。同理想钳位到负母线则取u0 -1 - min(ua, ub, uc)电压最小那一相被压到-1下管常通。所以DPWM的本质不是复杂的空间矢量切换而是“盯住极值、推向母线”。SVPWM是把调制波限制在中心对称区间DPWM则让调制波直接顶到边界。DPWMMIN就是全周期取负母线钳位公式DPWMMAX就是全周期取正母线钳位公式。2.2 为什么不同DPWM要选不同钳位位置开关损耗和电流瞬时值密切相关。IGBT关断瞬间流过它的电流越大损耗越大。所以理论上应该让开关管在电流小的时候开关在电流大的时候休息。DPWM01把钳位区间放在扇区边界这时某相参考电压刚好过峰值或谷值附近和阻感负载电流峰值比较接近对大多数电机负载来说省损耗效果最好。DPWM02、DPWM03则针对不同功率因数角做了偏移相当于把钳位窗口在时间轴上滑动让休息时间和电流峰尽量重合。DPWMMIN和DPWMMAX则是两个极端始终钳在负母线或正母线开关动作最少但会导致某一相长期只有上管或下管工作。这两者的谐波和共模特性非常差实用价值有限不过作为理论边界很适合放进仿真里对比观察。3. Simulink模型整体设计与实现步骤3.1 顶层电路拓扑仿真模型采用经典的三相两电平电压源型逆变器结构直流电源600V三相全桥用Simulink的Universal Bridge模块IGBT/Diode类型三相对称阻感负载R10Ω、L10mHPWM调制器自己搭建用MATLAB Function生成调制波外加三角载波比较测量相电压、线电压、三相电流、开关管门极信号基波频率50Hz开关频率10kHz调制比m取0.8。这个组合既能看清PWM脉冲细节又不会让仿真慢到无法忍受。需要强调的是调制器不要用Simulink自带的PWM Generator来生成DPWM那个模块只支持SPWM/SVPWM的常规连续调制没法实现钳位逻辑。正确的做法是手写调制波生成模块再把调制波和三角载波做比较输出六路门极信号。3.2 用MATLAB Function实现六种模式统一调制器六种DPWM可以写在一个MATLAB Function里通过mode参数切换。函数输入三相参考电压瞬时值和角度输出三路调制波。这样一次建模就能对比所有策略改一个常数就换一种模式。核心代码框架如下function [uma, umb, umc] dpwm_modulator(ua, ub, uc, mode) % 输入三相参考电压标幺值模式选择 % 输出三相调制波 u [ua ub uc]; umax max(u); umin min(u); % 估算参考电压空间角度用于扇区判断 theta atan2(sqrt(3)*(ub - uc), 2*ua - ub - uc); theta mod(theta, 2*pi); localTheta mod(theta, pi/3); % 扇区内角度 0~60度 switch mode case 0 % DPWM00传统SVPWM连续调制 u0 -0.5*(umax umin); case 1 % DPWM01钳位窗口中心在扇区边界 % 扇区内前半段30度钳正后半段30度钳负 if localTheta pi/6 u0 1 - umax; % 电压最大相钳位到正母线 else u0 -1 - umin; % 电压最小相钳位到负母线 end case 2 % DPWM02钳位窗口相对DPWM01整体平移30度 localShift mod(localTheta pi/6, pi/3); if localShift pi/6 u0 1 - umax; else u0 -1 - umin; end case 3 % DPWM03钳位窗口再平移30度 localShift mod(localTheta pi/3, pi/3); if localShift pi/6 u0 1 - umax; else u0 -1 - umin; end case 4 % DPWMMIN全周期钳位到负母线 u0 -1 - umin; case 5 % DPWMMAX全周期钳位到正母线 u0 1 - umax; otherwise u0 -0.5*(umax umin); end % 生成三相调制波 uma ua u0; umb ub u0; umc uc u0; end这套代码里最有用的地方在于DPWM01到DPWM03之间只差一个localShift的偏移量。改动一个相位参数就能观察钳位窗口位置的连续变化对理解DPWM机理特别直观。3.3 三角载波与PWM脉冲生成三路调制波生成后需要和三角载波比较。三角载波频率10kHz范围[-1,1]。Simulink里可以用Repeating Sequence