2. SVPWM 扇区判断:Clark 变换原理、扇区划分规则与数学方法

各位同学,欢迎来到第二章。上一章我们聊了 SVPWM 的整体框架,今天要啃的这块骨头,是 SVPWM 里最基础也最绕不开的一步——扇区判断。

说白了,你要想让电机转起来,首先得知道「电压矢量现在落在哪个扇区里」。不知道扇区,后面的开关管导通时序、作用时间计算全都无从谈起。我当年刚接触 SVPWM 时,觉得扇区判断不就是个数学公式嘛,套进去就完了。结果第一次调板子,电机抖得像筛糠……后来才发现,是 Clark 变换的系数搞错了。嗯,咱们今天就把这个坑填平。

2.1 为什么需要 Clark 变换?

你想想看,我们手头能直接控制的,是三相电压 Ua、Ub、Uc。但三相坐标系(abc 坐标系)有个毛病——三个轴互差 120°,计算起来很不方便。尤其是要合成一个旋转的电压矢量时,在三相坐标下算简直要命。

所以我们需要一个「翻译官」,把三相坐标转换到两相静止坐标系(αβ 坐标系)上。这个翻译官就是 Clark 变换。

Clark 变换的数学表达式很简单:

Uα = Ua
Uβ = (Ua + 2*Ub) / √3

等等,有同学可能会问:为什么 Uα 直接等于 Ua?Uc 去哪了?

这里有个前提:三相系统是平衡的,即 Ua + Ub + Uc = 0。所以 Uc 可以被消掉。我在项目中遇到过几次三相不平衡的情况(比如传感器坏了),这时候直接用这个公式就会出问题。所以实际调试时,我建议先确认一下三相电压之和是否接近零。

我的习惯: 在代码里先做一步校验——如果 |Ua+Ub+Uc| > 某个阈值(比如 0.01V),就报个警告。这能帮你省下不少排查时间。

Clark 变换还有一种「等幅值」和「等功率」两种变体。咱们做 SVPWM 时,绝大多数资料用的都是 等幅值变换,也就是上面那个公式。等功率变换的系数不同,但扇区判断的逻辑是一样的,只是后面计算作用时间时要调整。我个人建议初学者先死磕等幅值,搞透了再去看等功率。

2.2 扇区划分规则

Clark 变换之后,我们得到了 Uα 和 Uβ。这两个量构成一个二维平面。现在问题来了:这个平面怎么切成 6 个扇区?

其实规则很直观。你看下面这张图:

SVPWM 六扇区划分示意图 扇区 I 扇区 II 扇区 III 扇区 IV 扇区 V 扇区 VI α β 0° 60° 120° 180° 240° 300° 说明:六个扇区各占 60°,从 α 轴正方向开始逆时针编号。每个扇区对应一对基本电压矢量。

六个扇区,每个占 60°,从 α 轴正方向开始逆时针编号。扇区 I 是 0°~60°,扇区 II 是 60°~120°,以此类推。

为什么是 6 个?因为三相逆变器有 6 个开关管,可以组合出 6 个非零电压矢量和 2 个零矢量。这 6 个非零矢量正好把平面切成 6 份。你想想看,如果只有 4 个矢量,那就只能切 4 份,但那样合成的电压矢量精度就不够了。

2.3 扇区判断的数学方法

好了,现在我们有 Uα 和 Uβ,也知道扇区怎么划分的。接下来就是怎么用数学公式判断当前矢量落在哪个扇区。

最直接的方法:算角度。用 atan2(Uβ, Uα) 求出角度,然后看它在哪个区间。但这种方法在嵌入式里不推荐——反正切函数计算量太大,而且有精度问题。

我更喜欢用 三值判断法。这个方法只需要加减法和比较运算,快得很。

具体做法是定义三个中间变量:

B1 = Uβ
B2 = (√3/2) * Uα - (1/2) * Uβ
B3 = -(√3/2) * Uα - (1/2) * Uβ

然后根据这三个值的正负,查表得到扇区号:

B1 B2 B3 扇区号
> 0 > 0 < 0 I
> 0 < 0 < 0 II
> 0 < 0 > 0 III
< 0 < 0 > 0 IV
< 0 > 0 > 0 V
< 0 > 0 < 0 VI

你看,这个表其实是有规律的。B1 的正负决定了矢量是在上半平面还是下半平面。B2 和 B3 进一步细分。我刚开始学的时候,觉得这个表好难记。后来发现一个窍门:把 B1、B2、B3 看成三个「边界线」,每个扇区就是这三条线围出来的一个三角形区域。

核心要点: 扇区判断的本质,就是判断电压矢量在三条边界线的哪一侧。三条线把平面分成 6 个三角形,每个三角形对应一个扇区。

在实际代码里,我们通常不会直接用 B1、B2、B3 的正负来查表,而是把它们编码成一个数字:

// 伪代码示例
N = 0;
if (B1 > 0) N |= 1;
if (B2 > 0) N |= 2;
if (B3 > 0) N |= 4;

// 然后查表
sector = lookup[N];

这个 lookup 表长这样:

N 1 2 3 4 5 6
扇区 II VI I IV III V

为什么 N 值和扇区号不是一一对应的?因为编码方式不同。这个表是经过推导的,你直接用就行。我曾经试着自己推导一遍,花了一个下午,但搞完之后对 SVPWM 的理解深了一个层次。建议有时间的同学也试试。

2.4 实际调试中的注意事项

理论讲完了,咱们聊聊实战中容易踩的坑。

我曾经踩过的坑: 第一次调 SVPWM 时,扇区判断总是跳变。查了半天,发现是 Clark 变换里用了浮点运算,而我的 MCU 没有 FPU,导致 Uα 和 Uβ 的计算有延迟。后来改用 Q15 定点数,问题就解决了。所以如果你的 MCU 性能一般,建议用定点数实现 Clark 变换和扇区判断。

另外,扇区判断的边界处理也要注意。当电压矢量正好落在边界上时(比如 B1=0),理论上可以归到相邻的任意一个扇区。但实际中,由于浮点误差,很少会出现精确等于 0 的情况。如果你发现扇区在边界附近频繁跳变,可以加一个小的滞回区间:

// 滞回处理示例
#define HYSTERESIS 0.001

if (B1 > HYSTERESIS) {
    // 正
} else if (B1 < -HYSTERESIS) {
    // 负
} else {
    // 保持上一状态
}

这个方法我在一个伺服驱动项目里用过,效果很好。电机在过零点附近不再抖动了。

2.5 本章小结

来,咱们捋一下今天的内容:

  • Clark 变换:把三相坐标转到两相静止坐标,公式很简单,但要注意平衡条件。
  • 扇区划分:6 个扇区,各占 60°,由 6 个非零电压矢量界定。
  • 扇区判断:用三值判断法,算 B1、B2、B3,查表得扇区号。避免用反正切。
  • 实战注意:定点数实现、滞回处理、边界条件。

扇区判断是 SVPWM 的第一步,也是后续所有计算的基础。这一步搞扎实了,后面学作用时间计算、开关序列生成就会顺畅很多。下一章我们会接着讲如何计算每个扇区里两个基本矢量的作用时间,到时候会用到今天讲的扇区号。

好,今天就到这里。有问题欢迎在课程群里讨论,我看到会回复。