4、扇区判断:如何根据目标电压矢量判断所在扇区?

好,咱们接着聊。上一节我们把 Clarke 和 Park 变换搞定了,拿到了 Vα 和 Vβ。这两个值,说白了就是目标电压矢量在静止坐标系下的坐标。

现在问题来了:SVPWM 是靠六个基本矢量(V1~V6)和零矢量来合成任意矢量的。你得先知道目标矢量落在哪个扇区,才能决定用哪两个基本矢量去合成它。

这就像你要去一个陌生城市送货,得先看地图,知道自己在哪个区,才能规划路线。扇区判断,就是那张地图。

4.1 扇区划分的几何直觉

先看个直观的图。六个基本矢量把平面分成了六个 60° 的扇区,编号从 I 到 VI。

核心思路: 扇区判断的本质,就是根据 Vα 和 Vβ 的符号和比例关系,确定目标矢量落在哪个 60° 区间里。

扇区划分与电压矢量关系图 β α V1(100) V2(110) V3(010) V4(011) V5(001) V6(101) I II III IV V VI Vref 扇区 I: 0°~60° | 扇区 II: 60°~120° | 扇区 III: 120°~180° 扇区 IV: 180°~240° | 扇区 V: 240°~300° | 扇区 VI: 300°~360° Vref 落在扇区 I,用 V1(100) 和 V2(110) 合成

4.2 传统方法:三值逻辑判断

教科书上最经典的方法,是定义三个中间变量 A、B、C。我个人习惯叫它「三值逻辑法」,简单粗暴。

具体步骤是这样的:

  1. 计算三个参考量:
    Vref1 = Vβ
    Vref2 = (√3/2)*Vα - (1/2)*Vβ
    Vref3 = -(√3/2)*Vα - (1/2)*Vβ
  2. 判断符号,得到 A、B、C:
    • 如果 Vref1 > 0,则 A = 1,否则 A = 0
    • 如果 Vref2 > 0,则 B = 1,否则 B = 0
    • 如果 Vref3 > 0,则 C = 1,否则 C = 0
  3. 计算扇区号:
    N = A + 2*B + 4*C
    然后查表:
    N 值123456
    扇区IIVIIIVIIIV

我的小技巧: 这个查表映射关系,不同资料可能不一样。我建议你拿到代码后,先拿几个已知角度(比如 30°、90°、150°)手动算一遍,确认映射关系对不对。我在项目里吃过这个亏,照着网上的表抄,结果电机转起来一顿一顿的。

4.3 我更喜欢的方法:直接角度判断

说实话,上面那个方法虽然经典,但每次都要算三个 Vref,还要查表,有点绕。

我个人在实际项目中更常用的是 直接角度判断法。既然我们已经有了 Vα 和 Vβ,那目标矢量的角度 θ 可以直接算出来:

θ = atan2(Vβ, Vα)   // 结果范围:-π ~ π

然后根据 θ 落在哪个区间,直接判断扇区:

角度范围(弧度)角度范围(度)扇区
0 ~ π/30° ~ 60°I
π/3 ~ 2π/360° ~ 120°II
2π/3 ~ π120° ~ 180°III
-π ~ -2π/3-180° ~ -120°IV
-2π/3 ~ -π/3-120° ~ -60°V
-π/3 ~ 0-60° ~ 0°VI

代码实现也很简单:

// 计算角度
float theta = atan2f(Vbeta, Valpha);

// 角度归一化到 0 ~ 2π
if (theta < 0) theta += 2 * M_PI;

// 判断扇区
int sector;
if (theta < M_PI/3)          sector = 1;
else if (theta < 2*M_PI/3)   sector = 2;
else if (theta < M_PI)       sector = 3;
else if (theta < 4*M_PI/3)   sector = 4;
else if (theta < 5*M_PI/3)   sector = 5;
else                          sector = 6;

注意: 直接角度法虽然直观,但 atan2 计算量比较大。在低端 MCU 上,一次 atan2 可能要几十微秒。如果你的控制周期只有 50μs,那这个方法就不太合适了。这时候还是老老实实用三值逻辑法,只有加减法和比较,快得多。

4.4 避坑指南:我踩过的三个坑

扇区判断看起来简单,但实际项目中容易出问题。我分享几个亲身经历:

  • 坑一:Vα 和 Vβ 的符号搞反了。 有一次我调试新板子,电机死活转不起来。查了半天,发现是 ADC 采样回来的电流方向反了,导致 Park 变换后的 Vα 和 Vβ 符号全反。扇区判断自然全错。后来我养成了一个习惯:先在开环模式下给一个固定角度,看电机能不能转到对应位置,确认坐标变换没问题。
  • 坑二:边界情况处理不当。 当目标矢量正好落在扇区边界上(比如正好 60°),判断结果可能会在相邻扇区间来回跳。这会导致输出电压抖动。我的做法是加一个小的滞回区间,比如在边界 ±1° 范围内保持上一次的扇区结果。
  • 坑三:浮点运算精度问题。 在定点 MCU 上,Vref1、Vref2、Vref3 的计算结果可能因为舍入误差导致符号判断错误。我建议用 Q15 或 Q24 格式做定点运算,并且给比较器加一个很小的死区(比如 0.001),避免零值附近误判。

4.5 扇区判断的工程实现对比

最后,我把两种方法放在一起对比一下,方便你选型:

对比项三值逻辑法直接角度法
计算量低(加减法 + 比较)高(需要 atan2)
代码可读性一般,需要查表高,直观易懂
适用场景低端 MCU,控制周期短高端 MCU,或调试阶段
边界稳定性较好(符号比较稳定)需要额外处理滞回
我的推荐量产项目首选调试和教学首选