3. 扇区判断与矢量作用时间:扇区划分规则、相邻矢量作用时间计算、零矢量插入策略

好,咱们进入SVPWM最核心的部分了。前面两章我们把基础概念和坐标系理清了,现在要真刀真枪地算东西。扇区判断、作用时间计算、零矢量插入——这三步走完,你就能在DSP或者MCU里把SVPWM真正跑起来。

我个人习惯把这部分叫作“SVPWM的骨架”。骨架搭不对,后面控制性能再好也白搭。咱们一个一个来拆。

3.1 扇区划分规则

为什么要分扇区?说白了,就是六个基本电压矢量把空间分成了六块。你给定一个目标电压矢量,我得先知道它在哪块里,才能决定用哪两个相邻矢量去合成它。

扇区划分的依据,是两相静止坐标系(α-β)下的电压分量。具体来说,我们通过三个中间变量来判断:

扇区判断的三个中间变量:

Vref1 = Vβ
Vref2 = (√3/2)·Vα - (1/2)·Vβ
Vref3 = -(√3/2)·Vα - (1/2)·Vβ

然后根据这三个值的符号,查表就能得到扇区号。规则如下:

Vref1 符号 Vref2 符号 Vref3 符号 扇区号
> 0 > 0 < 0 I
> 0 < 0 < 0 II
> 0 < 0 > 0 III
< 0 < 0 > 0 IV
< 0 > 0 > 0 V
< 0 > 0 < 0 VI

我的小技巧:实际工程里,我一般直接用查表法,把三个中间变量的符号位拼成一个3位数,然后查一个6元素的数组。这样比if-else嵌套快得多,一个周期就出结果。

嗯,这里要注意:Vα和Vβ是从电流环或者速度环输出的电压指令,经过反Park变换得到的。如果你发现扇区判断老是跳变,先检查一下Vα、Vβ是不是有毛刺。

3.2 相邻矢量作用时间计算

知道目标矢量在哪个扇区之后,下一步就是算两个相邻矢量的作用时间。这个计算基于伏秒平衡原理——说白了,就是让两个矢量的合成效果等于目标矢量。

以扇区I为例,相邻矢量是U₄(100)和U₆(110)。设作用时间分别为T₄和T₆,PWM周期为Tₛ:

Uα·Tₛ = |U₄|·T₄ + |U₆|·T₆·cos(60°)
Uβ·Tₛ = 0·T₄ + |U₆|·T₆·sin(60°)

代入 |U₄| = |U₆| = 2/3·Udc,解得:
T₄ = (√3·Tₛ/Udc)·(√3/2·Uα - 1/2·Uβ)
T₆ = (√3·Tₛ/Udc)·Uβ

其他扇区也是类似的推导过程。实际工程里,我们一般用通用公式,避免每个扇区都重新算一遍:

扇区 T₁(先作用的矢量) T₂(后作用的矢量)
I T₄ = -Z T₆ = X
II T₂ = Z T₆ = Y
III T₂ = -X T₃ = Z
IV T₁ = X T₃ = -Y
V T₁ = -Z T₅ = -X
VI T₄ = Y T₅ = -Z

其中X、Y、Z是三个通用中间变量:

X = (√3·Tₛ/Udc)·Vβ
Y = (√3·Tₛ/Udc)·(√3/2·Vα + 1/2·Vβ)
Z = (√3·Tₛ/Udc)·(-√3/2·Vα + 1/2·Vβ)

我曾经踩过的坑:算出来的T₁+T₂如果大于Tₛ,说明目标电压矢量已经超出了六边形边界,进入了过调制区。这时候如果不做处理,电机电流会畸变,甚至炸管子。一定要做等比例缩放过调制处理:T₁' = T₁·Tₛ/(T₁+T₂),T₂' = T₂·Tₛ/(T₁+T₂)。

3.3 零矢量插入策略

T₁和T₂算完了,但一个PWM周期里还有剩余时间。这部分时间就用零矢量U₀(000)和U₇(111)来填充。零矢量的作用是什么?说白了,就是让电机绕组短路,电流自然续流,不产生转矩。

零矢量的分配方式,直接影响PWM的谐波性能和开关损耗。常见的策略有三种:

  • 七段式SVPWM:一个周期内,零矢量U₀和U₇各出现一次,且对称分布。谐波性能最好,但开关次数多。
  • 五段式SVPWM:只用一个零矢量(U₀或U₇),开关次数减少1/3,但谐波略大。
  • 混合式:根据负载情况动态切换零矢量,兼顾谐波和损耗。

我个人在大多数项目里都用七段式。为什么?因为谐波小,电机运行更平稳。只有在散热条件差、开关频率高的场合,我才会切到五段式。

七段式的开关序列(以扇区I为例):

U₀(000) → U₄(100) → U₆(110) → U₇(111) → U₆(110) → U₄(100) → U₀(000)

时间分配:
T₀/4 → T₄/2 → T₆/2 → T₇/2 → T₆/2 → T₄/2 → T₀/4

你想想看,这样对称分布的好处是什么?每次切换只改变一个开关管的状态,开关损耗最小,而且电流纹波也最小。

3.4 知识体系总览

下面这张图把扇区判断、作用时间计算、零矢量插入的完整流程串起来了。我建议你把它存下来,写代码的时候对照着看。

SVPWM 扇区判断与矢量作用时间流程 输入:Vα, Vβ, Tₛ, Udc 步骤1:扇区判断 计算 Vref1, Vref2, Vref3 → 查表得扇区号 N 步骤2:计算通用中间变量 X = (√3·Tₛ/Udc)·Vβ Y, Z 同理 步骤3:查表得 T₁, T₂ 根据扇区号 N,从表中取出 T₁, T₂ 步骤4:过调制判断与处理 T₁+T₂ ≤ Tₛ → 正常调制 T₁+T₂ > Tₛ → 等比例缩放 输出:T₁, T₂, T₀, 开关序列

3.5 工程实现要点

最后,我总结几个实际写代码时容易出问题的地方:

  • 浮点运算精度:如果MCU没有FPU,建议把所有系数提前算好存成Q格式定点数。我吃过亏,用浮点库算一次要几十微秒,PWM周期都过了。
  • 扇区边界抖动:当Vα或Vβ接近0时,扇区判断容易来回跳。加一个小的滞环死区就能解决。
  • 死区补偿:零矢量插入后,别忘了在PWM里插入死区时间。否则上下管直通,MOSFET瞬间冒烟。
  • 过调制处理优先级:先判断T₁+T₂是否超限,再分配零矢量。顺序搞反了,算出来的占空比会错。

我的习惯做法:在代码里把扇区判断、中间变量计算、查表、过调制处理写成四个独立的函数。调试的时候,每个函数都能单独打印输出,定位问题快很多。

好了,扇区判断和作用时间计算这部分就讲到这里。你把这些逻辑理清楚,SVPWM的代码框架基本就搭起来了。剩下的就是往里面填具体的寄存器配置和中断服务程序了。