3、Clark变换:三相到两相静止坐标系的变换原理与数学推导

好,咱们进入FOC算法的第一个核心数学变换——Clark变换。

说实话,我刚接触FOC那会儿,看到一堆矩阵和坐标变换,头都大了。后来在项目里调了几次电机,才真正理解这东西到底在干嘛。说白了,Clark变换就是帮我们把三个缠在一起的信号,拆成两个好处理的信号。

3.1 为什么要做Clark变换?

你想想看,BLDC电机有三相绕组,电流分别是Ia、Ib、Ic。这三相电流在时间上相差120度,空间上也相差120度。三个变量互相耦合,控制起来很麻烦。

我习惯把问题简化。能不能用两个变量来描述这三个电流?

答案是可以的。因为三相电流满足一个基本约束:

Ia + Ib + Ic = 0

这个公式在电机星形接法下严格成立。三个变量,一个约束,自由度就变成了2。所以理论上,两个变量就够了。

Clark变换就是干这个的。它把三相静止坐标系(a-b-c)映射到两相静止坐标系(α-β)。

3.2 变换的几何理解

咱们先别急着看公式。我用一个直观的方式解释。

想象一下,三相坐标系就像三个轴,互成120度。两相坐标系呢,就是两个互相垂直的轴——α轴和β轴。

Clark变换要做的事,就是把三个轴上的投影,换算成两个轴上的投影。嗯,这里要注意,这个变换是线性的,所以可以用矩阵表示。

我在项目中遇到过一个问题:如果直接用等幅值变换,算出来的α-β电流幅值和三相电流幅值不一样。后来查资料才发现,Clark变换有两种主流形式——等幅值变换和等功率变换。这个后面会细说。

3.3 数学推导

好,咱们上公式。

设三相电流为:

Ia = Im · cos(ωt)
Ib = Im · cos(ωt - 120°)
Ic = Im · cos(ωt + 120°)

其中Im是电流幅值,ω是电角频率。

Clark变换的数学表达式为:

Iα = Ia
Iβ = (Ia + 2·Ib) / √3

等等,这个公式看着有点奇怪?别急,这是简化后的结果。完整的矩阵形式是这样的:

[ Iα ]   [ 1      -1/2      -1/2   ] [ Ia ]
[ Iβ ] = [ 0      √3/2     -√3/2  ] [ Ib ]
                                    [ Ic ]

这个矩阵就是Clark变换矩阵(等幅值版本)。

为什么是这个矩阵?我来拆解一下:

  • α轴:直接取Ia的方向。因为α轴和a轴重合。
  • β轴:垂直于α轴。b相和c相在β轴上的投影分别是√3/2和-√3/2。

你想想看,如果三相电流平衡,代入上面的公式,会得到什么?

Iα = Im · cos(ωt)
Iβ = Im · sin(ωt)

完美!变成了一个旋转的矢量。幅值还是Im,相位和原来一致。这就是Clark变换的妙处——把三个交流量变成了两个正交的交流量。

3.4 等幅值 vs 等功率变换

刚才提到,Clark变换有两种常见形式。我整理了一个表格,方便对比:

特性 等幅值变换 等功率变换
变换矩阵系数 2/3 √(2/3)
α-β电流幅值 等于三相幅值 等于三相幅值的√(3/2)倍
功率计算 需要乘以3/2 直接相等
常用场景 电流环控制 功率计算、仿真
我的建议:做电流环控制时,用等幅值变换更方便。因为电流采样值直接对应,调试时直观。做功率估算或系统仿真时,用等功率变换更干净。

3.5 逆Clark变换

有正变换就有逆变换。逆Clark变换把α-β电流变回三相电流:

[ Ia ]   [ 1        0      ] [ Iα ]
[ Ib ] = [ -1/2     √3/2   ] [ Iβ ]
[ Ic ]   [ -1/2    -√3/2  ]

这个在SVPWM生成时会用到。到时候你会看到,我们先把电压指令从d-q变到α-β,再用逆Clark变回三相占空比。

3.6 代码实现

讲完理论,咱们看看代码怎么写。我习惯用C语言实现,定点或浮点都可以。

// Clark变换 - 等幅值版本
// 输入: Ia, Ib, Ic (三相电流)
// 输出: Ialpha, Ibeta (两相静止坐标系电流)
void clark_transform(float Ia, float Ib, float Ic, 
                     float *Ialpha, float *Ibeta)
{
    // 利用 Ia + Ib + Ic = 0 简化计算
    // 实际只需要两相采样即可
    *Ialpha = Ia;
    *Ibeta  = (Ia + 2.0f * Ib) / 1.7320508f;  // 1/√3 ≈ 0.57735
}

// 逆Clark变换
// 输入: Ialpha, Ibeta
// 输出: Ia, Ib, Ic
void inv_clark_transform(float Ialpha, float Ibeta,
                         float *Ia, float *Ib, float *Ic)
{
    *Ia = Ialpha;
    *Ib = -0.5f * Ialpha + 0.8660254f * Ibeta;   // √3/2 ≈ 0.866
    *Ic = -0.5f * Ialpha - 0.8660254f * Ibeta;
}
注意:上面的简化版本假设三相平衡。如果电机存在直流偏置或三相不平衡,建议用完整的矩阵形式计算。我曾经在一个项目中偷懒用了简化版,结果低速时电流波形有畸变,查了半天才发现是这个问题。

3.7 实际应用中的坑

最后分享几个我在项目中踩过的坑:

  • 采样时序:Clark变换的输入是瞬时值。三相电流必须同时采样,或者至少在一个PWM周期内采样。我用过逐次采样的方法,结果引入了一个载波周期的延迟,低速性能变差。
  • 直流偏置:电流传感器有零漂。如果不做偏置校准,Clark变换后的α-β电流会有一个直流分量。这个直流分量在Park变换后会变成基频分量,导致转矩波动。
  • 数值精度:√3/2 ≈ 0.8660254,这个系数在定点实现时要注意。我一般用Q15格式,把系数放大到32768以内,避免溢出。

Clark变换看起来简单,但它是整个FOC算法的基础。基础打牢了,后面的Park变换和SVPWM才能跑得稳。下一章咱们讲Park变换,把静止的α-β坐标系转到旋转的d-q坐标系,那才是真正解耦的关键一步。