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参数整定,那又是一个需要反复调试的环节。