4、SVPWM调制技术:空间矢量原理、扇区判断、作用时间计算、七段式与五段式SVPWM
说到FOC,SVPWM是绕不开的核心环节。说白了,它就是告诉逆变器该怎么开关,才能让电机转得又稳又顺。我刚开始接触FOC时,觉得SVPWM就是一堆公式和扇区判断,后来在项目里调了无数次波形,才真正理解它的精妙之处。
4.1 空间矢量原理——从三相到旋转
先问个问题:三相电压怎么合成一个旋转的矢量?
你想想看,电机三相绕组在空间上相差120度。如果我们把每一相的电压看作一个空间矢量,那合成矢量就是三个矢量的和。这个合成矢量以角速度ω旋转,幅值就是相电压幅值的1.5倍。
嗯,这里要注意:我们说的“空间矢量”不是物理空间里的向量,而是电压在复平面上的表示。我习惯用α-β坐标系来理解,把三相电压投影到两相静止坐标系上,就得到了Uα和Uβ。
核心公式:
Uref = Uα + jUβ = 2/3 * (Ua + Ub * e^(j2π/3) + Uc * e^(j4π/3))
这个Uref就是我们要合成的目标电压矢量。
逆变器有6个开关管,能产生8种开关状态。其中6个是非零矢量(V1~V6),2个是零矢量(V0和V7)。这6个非零矢量在复平面上正好把360度分成6个扇区,每个扇区60度。
我在项目中遇到过一个问题:一开始以为只要把Uref转到哪个扇区就用哪个矢量,结果转矩脉动特别大。后来才明白,必须用相邻的两个非零矢量来合成Uref,再加上零矢量调节时间,才能实现连续旋转。
4.2 扇区判断——别搞错方向
扇区判断其实很简单。根据Uα和Uβ的符号和比例关系,就能确定Uref落在哪个扇区。
我常用的方法是计算三个参考量:
// 扇区判断的参考量计算
B1 = Uβ
B2 = sqrt(3)/2 * Uα - 0.5 * Uβ
B3 = -sqrt(3)/2 * Uα - 0.5 * Uβ
// 然后根据B1、B2、B3的符号确定扇区
if (B1 > 0) N += 1
if (B2 > 0) N += 2
if (B3 > 0) N += 4
// N值对应扇区:1->扇区II, 2->扇区VI, 3->扇区I, 4->扇区IV, 5->扇区III, 6->扇区V
我的小技巧:实际代码里别用浮点数算sqrt(3)/2,直接预计算成0.8660254。我在一个项目里因为浮点运算太慢,导致PWM频率上不去,后来改成定点数才解决。
扇区判断的边界情况要注意。当Uref正好落在扇区边界上时,理论上两个扇区都可以。我建议统一处理:比如Uβ=0且Uα>0时归为扇区I,这样代码逻辑更清晰。
4.3 作用时间计算——T1和T2的由来
确定了扇区,接下来就是算两个相邻矢量的作用时间T1和T2。这个计算基于“伏秒平衡”原理:用两个相邻矢量在时间上的加权平均,等效出目标矢量Uref。
公式其实不复杂,但不同扇区有不同表达式。我习惯先算出三个通用变量X、Y、Z:
X = sqrt(3) * Uβ * Ts / Udc
Y = (sqrt(3)/2 * Uβ + 3/2 * Uα) * Ts / Udc
Z = (sqrt(3)/2 * Uβ - 3/2 * Uα) * Ts / Udc
然后根据扇区查表:
| 扇区 | T1 | T2 |
|---|---|---|
| I | Z | Y |
| II | Y | -X |
| III | -Z | X |
| IV | -X | Z |
| V | X | -Y |
| VI | -Y | -Z |
注意:当T1 + T2 > Ts时,说明Uref已经超出了逆变器能输出的最大电压,需要进行过调制处理。我一般直接等比例缩小:T1' = T1 * Ts / (T1+T2),T2' = T2 * Ts / (T1+T2)。
4.4 七段式SVPWM——最经典的实现
七段式SVPWM,说白了就是在一个PWM周期里,把两个非零矢量和零矢量按对称方式排列。为什么要对称?为了减少谐波,降低开关损耗。
七段式的开关序列是这样的:
以扇区I为例(V1和V2合成):
0 -> V1 -> V2 -> V7 -> V2 -> V1 -> 0
时间分配:T0/4 -> T1/2 -> T2/2 -> T0/4 -> T2/2 -> T1/2 -> T0/4
这样每个周期开关管只动作一次,而且波形对称,谐波含量低。我在一个伺服驱动器项目里用的就是七段式,电流波形很干净,几乎没有毛刺。
计算三相占空比时,我习惯用这样的方法:
// 先计算三个比较值
Ta = (Ts - T1 - T2) / 4
Tb = Ta + T1 / 2
Tc = Tb + T2 / 2
// 然后根据扇区分配给三相
switch(sector) {
case 1:
CMP1 = Tb; CMP2 = Ta; CMP3 = Tc; break;
case 2:
CMP1 = Ta; CMP2 = Tc; CMP3 = Tb; break;
// ... 其他扇区类似
}
经验之谈:实际代码里要加死区补偿。我曾经因为没加死区,电机在低速时抖动得厉害,查了两天才发现是上下管直通导致的。
4.5 五段式SVPWM——效率优先的选择
五段式SVPWM和七段式的区别在于:它只用一个零矢量,而且放在周期的开始或结束。这样每个周期只有五段开关序列,开关次数减少了1/3。
五段式的开关序列:
以扇区I为例:
V1 -> V2 -> V7 -> V2 -> V1
时间分配:T1/2 -> T2/2 -> T0 -> T2/2 -> T1/2
五段式的优点是开关损耗小,适合对效率要求高的场合。但缺点是谐波含量比七段式高,电流纹波大一些。
我在一个电池供电的便携设备里用过五段式,续航提升了约8%。不过代价是电机噪音稍微大了一点,后来在软件里加了随机PWM才压下去。
| 对比项 | 七段式SVPWM | 五段式SVPWM |
|---|---|---|
| 开关次数 | 每个周期6次 | 每个周期4次 |
| 谐波含量 | 低 | 较高 |
| 开关损耗 | 高 | 低 |
| 适用场景 | 高性能伺服 | 低功耗/低成本 |
避坑指南:我曾经在五段式里忘了处理零矢量的分配,导致电机在过零点附近出现电流畸变。后来加了一个判断:当T0小于某个阈值时,强制切换到七段式,问题就解决了。
4.6 实际调试中的注意事项
最后分享几个我在项目里踩过的坑:
- PWM频率选择:别一味追求高频。我试过20kHz的PWM,开关损耗太大,散热扛不住。后来降到10kHz,配合死区优化,效果反而更好。
- 死区时间:死区太小会直通,太大又影响波形。我一般取0.5~2μs,具体看IGBT或MOS管的关断时间。
- 过调制处理:当T1+T2 > Ts时,别直接截断,否则电流会突变。用等比例缩放或者加一个低通滤波器,过渡会更平滑。
- 扇区切换:扇区边界处容易产生毛刺。我习惯在扇区切换时做一下插值,让占空比平滑过渡。
嗯,SVPWM这部分内容就这些。说白了,它就是FOC的“执行层”,把算法算出来的电压指令变成实实在在的PWM波形。理解了空间矢量的旋转本质,扇区判断和时间计算就水到渠成了。下一章我们聊聊电流环的PI参数整定,那又是一个需要反复调试的环节。