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,这时候就进入过调制区了。我在做弱磁控制时经常碰到这个边界,需要特殊处理。
下面这张图展示了整个合成逻辑的流程:
实际代码实现时,我建议把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的底层逻辑你就拿下了。