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°,围成一个正六边形。
从图上可以清楚看到,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%