4. 扇区判断与合成:参考电压矢量扇区划分、相邻矢量作用时间计算(T1/T2)、零矢量插入策略

好,我们进入SVPWM最核心的实操环节。前面讲了基本电压矢量和那个六边形空间,现在要解决一个实际问题:给定一个你想要的参考电压矢量 Vref,怎么用那六个基本开关状态把它拼出来?

说白了,这就是个“定位+插值”的过程。我当年刚接触这个的时候,总觉得公式推导很复杂,后来发现,只要把步骤拆开,每一步都很直观。

4.1 扇区划分:先定位,再动手

想象你站在一个六边形的中心,手里拿着一个矢量 Vref。第一步,你得知道它落在哪个60°的扇区里。这就像打靶,先知道目标在第几环,才能选对子弹。

怎么判断?看 Vα 和 Vβ 的符号和比例关系。我习惯用三变量法,简单粗暴:

  1. 定义三个中间变量:
    B1 = Vβ
    B2 = √3 * Vα - Vβ
    B3 = -√3 * Vα - Vβ
  2. 根据这三个变量的正负,查表就能得到扇区号 N。

嗯,这里要注意:扇区编号的顺序是逆时针的,从0°开始。 我见过有人把扇区0和扇区1搞反,结果电机转起来一顿一顿的。

扇区判断速查表:

B1B2B3扇区 N
++-I (0°~60°)
+--II (60°~120°)
+-+III (120°~180°)
--+IV (180°~240°)
-++V (240°~300°)
-+-VI (300°~360°)

你想想看,这个判断其实就是在比较三个线电压的瞬时值。我在做伺服驱动器项目时,发现直接用查表法比用反正切函数快得多,而且没有角度计算误差。

4.2 相邻矢量作用时间 T1/T2:核心公式

定位到扇区后,就要用这个扇区边上的两个基本矢量来合成 Vref。比如在扇区I,我们用 V1 (100) 和 V2 (110) 来合成。

根据伏秒平衡原理:

Vref * Ts = V1 * T1 + V2 * T2

其中 Ts 是PWM周期。解这个方程,得到 T1 和 T2 的通用公式。我建议你直接记住下面这个归一化后的计算表,实际项目中用起来特别顺手:

扇区T1T2
IXY
IIY-Z
III-XZ
IV-X-Y
V-YZ
VIX-Z

其中:

  • X = √3 * Vβ * Ts / Vdc
  • Y = (3/2 * Vα + √3/2 * Vβ) * Ts / Vdc
  • Z = (-3/2 * Vα + √3/2 * Vβ) * Ts / Vdc

避坑指南: 我曾经在计算 T1 + T2 时,发现有时候它们的和会超过 Ts。这说明 Vref 已经超出了六边形的内切圆,进入了过调制区。这时候必须做限幅处理:T1 = T1 * Ts / (T1 + T2),T2 = T2 * Ts / (T1 + T2)。不做这一步,电机电流会畸变,甚至导致过流保护。

4.3 零矢量插入策略:七段式 vs 五段式

有了 T1 和 T2,剩下的时间 T0 = Ts - T1 - T2 就分配给零矢量 V0 (000) 和 V7 (111)。怎么插?这里有两种主流策略。

七段式SVPWM(对称插入)

我个人最常用这种。它在每个PWM周期内,把零矢量分成两段,分别放在开头和结尾,中间对称排列。比如扇区I的开关序列是:
000 → 100 → 110 → 111 → 110 → 100 → 000

这样做的好处是谐波含量低,电流纹波小。缺点是开关次数多,损耗稍大。

五段式SVPWM(非对称插入)

只插入一种零矢量,比如只插 V0 或只插 V7。开关序列变成:
000 → 100 → 110 → 111 → 110 → 100 → 000(其实还是七段,但零矢量分配不均)

更极端的做法是DPWM(不连续PWM),每60°切换一次零矢量类型。开关损耗能降低1/3,但谐波会大一些。

我的经验: 在低转速、高精度要求的场合(比如机床主轴),我坚决用七段式。在高速、大功率、对效率敏感的场合(比如电动汽车),我会考虑五段式或DPWM。没有绝对的好坏,只有合不合适。

4.4 知识体系总览

下面这张图把整个扇区判断与合成的流程串起来了。你可以把它当作一个检查清单,写代码时对着看,不容易漏步骤。

SVPWM扇区判断与合成流程图 SVPWM 扇区判断与合成流程 输入 Vα, Vβ, Ts, Vdc 计算 B1, B2, B3 → 扇区 N 计算 X, Y, Z 中间变量 查表得 T1, T2 T1+T2 > Ts ? 限幅 输出 T1, T2, T0 关键点 • 扇区判断用三变量法 • T1/T2 查表避免重复计算 • 过调制必须限幅 • 零矢量分配影响谐波

4.5 代码实现要点

最后,我贴一段伪代码框架。实际项目中,你只需要把扇区判断和T1/T2计算写成查表形式,就能跑得很顺。

// 输入:V_alpha, V_beta, T_s, V_dc
// 输出:T1, T2, 扇区号

// 1. 计算中间变量
B1 = V_beta;
B2 = 1.732 * V_alpha - V_beta;  // sqrt(3) ≈ 1.732
B3 = -1.732 * V_alpha - V_beta;

// 2. 扇区判断(查表法)
if (B1 > 0) N = 1; else N = 0;
if (B2 > 0) N = N + 2;
if (B3 > 0) N = N + 4;
// 实际扇区号需要查表映射,这里简化

// 3. 计算X, Y, Z
X = 1.732 * V_beta * T_s / V_dc;
Y = (1.5 * V_alpha + 0.866 * V_beta) * T_s / V_dc;
Z = (-1.5 * V_alpha + 0.866 * V_beta) * T_s / V_dc;

// 4. 根据扇区查表得T1, T2
switch(N) {
    case 1: T1 = X; T2 = Y; break;
    case 2: T1 = Y; T2 = -Z; break;
    // ... 其他扇区
}

// 5. 过调制限幅
if (T1 + T2 > T_s) {
    T1 = T1 * T_s / (T1 + T2);
    T2 = T2 * T_s / (T1 + T2);
}
T0 = T_s - T1 - T2;

小技巧: 在定点DSP或MCU上,把1.732和0.866这些系数预先算好,存成Q15格式的整数,可以避免浮点运算,速度能快一个数量级。我当年在TMS320F28035上就是这么干的,PWM频率跑到20kHz毫无压力。

好了,扇区判断和合成这部分就讲到这里。记住:定位准了,时间算对了,零矢量插好了,SVPWM就成功了一大半。 剩下的就是调参数和看波形了。