3、扇区判断原理:三相电压的符号判断法、扇区与电压矢量的对应关系、扇区判断的数学推导

扇区判断,说白了就是回答一个问题:当前参考电压矢量到底落在哪个扇区?

这个问题不搞清楚,后面的矢量合成、占空比计算全是白搭。我刚开始做SVPWM时,就犯过这个错——扇区算错了,电机转起来嗡嗡响,电流波形跟锯齿似的。后来老老实实把扇区判断的逻辑捋了一遍,问题才解决。

这一节,我们就从最直观的三相电压符号判断法入手,再深入到数学推导,最后把扇区与电压矢量的对应关系彻底讲透。

3.1 三相电压符号判断法:最直观的扇区定位

你想想看,三相电压 \( U_a \)、\( U_b \)、\( U_c \) 是随时间变化的。在任意时刻,它们的正负组合其实就隐含了扇区信息。

为什么?因为六个基本电压矢量(\( V_1 \) 到 \( V_6 \))把空间分成了六个60°的扇区。每个扇区内,三相电压的符号组合是唯一的。

核心思想:通过判断 \( U_a \)、\( U_b \)、\( U_c \) 的符号(正或负),就能唯一确定参考电压矢量所在的扇区。

具体怎么判断?我习惯用一个简单的三变量逻辑表。定义三个中间变量:

  • \( A = \text{sign}(U_a) \) —— 如果 \( U_a > 0 \),则 \( A = 1 \);否则 \( A = 0 \)。
  • \( B = \text{sign}(U_b) \) —— 如果 \( U_b > 0 \),则 \( B = 1 \);否则 \( B = 0 \)。
  • \( C = \text{sign}(U_c) \) —— 如果 \( U_c > 0 \),则 \( C = 1 \);否则 \( C = 0 \)。

然后,扇区编号 \( N \) 就可以通过一个简单的公式算出来:

N = A + 2*B + 4*C

嗯,这里要注意:这个公式不是随便凑的。它实际上是一个二进制编码——\( A \) 是最低位,\( C \) 是最高位。算出来的 \( N \) 值范围是 0 到 7,但实际有效的扇区编号是 1 到 6。

我在项目中遇到过一个问题:当电压刚好过零时,符号判断会变得很敏感。轻微的噪声就会导致扇区误判。我的解决办法是加一个滞环比较,比如电压绝对值小于某个阈值(比如 0.01 V)时,保持上一次的符号结果不变。

3.2 扇区与电压矢量的对应关系

符号判断法算出来的 \( N \) 值,怎么映射到具体的扇区编号?这就要看电压矢量的空间分布了。

六个基本电压矢量在复平面上的分布是这样的:

  • 扇区 I(0° ~ 60°):由 \( V_1 \)(100)和 \( V_2 \)(110)合成。
  • 扇区 II(60° ~ 120°):由 \( V_2 \)(110)和 \( V_3 \)(010)合成。
  • 扇区 III(120° ~ 180°):由 \( V_3 \)(010)和 \( V_4 \)(011)合成。
  • 扇区 IV(180° ~ 240°):由 \( V_4 \)(011)和 \( V_5 \)(001)合成。
  • 扇区 V(240° ~ 300°):由 \( V_5 \)(001)和 \( V_6 \)(101)合成。
  • 扇区 VI(300° ~ 360°):由 \( V_6 \)(101)和 \( V_1 \)(100)合成。

对应的 \( N \) 值与扇区编号的映射关系如下表:

N 值 扇区编号 角度范围 合成矢量对
3 I 0° ~ 60° V₁ (100) + V₂ (110)
1 II 60° ~ 120° V₂ (110) + V₃ (010)
5 III 120° ~ 180° V₃ (010) + V₄ (011)
4 IV 180° ~ 240° V₄ (011) + V₅ (001)
6 V 240° ~ 300° V₅ (001) + V₆ (101)
2 VI 300° ~ 360° V₆ (101) + V₁ (100)

记忆技巧:我记这个映射表时,发现一个规律——N 值 3、1、5、4、6、2 正好对应扇区 I 到 VI。你可以在代码里用一个查表数组来实现,比如 sector_lookup[8] = {0, 2, 6, 1, 4, 3, 5, 0};,这样 N 值直接索引就能得到扇区编号。

3.3 扇区判断的数学推导

符号判断法虽然直观,但有时候我们需要更精确的数学表达。尤其是在做无传感器控制时,电压的相位信息比符号更重要。

从数学上看,扇区判断的本质是:确定参考电压矢量 \( V_{ref} \) 的相角 \( \theta \) 落在哪个60°区间内。

假设我们已经通过 Clark 变换得到了 \( V_\alpha \) 和 \( V_\beta \),那么相角 \( \theta \) 为:

θ = atan2(V_β, V_α)

然后,扇区编号可以通过下面的条件判断:

  • 如果 \( 0° \le \theta < 60° \),扇区 = I
  • 如果 \( 60° \le \theta < 120° \),扇区 = II
  • 如果 \( 120° \le \theta < 180° \),扇区 = III
  • 如果 \( 180° \le \theta < 240° \),扇区 = IV
  • 如果 \( 240° \le \theta < 300° \),扇区 = V
  • 如果 \( 300° \le \theta < 360° \),扇区 = VI

但实际工程中,我们很少直接用 atan2 来做扇区判断。为什么?因为 atan2 计算量太大,而且有除零风险。我曾经在一个低成本的 MCU 上试过,一次 atan2 调用要花几十微秒,根本跑不了高频控制。

所以,更常用的方法是基于 \( V_\alpha \) 和 \( V_\beta \) 的线性组合。具体来说,定义三个参考量:

V_ref1 = V_β
V_ref2 = (√3/2) * V_α - (1/2) * V_β
V_ref3 = -(√3/2) * V_α - (1/2) * V_β

然后,通过判断这三个量的符号,就能得到扇区:

  • 如果 \( V_{ref1} > 0 \),则 \( A = 1 \);否则 \( A = 0 \)。
  • 如果 \( V_{ref2} > 0 \),则 \( B = 1 \);否则 \( B = 0 \)。
  • 如果 \( V_{ref3} > 0 \),则 \( C = 1 \);否则 \( C = 0 \)。

最后,扇区编号 \( N = A + 2B + 4C \)。

注意:这里的 \( V_{ref1} \)、\( V_{ref2} \)、\( V_{ref3} \) 并不是电压矢量,而是为了扇区判断构造的中间变量。它们的物理意义是:将 \( V_\alpha \)-\( V_\beta \) 坐标系旋转到与扇区边界对齐的方向上。

这种方法的优势很明显:只用加减法和比较,没有乘除,更没有三角函数。在定点 DSP 或普通 MCU 上,几个时钟周期就能算完。

3.4 扇区判断的完整流程图

为了让你更直观地理解整个扇区判断的流程,我画了一张图:

扇区判断流程图 扇区判断完整流程 输入 Ua, Ub, Uc Clark 变换 → Vα, Vβ 计算 Vref1 = Vβ Vref2 = (√3/2)Vα - (1/2)Vβ 符号判断:A = sign(Vref1) B = sign(Vref2), C = sign(Vref3) N = A + 2B + 4C 查表得到扇区编号 说明 • 符号判断法:直接 用 Ua, Ub, Uc 符号 • 数学推导法:用 Vα, Vβ 工程建议 • 优先用数学推导法 • 避免 atan2 计算

3.5 工程实现中的避坑指南

扇区判断看起来简单,但实际工程中容易踩坑。我总结了几点:

避坑1:电压过零时的符号抖动

我曾经在一个项目中,发现电机在低速运行时偶尔会抖动。查了半天,发现是扇区判断在电压过零点附近频繁跳变。解决办法是加一个滞环比较:当电压绝对值小于阈值时,保持上一次的符号结果。

避坑2:浮点数精度问题

在定点 MCU 上,\( \sqrt{3}/2 \) 这个系数最好用 Q15 或 Q31 格式的定点数表示。我一般用 0.8660254 的定点近似值,比如 Q15 格式下是 28377(因为 \( 0.8660254 \times 2^{15} \approx 28377 \))。

避坑3:扇区边界处的连续性

当参考电压矢量正好落在扇区边界上时(比如正好 60°),理论上两个扇区都可以。但实际代码中,必须保证边界处理的一致性。我习惯把边界归到前一个扇区,比如 \( \theta = 60° \) 时归为扇区 I,这样能避免边界处的占空比突变。

3.6 小结

扇区判断是 SVPWM 的第一步,也是最关键的一步。搞清楚了扇区,后面的矢量合成和占空比计算才能顺利进行。

我个人推荐使用基于 \( V_\alpha \) 和 \( V_\beta \) 的线性组合法,它兼顾了计算效率和精度。如果你用的是高性能 DSP,也可以直接用 atan2,但要注意边界处理。