第3章:Clark变换——三相坐标系到两相静止坐标系

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

说实话,很多初学者一上来就被这三个坐标系搞晕了。什么三相、两相静止、两相旋转,听着就头大。但你别怕,Clark变换其实是最简单的一个。它就是把电机里那三根线的电流,投影到一个平面上来。

3.1 为什么要做Clark变换?

你想想看,电机里有三根相线——U、V、W。这三相电流是互差120°的正弦波。但问题是,我们控制电机时,更习惯用直角坐标系来思考。比如“我想让转子往东转”,这在直角坐标系里很好描述,但在三相坐标系里就很别扭。

Clark变换干的事,就是把三相电流(Ia, Ib, Ic)映射到两相静止坐标系(Iα, Iβ)上。说白了,就是坐标投影。

核心思想:三相电流在空间上合成一个旋转磁动势。这个磁动势可以用两个正交的轴(α轴和β轴)来描述。只要这两个轴上的电流合成效果和三相一样,那电机转起来就没区别。

3.2 数学推导——从三相到两相

咱们先看公式。假设三相电流为:

Ia = Im * cos(θ)
Ib = Im * cos(θ - 120°)
Ic = Im * cos(θ + 120°)

Clark变换的公式是:

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

等等,你是不是觉得奇怪?为什么Iα直接等于Ia?

嗯,这里有个约定俗成的做法。我们把α轴和A相轴对齐。这样Ia在α轴上的投影就是它本身。而β轴垂直于α轴,所以需要把Ib和Ic投影过来。

完整的推导过程是这样的:

  1. 三相电流在空间上互差120°,构成一个三相对称系统。
  2. 我们想要一个两相正交系统(α-β),使得合成磁动势相同。
  3. 根据磁动势等效原则,列出投影方程。
  4. 解方程得到变换矩阵。

最终的标准形式(等幅值变换)是:

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

或者写成矩阵形式:

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

个人经验:我刚开始做FOC时,一直纠结用等幅值变换还是等功率变换。后来发现,在电流环里用等幅值变换更方便,因为电流采样值直接对应物理值。等功率变换多用于功率计算场景。你如果刚开始做,建议先用等幅值,不容易出错。

3.3 代码实现——C语言版

理论讲完了,咱们直接上代码。这是我在STM32上跑过的实现:

typedef struct {
    float Ialpha;
    float Ibeta;
} Clark_Output;

Clark_Output Clark_Transform(float Ia, float Ib, float Ic) {
    Clark_Output out;
    
    // 等幅值Clark变换
    out.Ialpha = Ia;
    out.Ibeta = (Ia + 2.0f * Ib) / 1.7320508f;  // 1.7320508 = √3
    
    return out;
}

你看,代码就这么几行。但有几个坑我得提醒你:

避坑指南:我曾经在一个项目里直接用float算除法,结果发现每次变换都有微小误差。后来改成查表法,把1/√3预先算好存成常量。虽然现在MCU算力强了,但做批量产品时,能省一点是一点。

如果你用的是带FPU的MCU(比如STM32F4系列),直接用浮点除法也没问题。但如果是M0内核,建议用定点数实现:

// 定点数版本,Q15格式
int16_t Ialpha_q15, Ibeta_q15;
int16_t Ia_q15, Ib_q15, Ic_q15;

Ialpha_q15 = Ia_q15;
// 注意:这里需要做饱和处理,防止溢出
Ibeta_q15 = (Ia_q15 + 2 * Ib_q15) * 18919 >> 15;  // 18919 ≈ 32768/√3

3.4 实际项目中的注意事项

做Clark变换时,有几个细节你一定要注意:

  • 电流采样顺序:我习惯先采U相和V相,W相通过Ia+Ib+Ic=0算出来。这样少用一个ADC通道,但要注意三相平衡时才能这么干。
  • 零点漂移:ADC采样会有偏置。我一般在初始化时采100次取平均,把这个偏置减掉。不然Clark变换出来的Iα、Iβ会有直流分量,导致电机发热。
  • 数值范围:变换后的Iα、Iβ最大值是Ia的1.15倍左右。做定点数时要留够裕量,不然会溢出。

核心总结:Clark变换就是把三相电流投影到两相静止坐标系。公式简单,但实现时要注意采样精度和数值范围。做好这一步,后面的Park变换才能准确。

3.5 验证方法

写完代码怎么验证?我教你一个土办法:

  1. 给Ia、Ib、Ic输入三相对称正弦波(比如Ia=1.0, Ib=-0.5, Ic=-0.5)。
  2. 看Iα是不是等于Ia,Iβ是不是等于0。
  3. 如果Iβ不为0,说明你的变换矩阵有问题。

这个方法我在调试时用了无数次,百试百灵。

好了,Clark变换就讲到这里。下一章咱们讲Park变换,把静止的α-β坐标系转到旋转的d-q坐标系。那才是FOC的精髓所在。