4. SVPWM原理:空间电压矢量合成、扇区判断、作用时间计算、七段式与五段式SVPWM

SVPWM,全称是空间矢量脉宽调制。说白了,它跟传统的SPWM不一样。SPWM是让三相正弦波去跟三角波比,生成PWM波。而SVPWM的思路更直接——它把电机定子看成一个整体,直接去控制那个旋转的磁链矢量。

我刚开始接触这个的时候,也觉得公式挺多。但后来在项目里调了几次电机,发现SVPWM其实就四个步骤:扇区判断 → 时间计算 → 矢量合成 → 发波。今天咱们就把这四步拆开,一个一个讲透。

核心思想:用8个基本电压矢量(6个非零矢量 + 2个零矢量),在时间上平均合成任意方向、任意大小的目标电压矢量。这就是“伏秒平衡”原则。

4.1 空间电压矢量与基本矢量

三相逆变器有6个开关管,上下桥臂互补。一共就8种开关状态。我们把每种状态对应的电压矢量画在复平面上,就得到了6个相隔60°的基本矢量和2个零矢量。

这6个非零矢量把平面分成了6个扇区。每个扇区60°。目标矢量落在哪个扇区,就用这个扇区边上的两个基本矢量去合成它。

我的习惯:在代码里,我一般把扇区编号为1~6,从0°开始逆时针编号。这样后面查表方便。有些资料从0开始编号,也行,但你自己心里要清楚。

空间电压矢量与扇区划分 α β V1(100) V2(110) V3(010) V4(011) V5(001) V6(101) V0(000)/V7(111) 扇区Ⅰ 扇区Ⅱ 扇区Ⅲ 扇区Ⅳ 扇区Ⅴ 扇区Ⅵ Vref

4.2 扇区判断

拿到目标电压矢量Vref(α, β)之后,第一件事就是判断它在哪个扇区。怎么判断?看它的角度。

实际工程里,我们不用去算atan2这种费时间的函数。我一般用三个中间变量来判断:

// 扇区判断 —— 我常用的方法
B1 = Ubeta;                     // β轴分量
B2 = 0.866 * Ualpha - 0.5 * Ubeta;  // 旋转120°后的分量
B3 = -0.866 * Ualpha - 0.5 * Ubeta; // 旋转240°后的分量

// 根据三个值的符号,组合出扇区号
N = 0;
if (B1 > 0) N += 1;
if (B2 > 0) N += 2;
if (B3 > 0) N += 4;

// 查表得到扇区
sector = lookup_table[N];

我曾经踩过的坑:一开始我用atan2算角度,再除以60°取整。结果在扇区边界上,因为浮点精度问题,角度来回跳变,导致扇区误判,电机电流出现毛刺。后来换成这种查表法,稳得很。记住,嵌入式里能查表就别算。

4.3 作用时间计算

确定了扇区之后,就要算两个基本矢量和零矢量的作用时间。这里用的是“伏秒平衡”原理——目标矢量乘以周期T,等于两个基本矢量分别乘以各自作用时间的矢量和。

公式推导我就不展开了,直接给结论。假设目标矢量在扇区Ⅰ,由V1和V2合成:

// 扇区Ⅰ的时间计算
T1 = sqrt(3) * T * (Ualpha * sin(60° - θ) + Ubeta * cos(60° - θ)) / Udc;
T2 = sqrt(3) * T * (-Ualpha * sin(θ) + Ubeta * cos(θ)) / Udc;
T0 = T - T1 - T2;

实际代码里,我会先算三个通用变量X、Y、Z,然后根据扇区查表得到T1和T2。这样代码更紧凑,也更快。

扇区 T1 T2
Ⅰ Z Y
Ⅱ Y -X
Ⅲ -Z X
Ⅳ -X Z
Ⅴ X -Y
Ⅵ -Y -Z

注意:如果T1 + T2 > T,说明目标矢量超出了六边形的内切圆,进入了过调制区。这时候需要做等比例缩小处理:T1 = T1 * T / (T1 + T2),T2 = T2 * T / (T1 + T2),T0 = 0。我在做伺服驱动器时,过调制区处理不好,母线电压利用率就上不去。

4.4 七段式SVPWM

时间算完了,怎么发波?七段式是最常用的方式。它的原则是:每次只切换一个桥臂的开关状态,这样开关损耗最小,谐波也小。

以扇区Ⅰ为例,矢量顺序是:V0(000) → V1(100) → V2(110) → V7(111) → V2(110) → V1(100) → V0(000)。

你看,从V0到V1,只切换了A相;从V1到V2,只切换了B相。每次只动一个开关管。这就是七段式的精髓。

// 七段式 —— 比较值计算(扇区Ⅰ为例)
Ta = (T - T1 - T2) / 4;   // 零矢量V0的1/4时间
Tb = Ta + T1 / 2;          // 加上V1的一半时间
Tc = Tb + T2 / 2;          // 再加上V2的一半时间

// 三相比较值
CMPA = Ta;  // A相
CMPB = Tb;  // B相
CMPC = Tc;  // C相

把这三个比较值喂给定时器的三个通道,跟三角载波比较,就能生成对称的PWM波。波形中心对称,谐波特性好。

4.5 五段式SVPWM

七段式虽然好,但开关次数多。每个周期开关管要动作6次。如果开关频率高,开关损耗就大。

五段式就是来省开关次数的。它只插入一个零矢量(要么V0,要么V7),而不是两个都用。这样每个周期开关次数从6次降到4次,能省约1/3的开关损耗。

代价是什么?谐波会大一些,电流纹波也大。所以五段式一般用在大功率、低开关频率的场合,比如变频空调、大功率电机驱动。

对比项 七段式SVPWM 五段式SVPWM
开关次数/周期 6次 4次
开关损耗 高 低(约降1/3)
谐波特性 好 较差
电流纹波 小 大
适用场景 通用伺服、中小功率 大功率、低开关频率

我的建议:刚开始做电机控制,先用七段式。等系统跑稳了,再去尝试五段式。我在一个风机项目里用过五段式,开关频率降到2kHz,效率提升了3%左右,但电流谐波确实大了,需要加额外的滤波。

4.6 七段式与五段式的矢量顺序对比

为了让你看得更清楚,我把两种方式的矢量顺序列出来。以扇区Ⅰ为例:

  • 七段式:V0 → V1 → V2 → V7 → V2 → V1 → V0
  • 五段式(只插V0):V0 → V1 → V2 → V1 → V0
  • 五段式(只插V7):V1 → V2 → V7 → V2 → V1

五段式有两种变体,取决于你插哪个零矢量。实际使用中,可以交替使用V0和V7,来平衡上下桥臂的发热。嗯,这个细节很多资料不会讲,但我在做热设计时发现,如果一直用V0,下桥臂的开关次数多,温度会比上桥臂高好几度。

注意:五段式的比较值计算跟七段式不一样。因为少了一段零矢量,时间分配要重新算。别直接把七段式的代码改成五段式,那样波形会不对称,电流会畸变。