FEATURED · 精选文章

六种DPWM不连续调制策略全解析:原理、Simulink建模与效率对比

发布时间 / 2026/9/15 8:13:44
来源 / 创域科博编辑部
栏目 / 资讯中心
六种DPWM不连续调制策略全解析:原理、Simulink建模与效率对比 三相两电平逆变器的PWM调制策略里DPWM不连续PWM是提升效率、降低开关损耗最实用的一类方案。同样一块IGBT模块、同一套散热器只把SVPWM换成DPWM温升可能差出十几度这不是玄学是开关次数实实在在地减少了三分之一。这篇文章把六种DPWM策略DPWM00、DPWM01、DPWM02、DPWM03、DPWMMIN、DPWMMAX的算法原理、钳位位置差异、Simulink建模过程和仿真对比方法完整拆开讲一遍。想做逆变器效率优化、电机控制或者并网变流器的同学可以直接照着搭模型不用再去翻一堆论文拼接实现思路。1. 为什么要把SVPWM换成DPWM开关损耗与温升的现实问题1.1 SVPWM的高频缺陷每一相都在白白发热SVPWM在电机控制和并网逆变器里占据绝对主流原因是直流电压利用率高、电流谐波表现好。但有个问题很多人做项目之前没意识到SVPWM在每个开关周期内三相桥臂的上下管都在高频动作。IGBT的开关损耗和开关频率成正比这部分损耗最终全部转化成热量堆在IGBT模块和散热器上。我做过一个72V/100A的永磁同步电机控制器项目原来用SVPWM开关频率12kHzIGBT温升稳定在85度左右散热器已经加到很大了再往上堆成本受不了。那时候开始认真研究降低开关损耗的方案DPWM就是从这个需求切入的。开关损耗的估算公式很简单P_sw f_sw × (E_on E_off) × (I_avg / I_rated)其中E_on和E_off是IGBT在额定电流下的开通和关断损耗数据手册里有I_avg是实际电流I_rated是测试参考电流。从这个公式可以直观看到频率越高、电流越大开关损耗越突出。而DPWM的思路就是直接减少开关动作的次数。1.2 DPWM的核心思想让某一相阶段性罢工DPWM的英文全称是Discontinuous PWM直译过来就是不连续PWM。不连续的是调制波——正常情况下三相调制波都是连续的正弦或马鞍形波形但DPWM通过注入特定的零序分量把某一相的调制波在某个区间内直接推到1或者-1让它和载波不再相交。调制波推到1意味着那一相的上管在整个区间内一直导通下管一直关断完全没有开关动作。推到-1则是反过来下管常通。这个区间就叫钳位区间。从整个基波周期来看每相有一部分时间不开关开关次数下降损耗自然降下来。代价是电流波形不再那么干净谐波会变差一些。这就是DPWM的本质用谐波指标去换开关损耗。1.3 到底能省多少开关次数与损耗的定量关系以载波频率10kHz、基波频率50Hz为例。一个基波周期20ms包含200个载波周期。每个载波周期内一相上下管各开关一次也就是这一相在一个基波周期内产生400次开关动作上升沿加下降沿。如果采用每相钳位120度的DPWM策略比如DPWM00这类一相在120度区间内不动作节省的开关次数就是400×120/360约133次总开关次数降到267次纯开关次数下降约33%。当然实际损耗降低并不严格等于33%因为开关损耗还和电流大小有关。IGBT在电流峰值附近开关时损耗最大在电流过零附近开关时损耗很小。所以DPWM的钳位区间放在哪里直接决定了损耗优化的效果。这也是下一章要展开的核心内容。2. 六种DPWM到底差在哪钳位位置、极性以及它们的真实代价2.1 钳位区间的本质每相停工多长时间、在哪里停工先说清楚钳位区间的基本概念。以三相正弦参考电压为例A相电压在90度时达到正峰值在270度时达到负峰值。DPWM策略就是在正峰值附近把A相调制波拉平到1让上管常通在负峰值附近把A相调制波拉平到-1让下管常通。经典的DPWM0-3策略每相在一个基波周期内钳位两次正半周一次、负半周一次每次60度合计120度。三相加起来任意时刻都保证有一相正处于钳位状态。DPWMMIN和DPWMMAX则是另一种思路只向一个方向钳位钳位总时长少一半。六种策略的区别可以浓缩成一句话钳位区间的中心位置相对相电压峰值点的偏移量和钳位极性不同。策略正向钳位区间示例A相电角度钳位极性钳位总时长/相DPWM0030° ~ 90°正负交替120°DPWM010° ~ 60° 或 60° ~ 120° 偏移正负交替120°DPWM02两种位置每隔扇区交替正负交替120°DPWM03更细粒度的交替偏移正负交替120°DPWMMIN仅在负峰值附近如240°±30°只向负母线60°DPWMMAX仅在正峰值附近如60°±30°只向正母线60°需要提醒一点不同文献和代码库中对DPWM0-3的编号定义并不完全统一有的地方DPWM1的钳位中心是正对峰值有的地方则是偏移30度。做仿真复现时一定要以自己代码里的钳位区间位置定义为准不要拿着Paper A的编号去套Paper B的波形。2.2 钳位位置和功率因数角选型的第一把尺子为什么要纠结钳位位置因为IGBT的开关损耗和电流大小直接相关。如果钳位区间正好落在电流峰值附近那么这个区间内的开关动作被消除了省下来的都是大电流高损耗的开关效果最好。反过来如果钳位区间落在电流过零附近省掉的都是本来损耗就小的开关效果大打折扣。电机或并网逆变器工作在单位功率因数附近时相电流和相电压基本同相位。电流峰值就在电压峰值附近所以把钳位中心对准电压峰值DPWM00的做法就能获得最大收益。但如果负载功率因数角是30度电流峰值比电压峰值滞后30度这时候应该把钳位中心也往后挪30度DPWM01就派上用场了。DPWM02和DPWM03本质上是在功率因数角动态变化场景下的折中。DPWM02在相邻扇区间交替使用两种钳位位置DPWM03的交替频率更高。它们的损耗优化效果不如针对性设计的DPWM00或DPWM01那么极端但也不会在某个功率因数角下表现特别差适合负载工况变化较大的场合。2.3 从零序分量的视角看DPWM一个统一的数学框架不管哪种DPWM实现手段都是相电压参考波加上一个零序分量v_mod v_ref v_zs零序分量不影响线电压因为三相都加同一个值线电压中自然抵消了。SVPWM的零序分量是v_zs_svpwm -0.5 × (v_max v_min)它把三相调制波变成马鞍形。DPWM则是让零序分量的取值更激进——在需要钳位的区间直接把零序取到让某一相饱和要钳A相到1取 v_zs 1 - v_a要钳A相到-1取 v_zs -1 - v_a从这个公式可以看出一个关键点钳位不会改变线电压的基波分量因为被钳位的那一相虽然波形被削平了但零序分量补偿了削掉的部分实际输出的线电压依然保持正弦。所以DPWM的直流电压利用率和SVPWM是相同的都能够达到1.1547的最大线性调制比。3. Simulink建模全流程主电路、调制波生成与六模式切换3.1 主电路搭建参数怎么定才符合实际打开Simulink新建一个模型主电路可以这样搭直流电压源DC 400V三相全桥用Simscape Electrical里的Universal Bridge选IGBT/Diode注意把反并联二极管带上负载星形接法的RL负载R10ΩL10mH模拟一台简化的电机绕组或者并网滤波电抗测量三相相电流、三相相电压、直流侧电流全部接上示波器载波频率设在10kHz基波频率50Hz这样FFT分析和实际工程场景比较贴近。调制比取0.8留一点线性调制余量避免进入过调制区域导致波形严重畸变。仿真时间建议设0.2s也就是10个基波周期。太少的话瞬态过程还没结束波形看不准太多的话仿真速度会被拖慢。变步长求解器用ode23tb最大步长限制在1e-6以内否则PWM边沿解析不精确。3.2 调制波生成核心逻辑用MATLAB Function实现六种策略切换调制波生成是整个仿真的灵魂。我在模型里放了一个MATLAB Function模块输入是三相参考电压峰值为调制比的正弦波和当前的DPWM模式编号输出是加完零序的三相机波信号。核心逻辑分两步先判断当前电角度落在哪个钳位区间再计算对应的零序分量。下面是我整理的一个可以直接参考的核心代码框架function [ma, mb, mc] dpwm_mod(theta_deg, va_in, vb_in, vc_in, mode) % mode: 0SVPWM, 1DPWM00, 2DPWM01, 3DPWM02, 4DPWM03, % 5DPWMMIN, 6DPWMMAX % theta_deg: A相参考电压的电角度0~360 v_ref [va_in, vb_in, vc_in]; v_max max(v_ref); v_min min(v_ref); if mode 0 % SVPWM基准马鞍形调制波 v_zs -0.5 * (v_max v_min); else % 先确定钳位相和钳位极性 [clamp_phase, clamp_level] clamp_selector(theta_deg, mode); if clamp_phase 0 % 没有进入钳位区间用SVPWM零序兜底 v_zs -0.5 * (v_max v_min); else % 计算零序把指定相拉到1或-1 v_zs clamp_level - v_ref(clamp_phase); end end ma va_in v_zs; mb vb_in v_zs; mc vc_in v_zs; end function [phase, level] clamp_selector(theta, mode) phase 0; level 0; % 三相正峰值/负峰值对应的电角度 pos_peak [90, 210, 330]; % A, B, C neg_peak [270, 30, 150]; if mode 1 % DPWM00钳位中心正对峰值/谷值区间宽度60度 for k 1:3 if abs(angle_diff(theta, pos_peak(k))) 30 phase k; level 1; elseif abs(angle_diff(theta, neg_peak(k))) 30 phase k; level -1; end end elseif mode 2 % DPWM01钳位中心偏移30度 for k 1:3 if abs(angle_diff(theta, pos_peak(k) 30)) 30 phase k; level 1; elseif abs(angle_diff(theta, neg_peak(k) - 30)) 30 phase k; level -1; end end elseif mode 5 % DPWMMIN只在负峰值附近向负母线钳位 for k 1:3 if abs(angle_diff(theta, neg_peak(k))) 30 phase k; level -1; end end elseif mode 6 % DPWMMAX只在正峰值附近向正母线钳位 for k 1:3 if abs(angle_diff(theta, pos_peak(k))) 30 phase k; level 1; end end elseif mode 3 || mode 4 % DPWM02/DPWM03按60度扇区交替选择两种钳位位置 sector floor(theta / 60) 1; if mod(sector, 2) 1 % 奇数扇区用位置A if mode 3 offset 0; else offset 15; end else % 偶数扇区用位置B if mode 3 offset 30; else offset 45; end end for k 1:3 if abs(angle_diff(theta, pos_peak(k) offset)) 30 phase k; level 1; elseif abs(angle_diff(theta, neg_peak(k) - offset)) 30 phase k; level -1; end end end end function d angle_diff(a, b) d mod(a - b, 360); if d 180 d d - 360; end end这里我用的是峰值点邻域判断的方式比查扇区表要直观也不容易在扇区边界出错。需要留意的是在边界点可能有两相同时满足钳位条件代码里后循环的相会覆盖前一个这在仿真里影响很小因为边界只是一个瞬时角度。3.3 载波比较与脉冲分配死区一定要加调制波生成之后送到三个比较器和三角载波比较。载波我用的是10kHz、幅值从-1到1的三角波。比较结果经过NOT得到互补的上下管信号然后加死区时间2μs。死区模块在Simulink里可以用Transport Delay加逻辑实现或者直接用Simscape里的Dead Zone模块。无论用哪种一定要加死区否则上下管直通炸模块——在仿真里虽然不会炸但直流侧电流会出现巨大的尖峰波形没法看。加完死区的信号连接到Universal Bridge的触发输入端。这里有三个容易踩的坑载波幅值必须和调制波幅值范围匹配。DPWM把调制波钳到±1如果载波幅值只有±0.9那钳位区间根本不会出现策略失效。基波频率和载波频率不要设成整数倍关系太明显的数值比如载波10kHz、基波50HzFFT分析时正好是200倍边带和谐波的区分度很好这个组合没问题。电流采样和PWM更新建议用离散控制来模拟真实DSP的行为但初学阶段直接用连续控制也能看到正确趋势。3.4 六种策略的测试用例设计模型搭好后不要只跑一种策略。我在模型外面套了一层循环脚本自动跑六种DPWM加一组SVPWM基准每种策略跑0.2s把相电流、调制波、IGBT开关脉冲等数据保存到MATLAB工作区方便后续批量分析。脚本的核心逻辑是用sim命令循环每次改模式参数把scope数据通过data logging导出。我习惯把调制波数据和开关脉冲数据全部按周期对齐这样对比时可以直接看差异。4. 仿真结果怎么看开关次数、FFT谐波和电流纹波的真实差异4.1 先看调制波形状策略区别一眼就能看出来仿真跑通后先别急着做FFT先把三种代表性策略的调制波调出来看。SVPWM的调制波是典型马鞍形DPWM00的调制波是削顶的马鞍形——顶部是平的宽度正好60度三个相轮流削顶。DPWMMAX则只有正半周削顶负半周还是正常形状。从调制波形状可以快速验证钳位逻辑是否正确。比如DPWM00的A相调制波在电角度30度到90度之间应该是一条1的直线在210度到270度之间是一条-1的直线。如果这个特征不对说明钳位区间判断有bug。4.2 开关次数统计最直观的损耗对比指标在模型里给每个IGBT的触发脉冲接一个上升沿计数器统计每个基波周期内每相的开关次数。仿真结果大致是策略每相每基波周期开关次数近似相对SVPWM开关次数降幅SVPWM4000%DPWM0026733%DPWM0126733%DPWM0226733%DPWM0326733%DPWMMIN33317%DPWMMAX33317%注意DPWM00-03的开关次数降幅和钳位位置无关因为它们的钳位总时长都是每相120度。DPWMMIN和DPWMMAX每相只钳位60度所以开关次数降幅减半。这也是为什么它们在效率优化场景下没有DPWM00-03用得多的原因。4.3 FFT频谱分析DPWM省了损耗但谐波变差在哪用Simulink的Powergui FFT工具分析相电流波形选择基波50Hz、显示到20次谐波可以看到几个典型规律SVPWM的谐波能量分布均匀THD最低通常在2%-3%左右RL负载下DPWM00的THD比SVPWM高0.5到1个百分点谐波能量集中在载波频率附近以及载波倍频的边带DPWMMIN和DPWMMAX的THD介于SVPWM和DPWM00之间但因为钳位不对称会产生偶次谐波分量这个在并网场景要特别注意调制度越低DPWM的THD劣势越明显。调制度0.4以下DPWM的电流畸变显著增大这时候除非散热实在撑不住否则不建议用DPWM有一个容易忽略的点DPWM的谐波并不均匀分布在整个频谱上而是集中在某些特定的边带频率。如果负载或者并网滤波器对那些频段有谐振点DPWM可能会触发额外的振动和噪声。4.4 电流纹波与瞬态响应损耗优化之外的另一笔账把示波器的时间轴拉到一个载波周期内对比SVPWM和DPWM的相电流纹波。DPWM的纹波峰值通常比SVPWM大30%-50%尤其在钳位区间切换的前后。原因是调制波在钳位边界的斜率发生突变电感电流的纹波幅度随之变化。瞬态响应方面DPWM的动态性能略差于SVPWM因为在钳位区间内那一相的桥臂状态被锁死PI调节器输出的电压指令无法通过那一相产生快速的占空比调节。实际做电机控制时如果启停频繁或者负载突变大DPWM的响应滞后感会比较明显。5. 这套仿真我踩过的坑钳位切换毛刺、FFT窗口、离散化误差5.1 钳位切换瞬间的电流尖刺不是仿真bug是策略本身的特性第一次跑DPWM00的仿真我看到相电流在每60度边界附近都有一个明显的尖刺第一反应是模型哪里接错了。后来仔细分析后发现这是DPWM策略本身的特性——钳位相切换时三相调制波会发生一次不连续的跳变这个跳变通过线电压作用到电感上产生电流扰动。这个尖刺的实际大小和控制带宽、电感量有关。电感越小尖刺越明显。如果仿真中尖刺大到波形严重畸变优先检查是不是载波幅值和调制波幅值不匹配其次检查死区设置是否合理。确认这两点都没问题后这个尖刺就是正常现象不用管它。5.2 FFT分析的频谱泄漏仿真时间没取整周期做FFT分析时如果你选的数据窗口不是基波周期的整数倍频谱上会出现严重的泄漏谐波分量一片模糊THD数值完全不可信。解决方法是把FFT的分析窗口设置成0.02s的整数倍。比如仿真0.2s取最后的0.1s做分析正好5个基波周期。Powergui里把Start Time设成0.1sNumber of Cycles设成5这样频谱是干净的。如果还是不够清晰用汉宁窗或者布莱克曼窗平滑一下。5.3 离散化步长与PWM分辨率步长太大会吃掉占空比精度PWM仿真的精度强烈依赖求解器步长。变步长求解器如果最大步长设得太大比如1e-4一个10kHz的载波周期内只有10个采样点占空比分辨率只有10%调制波的形状全被抹平了开关损耗对比也就没有意义。我踩过一次很深的坑为了跑得快把最大步长设成5e-5结果DPWM00和SVPWM的开关次数统计结果几乎一样钳位区间的平顶也看不出来。后来把最大步长改成1e-6波形才恢复正常。这个步长下仿真0.2s总共20万个步长Simulink跑起来稍微有点慢但完全能接受。5.4 死区对钳位区间的影响实际损耗节省要打个折扣理想的DPWM分析假设钳位区间内完全没有开关动作。但加上死区后某相处于钳位状态时对管确实一直关断但在电流换向瞬间钳位相的二极管和另外一个桥臂的管子之间还是会有一小段换流过程带来额外的损耗和电压误差。这个影响在电流过零附近尤其明显。如果死区时间设置过大超过载波周期的1%DPWM的损耗优势会被削弱5%-10%。做工程评估时不要按照理论上的33%损耗下降去设计散热器建议留15%-20%的余量。5.5 不同文献的DPWM编号差异复现时最容易踩的隐性坑我之前写DPWM01的代码时参考了一篇IEEE的论文里面把钳位中心正对峰值称为DPWM1而不是常见的DPWM0。结果仿真做到一半怎么调参数都和另一篇论文的波形对不上。最后仔细比对才发现是编号定义差异。所以你在网上找参考资料时先看它定义的钳位中心位置不要只记编号。用我现在这个模型的话DPWM00是钳位中心正对峰值DPWM01是偏移30度DPWM02是0度和30度交替DPWM03是15度和45度交替。这个定义和我上述代码一致你可以直接复现。6. 实际项目里怎么选型我的个人判断和扩展思路把这七组策略SVPWM加六种DPWM全部跑完一遍之后我来给一个比较务实的选型建议。如果你的项目散热压力不大电流谐波指标卡得严老老实实用SVPWM没必要为了省损耗去背谐波的包袱。如果开关频率在8kHz以上、散热器已经堆到头优先看看DPWM01或DPWM00具体选哪个取决于负载功率因数角。单位功率因数场景用DPWM00功率因数角30度左右用DPWM01动态范围大的用DPWM02或DPWM03。DPWMMIN和DPWMMAX因为钳位不对称谐波特性较差一般只在特定并网场景下有应用价值。最后分享一个这组仿真里意外发现的小技巧DPWM的钳位区间虽然对控制来说是死区但对ADC采样来说反而是黄金窗口。钳位相没有开关动作意味着那一相的共模干扰最小采样值最干净。实际做控制器时可以在钳位区间内安排ADC采样和过流保护的检测逻辑能显著提高采样信噪比。这个思路是从一次硬件调试事故中反向悟出来的当时SPWM下采样噪声大换到DPWM后钳位区间采样突然变得异常干净。有兴趣的话你可以在这个仿真模型上把示波器探头接到钳位相的驱动脉冲上看一看再对比一下采样时刻的电流毛刺会有一个很直观的体感。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻