4、基本电压矢量:六个非零矢量与两个零矢量、矢量幅值与相位

好,咱们进入正题。上一章聊了三相坐标系和 Clarke 变换,把静止的 ABC 轴系变成了 αβ 轴系。今天要讲的,是 SVPWM 真正的核心——基本电压矢量。

说白了,SVPWM 就是靠这 8 个矢量去拼出任意想要的电压。你想想看,逆变器只有 6 个开关管,能组合出的状态其实很有限。但就是这有限的几个状态,配合上时间分配,就能合成出连续旋转的电压矢量。这就是 SVPWM 的精妙之处。

4.1 八个开关状态与八个基本矢量

先看逆变器的拓扑。一个典型的两电平三相逆变器,每相桥臂有两个开关管。同一相的上下管不能同时导通,否则就是直通短路——嗯,这个我在调试时亲眼见过冒烟,所以后来写代码都会加死区时间和硬件互锁。

每相桥臂的输出状态只有两种:上管导通、下管关断,我记为 1;或者上管关断、下管导通,记为 0。三相合起来,一共 2³ = 8 种组合。

状态编号 Sa Sb Sc 矢量名称 类型
0 000 V₀ 零矢量
1 100 V₁ 非零矢量
2 110 V₂ 非零矢量
3 010 V₃ 非零矢量
4 011 V₄ 非零矢量
5 001 V₅ 非零矢量
6 101 V₆ 非零矢量
7 111 V₇ 零矢量

这 8 个状态,对应 8 个基本电压矢量。其中 6 个是非零矢量(V₁~V₆),2 个是零矢量(V₀ 和 V₇)。

关键点:非零矢量在 αβ 平面上幅值相等、相位相差 60°;零矢量幅值为零,不产生旋转磁场。

4.2 矢量幅值与相位计算

咱们来算一下。以 V₁(100)为例,A 相上管导通,B、C 相下管导通。此时 A 相输出端电压为 Vdc/2,B、C 相为 -Vdc/2(以直流母线中点为参考)。

经过 Clarke 变换,得到 αβ 轴系下的分量:

Vα = Vdc/2
Vβ = 0

所以 V₁ 的幅值就是 Vdc/2,相位 0°。

同理,V₂(110)的 αβ 分量为:

Vα = Vdc/4
Vβ = √3·Vdc/4

幅值同样是 Vdc/2,相位 60°。

你发现规律了吗?6 个非零矢量的幅值全部相等,都是 Vdc/2。相位依次相差 60°,正好把 360° 平面分成 6 个扇区。

矢量 α 轴分量 β 轴分量 幅值 相位
V₁ (100) Vdc/2 0 Vdc/2 0°
V₂ (110) Vdc/4 √3·Vdc/4 Vdc/2 60°
V₃ (010) -Vdc/4 √3·Vdc/4 Vdc/2 120°
V₄ (011) -Vdc/2 0 Vdc/2 180°
V₅ (001) -Vdc/4 -√3·Vdc/4 Vdc/2 240°
V₆ (101) Vdc/4 -√3·Vdc/4 Vdc/2 300°

我的经验:实际项目中,Vdc 是直流母线电压,会随负载波动。我习惯在代码里实时采样 Vdc,然后动态更新矢量幅值。否则母线电压掉下来,你算出来的占空比就不准了。

4.3 零矢量的作用

零矢量 V₀(000)和 V₇(111)的幅值都是 0。那它们有什么用?

我刚开始学 SVPWM 时也觉得零矢量是浪费时间的。后来才明白,零矢量是调节电压利用率的关键。你想,如果只用非零矢量,输出的电压幅值就固定了。但通过插入零矢量,我们可以调整等效输出电压的平均值。

说白了,零矢量就是「休息时间」。在一个 PWM 周期里,非零矢量负责产生电压,零矢量负责填充剩余时间。零矢量越长,等效输出电压就越低。

另外,零矢量还能减少开关损耗。V₀ 和 V₇ 的切换路径不同,合理选择可以让每次只切换一相开关管,降低开关次数。

避坑指南:我曾经在调试高速电机时,发现零矢量分配不合理导致电流谐波很大。后来改成七段式 SVPWM(零矢量对称分布),谐波明显下降。所以零矢量不是随便插的,要讲究对称性。

4.4 矢量空间分布图

下面这张 SVG 图展示了 6 个非零矢量在 αβ 平面上的分布。每个矢量幅值相等,相位间隔 60°,围成一个正六边形。

基本电压矢量空间分布 α β V₁(100) V₂(110) V₃(010) V₄(011) V₅(001) V₆(101) V₀/V₇ (零矢量) 扇区Ⅰ 扇区Ⅱ 扇区Ⅲ 扇区Ⅳ 扇区Ⅴ 扇区Ⅵ 说明: 6个非零矢量幅值均为 Vdc/2,相位间隔 60°。 零矢量 V₀(000) 和 V₇(111) 位于原点,幅值为 0。

从图上可以清楚看到,6 个非零矢量把平面分成 6 个扇区,每个扇区 60°。零矢量在原点,不产生任何电压。

4.5 矢量幅值的实际意义

你可能会问:为什么非零矢量的幅值是 Vdc/2,而不是 Vdc?

这跟逆变器的连接方式有关。我们用的是三相三线制,负载中性点不接地。每相输出端相对于直流母线中点的电压是 ±Vdc/2,所以合成矢量的最大幅值就是 Vdc/2。

但注意,SVPWM 的电压利用率比 SPWM 高。SPWM 的最大相电压幅值是 Vdc/2,而 SVPWM 可以达到 Vdc/√3。为什么?因为 SVPWM 利用了零矢量的调制,让合成矢量的轨迹从内切圆扩展到了六边形边界。

实用结论:SVPWM 的直流电压利用率比 SPWM 高约 15.47%。这意味着同样的母线电压下,电机可以跑得更快。我在做电动汽车电机控制器时,就靠这个多榨出了 5% 的转速。

4.6 代码实现:矢量查表

实际工程中,我们不会每次都去算 Clarke 变换。更常见的做法是建一个矢量表,直接查。

// 基本电压矢量表(αβ 分量,归一化到 Vdc/2)
typedef struct {
    float alpha;
    float beta;
} Vector_t;

const Vector_t sv_vectors[8] = {
    {0.0f, 0.0f},           // V0: 000
    {1.0f, 0.0f},           // V1: 100
    {0.5f, 0.866025f},      // V2: 110
    {-0.5f, 0.866025f},     // V3: 010
    {-1.0f, 0.0f},          // V4: 011
    {-0.5f, -0.866025f},    // V5: 001
    {0.5f, -0.866025f},     // V6: 101
    {0.0f, 0.0f}            // V7: 111
};

使用时,根据扇区号直接查表,省去三角函数计算。我在 DSP 上实测,查表比实时计算快了将近 10 倍。

小技巧:如果 MCU 资源紧张,可以把 0.866025 换成定点数。比如 Q15 格式下就是 28377(0.866025 × 32768)。这样查表、乘加全是整数运算,速度更快。

4.7 本章小结

好,咱们捋一下今天的内容:

  • 8 个开关状态对应 8 个基本电压矢量
  • 6 个非零矢量幅值相等(Vdc/2),相位间隔 60°
  • 2 个零矢量幅值为 0,用于调节电压利用率和降低开关损耗
  • 矢量空间被分成 6 个扇区,每个扇区 60°
  • SVPWM 的电压利用率比 SPWM 高 15.47%