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 知识体系总览
下面这张图把扇区判断、作用时间计算、零矢量插入的完整流程串起来了。我建议你把它存下来,写代码的时候对照着看。
3.5 工程实现要点
最后,我总结几个实际写代码时容易出问题的地方:
- 浮点运算精度:如果MCU没有FPU,建议把所有系数提前算好存成Q格式定点数。我吃过亏,用浮点库算一次要几十微秒,PWM周期都过了。
- 扇区边界抖动:当Vα或Vβ接近0时,扇区判断容易来回跳。加一个小的滞环死区就能解决。
- 死区补偿:零矢量插入后,别忘了在PWM里插入死区时间。否则上下管直通,MOSFET瞬间冒烟。
- 过调制处理优先级:先判断T₁+T₂是否超限,再分配零矢量。顺序搞反了,算出来的占空比会错。
我的习惯做法:在代码里把扇区判断、中间变量计算、查表、过调制处理写成四个独立的函数。调试的时候,每个函数都能单独打印输出,定位问题快很多。
好了,扇区判断和作用时间计算这部分就讲到这里。你把这些逻辑理清楚,SVPWM的代码框架基本就搭起来了。剩下的就是往里面填具体的寄存器配置和中断服务程序了。