3、SVPWM原理(下):七段式与五段式SVPWM实现、死区时间插入、SVPWM的Simulink仿真
好,咱们接着上回聊。上节课我们把SVPWM的基本扇区判断和作用时间算清楚了,那都是数学推导。今天这节,咱们来点实在的——怎么把这些理论变成真正的PWM波形,送到逆变器里去。
说白了,SVPWM的最终目的,就是让六个功率管按照特定规律导通,产生我们想要的电压矢量。但这里有个坑:你算出来的时间,不能直接往寄存器里一丢就完事。你得考虑怎么安排开关顺序,怎么避免上下管直通,怎么在仿真里验证。这些,就是今天要聊的内容。
一、七段式SVPWM:最经典的实现方式
七段式,顾名思义,一个PWM周期被分成了七段。我刚开始学的时候也觉得这名字挺唬人,其实拆开看就明白了。
它的核心思想是:每次只切换一个桥臂的开关状态。这样做的好处是开关损耗小,谐波也少。
咱们拿第一扇区举个例子。假设你算出来的两个非零矢量作用时间是T1和T2,零矢量时间是T0。七段式的安排是这样的:
- 第一段:零矢量(000),时间T0/4
- 第二段:第一个非零矢量(100),时间T1/2
- 第三段:第二个非零矢量(110),时间T2/2
- 第四段:零矢量(111),时间T0/2
- 第五段:第二个非零矢量(110),时间T2/2
- 第六段:第一个非零矢量(100),时间T1/2
- 第七段:零矢量(000),时间T0/4
你看,这七段是对称的。中间是(111),两边是(000)。每次切换只改变一个开关,这就是所谓的「中心对称」模式。
关键点:七段式产生的PWM波形是对称的,谐波主要集中在开关频率的整数倍附近,便于滤波。我做过一个项目,用七段式跑高速电机,电流波形非常干净。
二、五段式SVPWM:效率优先的选择
五段式,也叫不连续调制。它跟七段式最大的区别是:每个扇区只插入一种零矢量。
比如第一扇区,它可能只用(000)作为零矢量,或者只用(111)。这样每个周期就只有五段了。
五段式的优点很明显:开关次数减少了三分之一。你想想看,开关次数少了,开关损耗自然就降下来了。我有个做伺服驱动的朋友,他们产品对散热要求特别高,最后就选了五段式。
但代价是什么?谐波会大一些。因为波形不对称了,低次谐波会增多。所以五段式一般用在那些对效率要求高、对谐波不太敏感的场合,比如大功率风机、水泵。
| 对比项 | 七段式 | 五段式 |
|---|---|---|
| 开关次数 | 每个周期6次 | 每个周期4次 |
| 开关损耗 | 较高 | 较低(降低约33%) |
| 谐波特性 | 好,谐波集中在高频 | 较差,存在低次谐波 |
| 适用场景 | 通用伺服、对电流质量要求高的场合 | 大功率、对效率敏感的场合 |
我的建议:刚开始做FOC,先用七段式。等把整个系统调通了,再考虑换成五段式去优化效率。别一上来就搞五段式,万一波形不好,你都不知道是算法问题还是调制问题。
三、死区时间插入:一个不得不聊的话题
嗯,这里要注意。死区时间,是每个做电机驱动的人都会遇到的坑。
为什么要有死区?因为功率管不是理想开关。IGBT或者MOSFET从导通到关断需要时间。如果你让上管关断的同时立刻让下管导通,那上下管会瞬间同时导通——这就是直通,轻则炸管子,重则烧板子。
我曾经在一个项目中就吃过这个亏。当时调试一个2kW的伺服驱动器,觉得死区设个1us就够了。结果一上电,电流波形毛刺特别多,电机还嗡嗡响。后来用示波器一看,上下管的驱动信号有重叠,差点把IGBT给烧了。从那以后,我每次都会用示波器仔细检查死区时间。
死区时间的插入方法很简单:在PWM信号中加入一段延时。比如上管关断后,等一段时间,再让下管导通。这段时间就是死区。
但死区会带来一个问题:电压误差。因为死区时间内,电流会通过续流二极管续流,导致实际输出电压跟理想值有偏差。这个偏差在低速时特别明显,会让电流波形出现「平顶」现象。
避坑指南:我曾经在低速运行时发现电流波形有畸变,查了半天才发现是死区补偿没做好。后来加了死区补偿算法,问题才解决。死区时间一般设为1-3us,具体看功率管的datasheet。别为了省那点时间把管子烧了。
四、SVPWM的Simulink仿真:从理论到实践
理论说完了,咱们来点实际的。怎么在Simulink里搭一个SVPWM模块?
我一般这么搭:
- 输入部分:Uα和Uβ,也就是你从Park逆变换出来的电压。
- 扇区判断:用Uα和Uβ算扇区号。这个上节课讲过,用三个参考电压的正负就能判断。
- 时间计算:根据扇区号,算T1、T2和T0。
- 比较值生成:把T1、T2、T0转换成三个比较值Ta、Tb、Tc。
- PWM生成:用三角波跟比较值比较,输出六路PWM信号。
这里有个小技巧:在Simulink里,你可以直接用「Repeating Sequence」模块生成三角波,然后用「Compare To Constant」模块做比较。最后用「Logical Operator」模块做死区插入。
% 伪代码示例:七段式比较值计算
% 输入:T1, T2, T0(非零矢量和零矢量作用时间)
% 输出:Ta, Tb, Tc(三相比较值)
% 先算占空比
Ta = T0 / 4;
Tb = Ta + T1 / 2;
Tc = Tb + T2 / 2;
% 根据扇区号分配
switch sector
case 1
cmp1 = Tb; cmp2 = Ta; cmp3 = Tc;
case 2
cmp1 = Ta; cmp2 = Tc; cmp3 = Tb;
case 3
cmp1 = Ta; cmp2 = Tb; cmp3 = Tc;
% ... 其他扇区类似
end
仿真小技巧:刚开始仿真时,把开关频率设低一点,比如5kHz。这样仿真跑得快,波形也看得清楚。等算法调通了,再改成实际的10kHz或20kHz。我习惯先用开环跑一下SVPWM模块,确认波形对了,再接入FOC闭环。
仿真跑起来后,你会看到三相PWM波形是马鞍形的。别慌,这是正常的。马鞍形波是SVPWM的特征,它比正弦波多了三次谐波分量,但线电压是正弦的。
好了,今天的内容就到这。七段式和五段式的选择、死区时间的处理、Simulink的搭建方法,这些都是实际项目中绕不开的。下一节,咱们开始聊FOC的核心——电流环和速度环的PI参数整定。那个才是真正考验功力的地方。