4. 空间矢量调制(SVPWM)

各位同学,今天我们来聊聊FOC里最硬核、也最让我着迷的部分——SVPWM。说白了,它就是让电机转得又稳又顺的“魔法”。我记得刚入行那会儿,看到SVPWM的波形图,第一反应是“这玩意儿是人能算出来的?”后来啃了几个月,才发现它背后的逻辑其实非常优雅。

4.1 SVPWM的原理

SVPWM的全称是Space Vector Pulse Width Modulation,空间矢量脉宽调制。它的核心思想,是用八个基本电压矢量(六个非零矢量+两个零矢量)去合成任意方向、任意大小的电压矢量。

你想想看,逆变器只有六个开关管,能输出的电压状态其实就八种。但电机需要的是连续旋转的磁场。怎么办?用时间平均法。在一个PWM周期里,快速切换不同的电压矢量,让它们的“合力”等于我们想要的电压矢量。

我习惯把SVPWM比作“调色”。你有红、黄、蓝三种原色,通过不同比例混合,就能得到任意颜色。SVPWM也一样,用相邻的两个基本矢量,加上零矢量,按时间比例混合,就能得到任意方向的电压矢量。

关键点:SVPWM的电压利用率比传统的SPWM高15%。这意味着同样的母线电压,SVPWM能让电机跑得更快。我在做伺服驱动器时,就靠这个特性把转速上限提了10%,客户非常满意。

为什么会高15%?因为SPWM的调制比最大只有1,而SVPWM可以到1.1547(即2/√3)。这个数字我记了十年,因为每次算母线电压利用率都要用到它。

4.2 扇区判断

拿到目标电压矢量(Uα, Uβ)后,第一件事就是判断它在哪个扇区。六个扇区,每个60度,像切西瓜一样把空间分成六块。

判断方法很简单,看三个中间变量:

B1 = Uβ
B2 = (√3/2)*Uα - (1/2)*Uβ
B3 = -(√3/2)*Uα - (1/2)*Uβ

然后算扇区号:

N = 4*sign(B3) + 2*sign(B2) + sign(B1)

其中sign(x)是符号函数,x>0时返回1,否则返回0。N的值从1到6,对应六个扇区。

我的小技巧:实际代码里,我一般用查表法。先算B1、B2、B3,然后查一个6元素的数组,直接得到扇区号。比用if-else快很多,尤其是在中断里跑的时候。

我曾经在项目里踩过一个坑:符号函数写成了x>=0返回1,结果在边界上出了bug,电机偶尔会抖一下。后来改成x>0才解决。嗯,边界条件一定要小心。

4.3 作用时间计算

知道扇区后,就要算两个相邻矢量的作用时间T1和T2。公式长这样:

X = (√3*T*Uβ) / Vdc
Y = (√3*T*( (√3/2)*Uα + (1/2)*Uβ )) / Vdc
Z = (√3*T*( -(√3/2)*Uα + (1/2)*Uβ )) / Vdc

然后根据扇区查表:

扇区 T1 T2
1 Z Y
2 Y -X
3 -Z X
4 -X Z
5 X -Y
6 -Y -Z

算完T1和T2后,还要做一件事:过调制处理。如果T1+T2 > T(PWM周期),就要等比例缩小:

T1 = T1 * T / (T1 + T2)
T2 = T2 * T / (T1 + T2)

这个处理很重要。不做的话,输出波形会失真,电机噪音会变大。我见过有人直接截断,结果电流波形像锯齿一样,电机嗡嗡响。

4.4 七段式与五段式SVPWM

算完时间后,怎么安排开关顺序?两种主流方式:七段式和五段式。

七段式SVPWM:每个周期内,开关切换7次。顺序是:零矢量→T1→T2→零矢量→T2→T1→零矢量。这样做的优点是谐波小,电流波形漂亮。缺点是开关损耗大。

五段式SVPWM:每个周期内,开关切换5次。它省掉了中间那个零矢量,或者把两个零矢量合并成一个。优点是开关损耗降低约30%。缺点是谐波大一些,电流纹波也大。

注意:五段式虽然省电,但低速时电流噪音会明显变大。我建议在高速段用五段式,低速段用七段式。我在一个风机项目里就是这么做的,效果很好。

我个人习惯,如果对噪音要求高(比如家电),就用七段式。如果对效率要求高(比如电动车),就用五段式。没有绝对的好坏,看应用场景。

4.5 SVPWM的实现

最后,我们来看看代码怎么写。以STM32为例,用高级定时器的中心对齐模式:

// 计算比较值
Ta = (T - 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;
    // ... 其他扇区类似
}

然后把cmp1、cmp2、cmp3写入定时器的比较寄存器。注意,这里用的是中心对齐模式,所以比较值是对称的。

我曾经犯过一个低级错误:忘记把定时器配置成中心对齐模式,结果输出的是不对称波形,电机效率直接掉了5%。查了两天才发现,真是血的教训。

下面这张图是我画的SVPWM核心逻辑,帮你理清思路:

SVPWM核心逻辑流程图 Uα, Uβ 输入 扇区判断 (N=1~6) 计算 T1, T2 (查表法) T1+T2 > T? 等比例缩小 输出三相比较值

这张图把SVPWM的四个核心步骤串起来了:输入Uα/Uβ → 判断扇区 → 计算T1/T2 → 过调制处理 → 输出比较值。每一步都环环相扣,缺一不可。

避坑指南:我曾经在过调制处理里忘了做饱和判断,结果T1+T2远大于T时,等比例缩小后占空比反而变小了。正确的做法是先判断,再缩放。另外,死区时间也要考虑进去,不然上下桥臂会直通。

好了,SVPWM的核心内容就这些。从原理到扇区判断,从时间计算到两种实现方式,再到实际代码,我希望你能真正理解它背后的逻辑。下次调试电机时,如果遇到噪音大或者效率低的问题,不妨回头看看SVPWM这部分,八成能找到原因。

专注资料整理