4、Clark变换:从三相电流到两相静止坐标系的数学映射

好,咱们进入FOC的第一个数学关卡——Clark变换。

很多人刚开始学FOC,看到一堆矩阵公式就头大。其实没那么复杂。Clark变换说白了就是一件事:把三个绕组的电流,变成两个垂直方向的电流。

你想想看,电机里三相绕组互差120度,控制起来很麻烦。但如果我们能找到两个互相垂直的轴,把电流投影上去,问题就简化了。这就是Clark变换的核心思想。

4.1 为什么要做这个变换?

三相电机有三个相电流:ia、ib、ic。它们之间有关系:

ia + ib + ic = 0

这意味着三个变量里只有两个是独立的。我们完全可以只用两个变量来描述同一个系统。

Clark变换就把这三个电流映射到α-β两相静止坐标系上。α轴和A相绕组对齐,β轴与α轴垂直。

关键理解:Clark变换不改变电流的频率和相位关系,只是换了一种坐标系来表达。变换前后的电流矢量是完全等价的。

我在项目中遇到过一位同事,他死活想不通为什么非要多此一举。后来我给他画了个图:三相绕组就像三个方向上的力,你很难直观看出合力方向。但换成α-β轴,力的方向一目了然。他看完就明白了。

4.2 数学公式:等幅值变换

Clark变换的数学形式很简单。我习惯用等幅值变换,因为这样变换前后电流的幅值不变,调试时更容易理解。

变换公式如下:

iα = ia
iβ = (ia + 2*ib) / √3

写成矩阵形式更清晰:

[ iα ]   [ 1,    -1/2,    -1/2   ] [ ia ]
[    ] = [                         ] [    ]
[ iβ ]   [ 0,   √3/2,   -√3/2   ] [ ib ]
                                   [ ic ]

嗯,这里要注意:公式里的系数是2/3。为什么是2/3?这是为了保持变换前后电流矢量的幅值不变。

我的习惯:做电机控制时,我永远用等幅值变换。等功率变换虽然数学上更优雅,但调试时幅值对不上,容易把人搞晕。等幅值变换更直观,尤其当你用示波器看电流波形时。

4.3 代码实现:C语言版

实际写代码时,我建议把系数提前算好,避免运行时反复计算。下面是我常用的实现:

typedef struct {
    float alpha;  // α轴电流
    float beta;   // β轴电流
} clark_t;

clark_t clark_transform(float ia, float ib, float ic) {
    clark_t result;
    
    // 预计算系数
    const float k1 = 0.5f;       // 1/2
    const float k2 = 0.866025f;  // √3/2
    const float k3 = 0.666667f;  // 2/3
    
    // Clark变换
    result.alpha = k3 * (ia - k1 * ib - k1 * ic);
    result.beta  = k3 * (k2 * ib - k2 * ic);
    
    return result;
}

如果你只用两个电流传感器(ia和ib),可以简化:

clark_t clark_transform_2sensor(float ia, float ib) {
    clark_t result;
    
    // ic = -ia - ib
    result.alpha = ia;
    result.beta  = (ia + 2.0f * ib) * 0.57735f;  // 1/√3
    
    return result;
}

我曾经踩过的坑:有一次我直接用浮点运算,没注意MCU的FPU精度。结果在电流很小时,β轴计算误差特别大,导致电机低速抖动。后来我改用Q15定点数运算,问题就解决了。如果你的MCU没有硬件浮点单元,一定要小心浮点精度问题。

4.4 变换前后的波形对比

我们来看一组实际波形数据。假设三相电流是标准的正弦波:

角度(°) ia ib ic iα iβ
0 1.00 -0.50 -0.50 1.00 0.00
30 0.87 0.00 -0.87 0.87 0.50
60 0.50 0.50 -1.00 0.50 0.87
90 0.00 0.87 -0.87 0.00 1.00
120 -0.50 1.00 -0.50 -0.50 0.87
150 -0.87 0.87 0.00 -0.87 0.50
180 -1.00 0.50 0.50 -1.00 0.00

看到规律了吗?iα和ia完全重合,iβ则滞后90度。这就是Clark变换的直观效果——把三相信号变成了两相信号,而且两相信号依然是正弦波。

4.5 Clark变换的物理意义

从物理角度看,Clark变换其实是在做空间矢量分解。

三相电流产生的合成磁动势,在空间上是一个旋转矢量。这个矢量在α轴和β轴上的投影,就是iα和iβ。换句话说:

  • iα:代表合成磁动势在A相绕组方向的分量
  • iβ:代表合成磁动势在垂直于A相方向的分量

这两个分量合在一起,完整描述了电机内部的磁场状态。

核心结论:Clark变换没有丢失任何信息。三相电流和两相电流之间是一一对应的关系。你完全可以用α-β轴电流来还原出三相电流。

4.6 常见问题与避坑

  1. 系数选择问题:等幅值和等功率变换的系数不同。如果你从网上抄代码,一定要确认用的是哪种。混用会导致电流环增益不对。
  2. 电流传感器偏置:如果传感器有直流偏置,Clark变换后α-β轴都会出现直流分量。这会导致电机产生转矩脉动。我一般会在变换前做一次高通滤波。
  3. 三相不平衡:当三相电流不平衡时,iα和iβ的波形会畸变。这时候要检查电机绕组或驱动电路是否有问题。

调试小技巧:用示波器同时观察iα和iβ,如果看到的是两个相位差90度的正弦波,说明Clark变换正确。如果波形有毛刺或不对称,先检查电流采样时序。

4.7 Clark变换的SVG流程图

下面这张图展示了Clark变换在整个FOC流程中的位置:

Clark变换在FOC中的位置 三相电流 ia, ib, ic Clark变换 3相 → 2相 α-β轴电流 iα, iβ Park 变换 Clark变换将三相静止坐标系变换到两相静止坐标系 输出 iα 和 iβ 仍然是交流量,需要后续Park变换才能变成直流量 等幅值Clark变换公式 iα = 2/3 · (ia - ½·ib - ½·ic) iβ = 2/3 · (√3/2·ib - √3/2·ic) 变换前后电流幅值保持不变 简化公式(两传感器) iα = ia iβ = (ia + 2·ib) / √3 利用 ia + ib + ic = 0 简化

从流程图可以看出,Clark变换是FOC的第一道关卡。它把三相电流转换成两相,为后续的Park变换做好准备。没有Clark变换,后面的所有计算都无从谈起。

4.8 小结

Clark变换其实不复杂。记住三点就够了:

  • 目的:把三相电流变成两相电流,简化控制
  • 方法:用固定矩阵做线性变换,保持幅值不变
  • 结果:得到α-β轴电流,仍然是交流量

我个人觉得,Clark变换是FOC里最容易理解的一步。它没有角度信息,没有反馈环路,就是一个纯粹的数学映射。只要公式写对了,结果就一定正确。