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 可以被消掉。我在项目中遇到过几次三相不平衡的情况(比如传感器坏了),这时候直接用这个公式就会出问题。所以实际调试时,我建议先确认一下三相电压之和是否接近零。
Clark 变换还有一种「等幅值」和「等功率」两种变体。咱们做 SVPWM 时,绝大多数资料用的都是 等幅值变换,也就是上面那个公式。等功率变换的系数不同,但扇区判断的逻辑是一样的,只是后面计算作用时间时要调整。我个人建议初学者先死磕等幅值,搞透了再去看等功率。
2.2 扇区划分规则
Clark 变换之后,我们得到了 Uα 和 Uβ。这两个量构成一个二维平面。现在问题来了:这个平面怎么切成 6 个扇区?
其实规则很直观。你看下面这张图:
六个扇区,每个占 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 看成三个「边界线」,每个扇区就是这三条线围出来的一个三角形区域。
在实际代码里,我们通常不会直接用 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 实际调试中的注意事项
理论讲完了,咱们聊聊实战中容易踩的坑。
另外,扇区判断的边界处理也要注意。当电压矢量正好落在边界上时(比如 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 的第一步,也是后续所有计算的基础。这一步搞扎实了,后面学作用时间计算、开关序列生成就会顺畅很多。下一章我们会接着讲如何计算每个扇区里两个基本矢量的作用时间,到时候会用到今天讲的扇区号。
好,今天就到这里。有问题欢迎在课程群里讨论,我看到会回复。