3. 坐标变换(上):Clark变换原理与公式推导,从三相静止到两相静止
各位同学,欢迎来到FOC实战课的第三讲。
今天咱们聊一个绕不开的话题——Clark变换。说白了,就是把电机里那三根 messy 的交流信号,变成两路干干净净的正交信号。我当年刚接触FOC时,觉得这步就是纯数学游戏,直到在项目里被电流噪声折磨得死去活来,才真正体会到Clark变换的妙处。
3.1 为什么要做坐标变换?
先问大家一个问题:你手头有一个三相永磁同步电机,三个绕组通的是正弦电流。你想控制扭矩,怎么办?
直接控制三相电流?可以,但很麻烦。因为三相电流是耦合的,A相电流变了,B相和C相也会跟着变。你想想看,这就像同时拉三根绳子,想控制其中一根的方向,另外两根也会动。
所以我们需要一个“解耦”的过程。
Clark变换就是第一步。它把三相静止坐标系(abc轴)下的电流,映射到两相静止坐标系(αβ轴)下。这样一来,三个变量变成了两个变量,而且这两个变量是正交的,互不影响。
核心思想: 三相系统 → 两相系统,变量减少,控制简化。
3.2 Clark变换的几何直觉
咱们从几何角度理解一下。
三相坐标系里,三个轴互差120°。两相坐标系里,两个轴互差90°。你想想看,是不是有点像把一个等边三角形,硬生生掰成了一个直角坐标系?
嗯,就是这个意思。
我个人的习惯是,先画个图,把三个轴和两个轴的位置关系搞清楚。这样公式推导起来才不会晕。
从图上可以看到,α轴和A轴是重合的。β轴则垂直于α轴。这就是Clark变换的几何基础——把三个轴投影到两个轴上。
3.3 公式推导:从三相到两相
好,现在咱们来推公式。
假设三相电流为 iA、iB、iC。它们满足:
iA + iB + iC = 0
这是三相平衡系统的特点。记住这个条件,后面会用到。
我们要找的是 α 轴和 β 轴上的电流 iα 和 iβ。
根据投影关系:
- iα 是三相电流在 α 轴上的投影之和
- iβ 是三相电流在 β 轴上的投影之和
具体来说:
iα = iA · cos(0°) + iB · cos(120°) + iC · cos(240°)
iβ = iA · sin(0°) + iB · sin(120°) + iC · sin(240°)
代入三角函数值:
cos(0°) = 1, cos(120°) = -1/2, cos(240°) = -1/2
sin(0°) = 0, sin(120°) = √3/2, sin(240°) = -√3/2
得到:
iα = iA - (1/2) · iB - (1/2) · iC
iβ = 0 + (√3/2) · iB - (√3/2) · iC
嗯,到这里公式已经出来了。但注意,这个变换不是等幅值的。什么意思?
小提示: 上面推导的变换是“等功率变换”的一种形式。如果要做“等幅值变换”,需要在前面乘以系数 2/3。
3.4 等幅值 vs 等功率变换
这里有个坑,我当年踩过。
Clark变换有两种常见形式:等幅值变换和等功率变换。区别在于变换矩阵前面的系数。
| 变换类型 | 变换矩阵(前两行) | 特点 |
|---|---|---|
| 等幅值 | 系数 = 2/3 | 变换后幅值与原始幅值相同 |
| 等功率 | 系数 = √(2/3) | 变换前后功率不变 |
我个人习惯用等幅值变换。为什么?因为调试时方便。你给电机通1A电流,变换后αβ电流的幅值也是1A,直观。等功率变换虽然数学上更优雅,但调试时多一个系数,容易算错。
等幅值Clark变换的完整公式:
i_α = (2/3) * [ i_A - (1/2)*i_B - (1/2)*i_C ]
i_β = (2/3) * [ 0 + (√3/2)*i_B - (√3/2)*i_C ]
写成矩阵形式:
[ i_α ] [ 1 -1/2 -1/2 ] [ i_A ]
[ i_β ] = [ 0 √3/2 -√3/2 ] [ i_B ] * (2/3)
[ i_C ]
3.5 实际项目中的注意事项
讲完理论,聊聊实战。
我曾经在一个伺服驱动器项目里,发现电机低速运行时抖动得厉害。查了半天,最后发现是Clark变换里用了等功率变换,而电流环的PI参数是按等幅值调的。系数不匹配,导致控制量计算错误。
从那以后,我养成了一个习惯:在代码开头用宏定义明确标注变换类型。
// 明确标注:使用等幅值Clark变换
#define CLARK_SCALE (2.0f/3.0f)
void clark_transform(float i_a, float i_b, float i_c, float *i_alpha, float *i_beta) {
*i_alpha = CLARK_SCALE * (i_a - 0.5f * i_b - 0.5f * i_c);
*i_beta = CLARK_SCALE * (0.8660254f * i_b - 0.8660254f * i_c);
// 0.8660254 = sqrt(3)/2
}
避坑指南: 我曾经见过有人把 i_C 直接忽略,认为 i_C = -i_A - i_B 就可以少采一路电流。理论上没错,但如果ADC采样有噪声或偏移,这个误差会直接带入变换结果。建议三路都采,或者至少做一次校验。
3.6 反Clark变换
有正变换就有反变换。当你从αβ轴算出了想要的电压,需要再变回三相电压去驱动电机。
反Clark变换公式(等幅值):
v_A = v_α
v_B = -0.5 * v_α + 0.8660254 * v_β
v_C = -0.5 * v_α - 0.8660254 * v_β
注意,这里没有系数 2/3 了。因为正变换乘了 2/3,反变换就不需要再乘。这样才能保证“变过去,再变回来”是恒等的。
3.7 小结
Clark变换,说白了就是给三相电流“降维”。从三个纠缠不清的变量,变成两个正交的变量。这是FOC控制链的第一步,也是最基础的一步。
记住几个关键点:
- α轴与A轴重合,β轴超前α轴90°
- 等幅值变换用系数 2/3,等功率变换用 √(2/3)
- 实际项目中,建议统一用一种变换,并在代码中明确标注
- 反变换不要忘记,正反变换系数要匹配
下一讲,我们会在这个基础上,继续推导Park变换——从两相静止到两相旋转。到时候你就能看到,Clark变换是如何为后面的扭矩解耦铺路的。