4. SVPWM 基本原理:电压空间矢量、扇区划分与伏秒平衡
好,咱们进入 SVPWM 的核心地带了。
说实话,我刚接触 SVPWM 那会儿,看了一堆公式推导,头都大了。后来我发现,只要抓住三个关键点,这东西其实没那么玄乎:电压空间矢量是什么、六个扇区怎么分、伏秒平衡怎么算。今天我就按这个思路,带你一步步捋清楚。
4.1 电压空间矢量——从三相到一“矢”
你想想看,电机里通的是三相正弦电流,它们在空间上相差 120°。这三相电流共同作用,会在电机内部产生一个旋转的磁场。这个磁场,就可以用一个旋转的矢量来表示——这就是电压空间矢量。
说白了,就是把三相电压(Ua、Ub、Uc)通过 Clarke 变换,投影到一个两相静止坐标系(α-β 坐标系)上。公式长这样:
Uα = Ua - Ub/2 - Uc/2
Uβ = (√3/2) * (Ub - Uc)
然后合成矢量 Us = Uα + jUβ。这个 Us 的幅值,就是合成电压矢量的大小;它的角度,就是当前时刻磁场的方向。
关键点:逆变器的六个开关管(上三下三),只能组合出 8 种开关状态。其中 6 种是有效矢量(非零矢量),2 种是零矢量(上全通或下全通)。这 6 个有效矢量,正好把平面分成 6 个扇区。
4.2 六个扇区的划分——别死记硬背,看图就懂
我习惯把这 6 个有效矢量想象成钟表上的 6 个整点位置。它们幅值相等,角度依次相差 60°。具体来说:
- U1 (100):0° 方向,对应 A 相上管导通
- U2 (110):60° 方向
- U3 (010):120° 方向
- U4 (011):180° 方向
- U5 (001):240° 方向
- U6 (101):300° 方向
每个相邻矢量之间夹着的区域,就是一个扇区。比如 U1 和 U2 之间是扇区 I,U2 和 U3 之间是扇区 II,以此类推。
我的小技巧:判断当前合成矢量落在哪个扇区,不用去算复杂的反正切。直接看 Uα 和 Uβ 的符号,以及它们的比值关系就行。我在项目里常用查表法,又快又稳。
下面这张图,就是六个扇区的划分和基本电压矢量的位置:
4.3 合成矢量的伏秒平衡——核心中的核心
好,现在问题来了:我们只有 6 个固定方向的矢量,但想要合成任意方向、任意大小的矢量,怎么办?
答案就是伏秒平衡。说白了,就是在一个 PWM 周期内,用相邻的两个有效矢量和零矢量,通过分配它们的作用时间,来“拼”出目标矢量。
举个例子。假设目标矢量 Us 落在扇区 I(U1 和 U2 之间)。那么:
- 确定相邻矢量:U1 和 U2。
- 计算作用时间:根据 Us 在 U1 和 U2 方向上的投影,算出 T1 和 T2。
- 填充零矢量:剩下的时间 T0 = Ts - T1 - T2,用零矢量(U0 或 U7)填充。
公式长这样(以扇区 I 为例):
T1 = (√3 * Ts / Udc) * (Uα * sin(60° - θ) + Uβ * cos(60° - θ))
T2 = (√3 * Ts / Udc) * (-Uα * sin(θ) + Uβ * cos(θ))
T0 = Ts - T1 - T2
其中 Ts 是 PWM 周期,Udc 是母线电压,θ 是目标矢量与 U1 的夹角。
我曾经踩过的坑:刚开始做实验时,我直接套用公式算 T1 和 T2,结果电机转起来抖得厉害。后来发现,是母线电压 Udc 的采样值有波动,导致计算出来的时间不准。我的建议是:务必对 Udc 做滤波处理,或者在代码里做一次归一化,把 Udc 的影响消除掉。
4.4 七段式与五段式——两种常见的调制策略
算出了 T1、T2、T0 之后,怎么安排它们在一个周期里的顺序?这里有两种主流做法:
| 策略 | 开关次数 | 谐波特性 | 适用场景 |
|---|---|---|---|
| 七段式 | 每个周期 6 次开关切换 | 谐波含量低,电流纹波小 | 对电流质量要求高的场合 |
| 五段式 | 每个周期 4 次开关切换 | 谐波含量略高,但开关损耗低 | 对效率要求高的场合 |
我个人习惯在通用变频器里用七段式,因为电流波形更干净,电机噪音也小。但在一些电池供电的便携设备里,我会换成五段式,毕竟省一点开关损耗就是省一点电。
一个实用建议:不管用哪种策略,记得在切换时保证每次只切换一个开关管。这样可以避免上下桥臂直通,也能减少 EMI。嗯,这个细节很容易被忽略,但真的很重要。
4.5 从理论到代码——一个简单的扇区判断示例
说了这么多,咱们来点实际的。下面这段代码,就是根据 Uα 和 Uβ 判断当前扇区的逻辑。我在项目里一直这么用,很稳定:
// 输入:Uα, Uβ(经过 Clarke 变换后的值)
// 输出:扇区编号(1~6)
int svpwm_sector_calc(float Ualpha, float Ubeta) {
float U1 = Ubeta;
float U2 = (sqrt3 / 2) * Ualpha - 0.5 * Ubeta;
float U3 = (-sqrt3 / 2) * Ualpha - 0.5 * Ubeta;
int sector = 0;
if (U1 > 0) sector |= 1;
if (U2 > 0) sector |= 2;
if (U3 > 0) sector |= 4;
// 查表映射
static const int sector_map[8] = {0, 1, 5, 0, 3, 2, 4, 0};
return sector_map[sector];
}
你看,没有复杂的数学运算,几个比较和位操作就搞定了。这就是工程思维——能用查表解决的,绝不现场算。
总结一下:
- 电压空间矢量是三相电压在 α-β 坐标系下的合成表示
- 6 个有效矢量把平面分成 6 个扇区,每个扇区 60°
- 伏秒平衡是 SVPWM 的核心:用相邻矢量和零矢量合成目标矢量
- 七段式 vs 五段式:谐波 vs 效率的取舍
嗯,SVPWM 的基本原理就这些。你把这些概念吃透了,后面讲电流采样和调制联动的时候,就会顺很多。