3. 坐标变换(上):Clark变换原理与公式推导,从三相静止到两相静止

各位同学,欢迎来到FOC实战课的第三讲。

今天咱们聊一个绕不开的话题——Clark变换。说白了,就是把电机里那三根 messy 的交流信号,变成两路干干净净的正交信号。我当年刚接触FOC时,觉得这步就是纯数学游戏,直到在项目里被电流噪声折磨得死去活来,才真正体会到Clark变换的妙处。

3.1 为什么要做坐标变换?

先问大家一个问题:你手头有一个三相永磁同步电机,三个绕组通的是正弦电流。你想控制扭矩,怎么办?

直接控制三相电流?可以,但很麻烦。因为三相电流是耦合的,A相电流变了,B相和C相也会跟着变。你想想看,这就像同时拉三根绳子,想控制其中一根的方向,另外两根也会动。

所以我们需要一个“解耦”的过程。

Clark变换就是第一步。它把三相静止坐标系(abc轴)下的电流,映射到两相静止坐标系(αβ轴)下。这样一来,三个变量变成了两个变量,而且这两个变量是正交的,互不影响。

核心思想: 三相系统 → 两相系统,变量减少,控制简化。

3.2 Clark变换的几何直觉

咱们从几何角度理解一下。

三相坐标系里,三个轴互差120°。两相坐标系里,两个轴互差90°。你想想看,是不是有点像把一个等边三角形,硬生生掰成了一个直角坐标系?

嗯,就是这个意思。

我个人的习惯是,先画个图,把三个轴和两个轴的位置关系搞清楚。这样公式推导起来才不会晕。

三相静止 → 两相静止 坐标关系图 A B C α β O 120° (重合) A相 B相 C相 α/β轴

从图上可以看到,α轴和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变换是如何为后面的扭矩解耦铺路的。


专注资料整理