3. Clark变换:从三相静止坐标系到两相静止坐标系
好,咱们进入SVPWM的第一个数学工具——Clark变换。
你可能会问:明明有三相电压,为什么要折腾成两相?
我当年刚接触这个的时候也有同样的疑惑。后来在调试一台电机驱动器时,发现三相电流波形看着乱糟糟的,根本没法直接用来做控制。那时候我才真正理解——三相系统虽然物理上存在,但数学上太冗余了。
Clark变换,说白了就是把三个轴(A、B、C)投影到两个轴(α、β)上。这样既保留了全部信息,又让计算量减半。
核心思想:三相系统是线性相关的(A + B + C = 0),所以两相足以描述全部状态。
3.1 从物理绕线到数学坐标
先看看电机的物理结构。定子上有三组绕组,空间上互差120°。这就是三相静止坐标系——也叫ABC坐标系。
我想让你想象一个场景:你站在电机中心,看向A相绕组的方向。B相在你左边120°,C相在右边120°。三个轴在一个平面上,但彼此不垂直。
不垂直的坐标系,做数学运算很麻烦。你想想看,要算一个矢量在三个轴上的分量,得解三个方程。但如果换成两个互相垂直的轴(α轴和β轴),那就简单多了——直接用三角函数投影就行。
Clark变换就是干这个的:把120°夹角的三个轴,映射到90°夹角的两个轴上。
我的习惯:α轴通常与A轴对齐,β轴超前α轴90°。这样投影公式最简洁,也最容易记忆。
3.2 公式推导:从三相到两相
推导其实不复杂。我们设三相电压为 \(V_A\)、\(V_B\)、\(V_C\),它们在空间中的方向向量分别是:
- A轴:角度0°,单位向量 (1, 0)
- B轴:角度120°,单位向量 (-1/2, √3/2)
- C轴:角度240°,单位向量 (-1/2, -√3/2)
那么,合成矢量在α-β坐标系下的分量,就是三个向量投影的叠加:
Vα = V_A · 1 + V_B · (-1/2) + V_C · (-1/2)
Vβ = V_A · 0 + V_B · (√3/2) + V_C · (-√3/2)
写成矩阵形式:
| Vα | | 1 -1/2 -1/2 | | V_A |
| | = | | | |
| Vβ | | 0 √3/2 -√3/2 | | V_B |
| V_C |
这就是等幅值Clark变换。注意,这里没有系数2/3——我们后面会讲到为什么要加它。
我曾经踩过的坑:一开始我搞混了等幅值和等功率两种变换。在SVPWM里,我们用的是等幅值变换,因为调制波要和载波比较,幅值必须对应上。如果你用了等功率变换,调制比会算错,输出波形会畸变。
3.3 等幅值 vs 等功率:到底用哪个?
这个问题我当年纠结了好几天。两种变换的系数不同,但都能用。区别在于:
| 变换类型 | 变换矩阵系数 | 幅值关系 | 功率关系 | SVPWM中是否常用 |
|---|---|---|---|---|
| 等幅值 | 无额外系数(或2/3) | Vα_max = V_A_max | P_αβ = 2/3 · P_ABC | 是(推荐) |
| 等功率 | √(2/3) | Vα_max = √(2/3) · V_A_max | P_αβ = P_ABC | 较少 |
我个人习惯用等幅值变换。原因很简单:在SVPWM里,我们需要知道合成矢量的幅值是否超过了直流母线电压。如果用等功率变换,幅值被压缩了,你还得再乘一个系数才能判断过调制,多了一步麻烦事。
等功率变换在功率计算时方便,但SVPWM的核心是电压矢量的合成与限幅,不是功率计算。所以——选等幅值,没错。
3.4 加入系数2/3:让幅值真正相等
你可能会发现,上面推导的公式里,Vα的表达式是 V_A - 1/2 V_B - 1/2 V_C。如果三相平衡(V_A + V_B + V_C = 0),那么Vα = 3/2 V_A。
也就是说,变换后的α分量幅值是原来A相幅值的1.5倍。这就不叫“等幅值”了。
所以,我们需要在变换矩阵前面乘一个系数2/3:
| Vα | 2 | 1 -1/2 -1/2 | | V_A |
| | = - | | | |
| Vβ | 3 | 0 √3/2 -√3/2 | | V_B |
| V_C |
这样,当三相平衡时,Vα = V_A,幅值就相等了。
记忆技巧:2/3这个系数,你可以理解为“把三个轴的能量平均到两个轴上”。三相各贡献1/3,两相各分到1/2,所以是 (1/2) / (1/3) = 3/2 的倒数,即2/3。
3.5 逆变换:从两相回到三相
有时候我们需要把α-β坐标系的结果变回ABC坐标系,比如在生成PWM占空比时。逆变换公式也很简单:
| V_A | | 1 0 | | Vα |
| V_B | = | -1/2 √3/2 | | |
| V_C | | -1/2 -√3/2 | | Vβ |
注意,逆变换没有系数2/3。因为正变换已经缩放了,逆变换只需要把投影关系还原回去就行。
我记得第一次手算这个逆变换时,算完发现V_A + V_B + V_C = 0,心里踏实了不少——说明变换是自洽的。
3.6 Clark变换的物理意义:降维但不丢信息
Clark变换的本质,是坐标系的旋转与投影。它没有改变矢量的物理含义,只是换了一个更方便的观察角度。
你可以这样理解:
- ABC坐标系:三个观察者,各看各的方向
- α-β坐标系:两个观察者,互相垂直,视野更清晰
信息有没有丢失?没有。因为三相系统有一个约束条件(A + B + C = 0),所以三个变量中只有两个是独立的。两相坐标系刚好容纳这两个自由度。
我在项目中遇到过一个问题:采样三相电流时,有一相传感器坏了。当时我直接用Clark变换的逆变换,从两相电流反推出第三相电流,居然还能让电机继续转。这就是降维不丢信息的好处。
关键结论:Clark变换是SVPWM的数学基础。它把120°的三相系统,映射到90°的两相系统,为后续的矢量合成和扇区判断铺平了道路。
3.7 知识体系:Clark变换在SVPWM中的位置
下面这张图展示了Clark变换在整个SVPWM流程中的位置。你可以看到,它是从三相物理量到矢量空间的“第一道门”。
3.8 代码实现:C语言版Clark变换
理论讲完了,咱们看看代码怎么写。下面是一个标准的等幅值Clark变换实现:
/**
* @brief Clark变换:三相ABC → 两相αβ
* @param Va A相电压
* @param Vb B相电压
* @param Vc C相电压
* @param Vα 输出α轴分量
* @param Vβ 输出β轴分量
*/
void clark_transform(float Va, float Vb, float Vc,
float *Vα, float *Vβ)
{
// 等幅值变换,系数2/3
*Vα = (2.0f / 3.0f) * (Va - 0.5f * Vb - 0.5f * Vc);
*Vβ = (2.0f / 3.0f) * (0.0f * Va + 0.866025f * Vb - 0.866025f * Vc);
// 如果三相平衡,可以简化:
// *Vα = Va; // 因为 Va + Vb + Vc = 0
// *Vβ = 0.57735f * (Vb - Vc); // 1/√3 ≈ 0.57735
}
工程建议:在嵌入式系统中,0.866025和0.57735这些常数可以预先算好存成宏定义,避免运行时重复计算。我一般这样写:
#define SQRT3_2 0.86602540378f // √3/2
#define INV_SQRT3 0.57735026919f // 1/√3
3.9 常见问题与避坑
- 三相不平衡怎么办? Clark变换本身不要求三相平衡,但变换后的αβ分量会包含零序分量。在SVPWM中,零序分量不影响矢量合成,可以忽略。
- 采样噪声怎么处理? 我建议在Clark变换之前先做一次低通滤波,或者用均值滤波。否则噪声会被变换放大,影响后续的扇区判断。
- 浮点运算太慢怎么办? 可以用Q15或Q31定点数实现。Clark变换只有乘法和加法,定点化后效率很高。
我曾经踩过的坑:有一次我在DSP上实现Clark变换,忘了把ADC采样的原始值转换成实际电压值。结果变换出来的αβ分量全是错的,电机抖得像筛糠一样。查了两天才发现是标幺值没做。切记:变换前先归一化。