3. 电压空间矢量合成:基本电压矢量(V0-V7)、扇区划分、参考电压矢量的合成原理

好,咱们进入SVPWM的核心环节——电压空间矢量的合成。说白了,就是要用逆变器那有限的几个开关状态,去拼出一个我们想要的任意方向的电压矢量。这就像做菜,手头只有几种基础食材,但你要调出各种味道来。

3.1 基本电压矢量(V0-V7)

先看逆变器。一个典型的三相两电平逆变器,每相桥臂有两个开关管,上下互补导通。我们用“1”表示上管导通、下管关断,“0”表示下管导通、上管关断。那么三相开关状态组合起来,一共就有2³ = 8种状态。

这8种状态对应8个基本电压矢量。其中6个是非零矢量(V1~V6),2个是零矢量(V0和V7)。

矢量 开关状态 (A B C) 空间位置 幅值
V0 000 原点 0
V1 100 0° 2/3 Vdc
V2 110 60° 2/3 Vdc
V3 010 120° 2/3 Vdc
V4 011 180° 2/3 Vdc
V5 001 240° 2/3 Vdc
V6 101 300° 2/3 Vdc
V7 111 原点 0

关键点:非零矢量的幅值都是2/3 Vdc(Vdc是直流母线电压),它们在空间上互差60°,把整个平面分成了6个扇区。零矢量V0和V7虽然开关状态不同,但效果一样——把电机绕组短路,电压为零。

我在项目调试中遇到过一个问题:有同事问为什么V0和V7要区分开?明明都是零矢量。嗯,这里要注意——虽然它们合成的电压效果一样,但开关切换路径不同。V0到V1只切换一相开关,而V7到V1要切换两相。为了减少开关损耗,我们通常会交替使用V0和V7。

3.2 扇区划分

6个非零矢量把复平面切成6个扇区,每个扇区60°。怎么判断一个参考电压矢量Vref落在哪个扇区?

我习惯用三相反电势的符号来判断。你想想看,把Vref分解到三相坐标系上,看各相分量的正负,就能唯一确定扇区。

具体来说,定义三个中间变量:

B1 = Vβ
B2 = sin(60°) * Vα - sin(30°) * Vβ
B3 = -sin(60°) * Vα - sin(30°) * Vβ

然后根据B1、B2、B3的符号,查表得到扇区号:

B1符号 B2符号 B3符号 扇区
+ - - I
+ + - II
- + - III
- + + IV
- - + V
+ - + VI

我的小技巧:实际代码里不用算三角函数,直接用Vα和Vβ的线性组合就能判断。我曾经在DSP上实现时,用查表法代替实时计算,省了不少CPU周期。

3.3 参考电压矢量的合成原理

现在核心问题来了:给定一个任意方向的Vref,怎么用相邻的两个基本矢量加零矢量来合成它?

原理很简单——伏秒平衡。在一个PWM周期Ts内,让两个相邻基本矢量和零矢量的作用时间满足:

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

其中Vx和Vy是Vref所在扇区的两个相邻基本矢量,Tx和Ty是它们的作用时间,T0是零矢量作用时间,且Tx + Ty + T0 = Ts。

举个例子,如果Vref在扇区I(0°~60°),相邻矢量是V1(100)和V2(110)。那么:

Tx = Ts × (√3 × |Vref| / Vdc) × sin(60° - θ)
Ty = Ts × (√3 × |Vref| / Vdc) × sin(θ)
T0 = Ts - Tx - Ty

其中θ是Vref在扇区内的角度(相对于扇区起始边)。

注意:当|Vref|超过Vdc/√3时,Tx+Ty会大于Ts,这时候就进入过调制区了。我在做弱磁控制时经常碰到这个边界,需要特殊处理。

下面这张图展示了整个合成逻辑的流程:

SVPWM参考电压矢量合成流程 Vα, Vβ 输入 扇区判断 (N=1~6) 计算 Tx, Ty, T0 Tx+Ty > Ts? 过调制处理 正常调制 过调制处理 输出三相占空比 核心:伏秒平衡原理 Vref·Ts = Vx·Tx + Vy·Ty + V0·T0

实际代码实现时,我建议把Tx、Ty的计算归一化处理。定义一个中间变量:

// 假设Vdc已知,Ts已知
float X = sqrt3 * Ts / Vdc * Vbeta;
float Y = sqrt3 * Ts / Vdc * (0.5 * Vbeta + 0.866 * Valpha);
float Z = sqrt3 * Ts / Vdc * (0.5 * Vbeta - 0.866 * Valpha);

// 根据扇区查表得到Tx, Ty
switch(sector) {
    case 1: Tx = Z; Ty = Y; break;
    case 2: Tx = Y; Ty = -X; break;
    case 3: Tx = -Z; Ty = X; break;
    case 4: Tx = -X; Ty = Z; break;
    case 5: Tx = X; Ty = -Y; break;
    case 6: Tx = -Y; Ty = -Z; break;
}

避坑指南:我曾经在TI的C2000上实现时,发现浮点运算太慢。后来改用Q15格式的定点数,把sqrt3和Ts/Vdc预先算好存成常数,速度提升了一倍。另外,注意处理Tx+Ty > Ts的情况,这时候要等比例缩小:Tx' = Tx / (Tx+Ty) × Ts,Ty' = Ty / (Tx+Ty) × Ts。

最后一步,根据Tx、Ty、T0和扇区号,计算出三相的比较值,送入PWM模块。这部分我习惯用七段式SVPWM,也就是在一个周期内,零矢量V0和V7各用一半时间,这样开关次数均匀,谐波也小。

好了,电压空间矢量的合成原理就这些。你想想看,其实核心就是三个步骤:判断扇区、计算时间、分配占空比。搞清楚了这些,SVPWM的底层逻辑你就拿下了。