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β → 判断扇区 → 计算T1/T2 → 过调制处理 → 输出比较值。每一步都环环相扣,缺一不可。
避坑指南:我曾经在过调制处理里忘了做饱和判断,结果T1+T2远大于T时,等比例缩小后占空比反而变小了。正确的做法是先判断,再缩放。另外,死区时间也要考虑进去,不然上下桥臂会直通。
好了,SVPWM的核心内容就这些。从原理到扇区判断,从时间计算到两种实现方式,再到实际代码,我希望你能真正理解它背后的逻辑。下次调试电机时,如果遇到噪音大或者效率低的问题,不妨回头看看SVPWM这部分,八成能找到原因。