3、SVPWM(空间矢量脉宽调制):电压空间矢量原理、扇区判断、作用时间计算、七段式与五段式SVPWM实现

各位做电机控制的朋友,咱们今天聊聊SVPWM。

说实话,在所有的PWM调制技术里,SVPWM是我个人最偏爱的一个。为什么?因为它不是简单地生成三个正弦波,而是从「电机想要什么旋转磁场」这个角度出发的。你想想看,电机要转起来,靠的就是定子产生的旋转磁场。SVPWM直接去合成这个磁场矢量,比单纯的SPWM高明多了。

3.1 电压空间矢量原理

先说说基本概念。三相逆变器有6个开关管,上下桥臂不能同时导通。所以一共只有8种开关状态:6个非零矢量和2个零矢量。

我把这8个状态画在复平面上,就得到了6个相隔60°的基本电压矢量,加上原点处的两个零矢量。这6个矢量把整个平面分成了6个扇区。

核心思想:任意时刻想要的电压矢量,都可以由相邻的两个基本矢量通过时间加权合成。这就是「伏秒平衡」原理。

我记得刚入行时,总觉得这玩意儿很玄乎。后来自己动手推导了一遍,发现其实就是个矢量加法。你想要的矢量Vref,落在哪个扇区,就用这个扇区边上的两个矢量Vx和Vy,再加上零矢量V0/V7,通过调整各自的作用时间,就能拼出任意方向和幅值的电压。

数学表达很简单:

Vref * Ts = Vx * Tx + Vy * Ty + V0 * T0

其中Ts是PWM周期,Tx、Ty、T0分别是三个矢量的作用时间。

扇区Ⅰ 扇区Ⅱ 扇区Ⅲ 扇区Ⅳ 扇区Ⅴ 扇区Ⅵ U₄(100) U₂(110) U₃(010) U₁(011) U₅(001) U₆(101) Vref O

3.2 扇区判断

知道了原理,下一步就是判断Vref落在哪个扇区。这步很关键,判断错了,合成出来的磁场方向就全歪了。

我常用的方法是基于Clark变换后的αβ分量来判断。具体来说,定义三个中间变量:

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

然后根据这三个值的符号,就能唯一确定扇区号:

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

其中sign(x)在x>0时返回1,x<0时返回0。查表就能得到扇区。

我的小技巧:实际代码里,我习惯用位运算来做这个判断,效率更高。比如把三个符号位拼成一个3位的二进制数,然后直接查一个8元素的数组。这样省去了if-else的跳转开销。

3.3 作用时间计算

扇区定下来了,接下来算时间。每个扇区里,两个相邻矢量的作用时间Tx和Ty,加上零矢量时间T0,凑满整个PWM周期。

以扇区Ⅰ为例(U₄和U₆之间):

Tx = (√3 * Ts / Udc) * ( (√3/2)*Uα - (1/2)*Uβ )
Ty = (√3 * Ts / Udc) * Uβ

其他扇区类似,只是αβ分量的组合系数不同。实际工程中,我一般会预先算好系数表,运行时直接查表加乘加,避免在线计算三角函数。

注意:当Tx + Ty > Ts时,说明参考电压已经超出了六边形的内切圆,进入了过调制区。这时候需要对Tx和Ty进行等比例缩放:Tx' = Tx * Ts / (Tx+Ty),Ty' = Ty * Ts / (Tx+Ty),T0 = 0。我在做伺服驱动器时就踩过这个坑,没做限幅,结果电流波形畸变得厉害。

3.4 七段式SVPWM实现

七段式是最经典的实现方式。它的特点是:每个PWM周期内,开关状态变化7次,从零矢量开始,到两个非零矢量,再回到零矢量,对称排列。

以扇区Ⅰ为例,七段式的开关序列是:

000 → 100 → 110 → 111 → 110 → 100 → 000

对应的三相占空比计算:

Ta = (Ts - Tx - Ty) / 4
Tb = Ta + Tx / 2
Tc = Tb + Ty / 2

然后根据扇区,把Ta、Tb、Tc映射到A、B、C三相的占空比寄存器里。

优点:谐波含量低,电流纹波小。
缺点:开关次数多,开关损耗较大。

我曾经在一个项目里用过七段式,电机运行起来非常安静,几乎没有高频啸叫。但温升有点高,后来在散热条件受限的场合,我换成了五段式。

3.5 五段式SVPWM实现

五段式和七段式的区别在于:每个周期只插入一次零矢量,而不是两次。开关序列变成5段。

以扇区Ⅰ为例,五段式的开关序列可以是:

000 → 100 → 110 → 111 → 110 → 100 → 000  (实际上只保留前半段或后半段)

更常见的做法是:每个扇区固定使用一个零矢量(要么全000,要么全111),这样每个周期只有5次开关切换。

占空比计算也相应调整:

Ta = (Ts - Tx - Ty) / 2
Tb = Ta + Tx
Tc = Tb + Ty

我的经验:五段式的开关损耗比七段式降低约30%。但代价是电流谐波会大一些,低速运行时可能听到轻微的电机噪声。如果你做的是电池供电的便携设备,五段式是更好的选择。如果是精密伺服,我建议还是用七段式。

3.6 两种方式的对比

对比项 七段式SVPWM 五段式SVPWM
每周期开关次数 7次 5次
开关损耗 较高 较低(约降30%)
电流谐波 较高
电机噪声 略大
适用场景 精密伺服、低噪声要求 电池供电、散热受限

嗯,两种方式没有绝对的好坏,关键看你的应用场景。我个人习惯在开发初期先用七段式,等系统稳定了,再根据温升和噪声测试结果决定要不要切到五段式。

最后说一句,SVPWM的代码实现其实不复杂,但细节很多。尤其是扇区判断和时间计算里的系数,一定要用定点数或者Q格式处理好,否则浮点运算会吃掉你大量的CPU时间。我在DSP上做的时候,全部用整数运算,一个PWM周期内完成所有计算,绰绰有余。


专注资料整理