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 扇区判断的完整流程图
为了让你更直观地理解整个扇区判断的流程,我画了一张图:
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,但要注意边界处理。