第二章:Clark变换(3相→2相)——数学推导、物理意义、代码实现

好,咱们正式开始FOC的第一场硬仗——Clark变换。

很多人一上来就被αβ坐标系搞晕了。其实没那么复杂。说白了,Clark变换就是把电机里那三根线的电流,投影到两个互相垂直的轴上去。为什么要这么干?因为三相系统不好算,两相系统好算。就这么简单。

2.1 为什么要做Clark变换?

你想想看,电机里通的是三相正弦电流。三个相位差120°,在空间上转来转去。你要是直接拿这三个电流去算力矩,那公式长得能写满一页纸。

但如果我们换个角度——把这三个电流投影到两个垂直的轴上,一个叫α轴,一个叫β轴。那问题就变成了:一个旋转的矢量,在两个固定轴上的分量。嗯,这就好办多了。

我个人习惯把Clark变换看作是「降维打击」。从3维降到2维,计算量直接砍掉三分之一。我在做第一个FOC项目时,用的还是老掉牙的DSP,算力捉襟见肘。Clark变换帮我省了不少时钟周期。

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

先看公式。假设三相电流分别是ia、ib、ic,且满足ia + ib + ic = 0(星形接法无中线)。

Clark变换的数学表达式:

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

等等,有人会问:为什么iα直接等于ia

这里有个约定俗成的做法:我们把α轴和A相绕组对齐。所以A相电流在α轴上的投影就是它自己。B相和C相呢?它们和α轴有120°夹角,投影过去要乘个cos120° = -1/2。

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

iα = ia·cos(0°) + ib·cos(120°) + ic·cos(240°)
    = ia + ib·(-1/2) + ic·(-1/2)
    = ia - (ib + ic)/2

iβ = ia·sin(0°) + ib·sin(120°) + ic·sin(240°)
    = 0 + ib·(√3/2) + ic·(-√3/2)
    = (√3/2)·(ib - ic)

再利用ia + ib + ic = 0,可以化简成最常用的形式:

变量 表达式 说明
iα ia α轴与A相重合
iβ (ia + 2·ib) / √3 利用三相平衡化简

重要提醒:上面这个简化形式只适用于三相平衡系统。如果电机有中线或者三相不平衡,必须用完整的变换矩阵。

2.3 物理意义——到底在干什么?

Clark变换的物理意义,我打个比方你就懂了。

想象你站在一个十字路口。三相电流就像是三条不同方向的路,每条路上都有车流。你要统计整个路口的车流量,总不能三条路分别算吧?

Clark变换就是给你两个新的方向——南北方向和东西方向。你把三条路上的车流,投影到这两个方向上。这样你只需要看两个数字,就知道整个路口的交通状况了。

在电机里,αβ坐标系就是这两个方向。α轴和A相绕组对齐,β轴超前α轴90°。三相电流合成一个旋转的磁动势矢量,它在αβ轴上的投影,就是Clark变换的结果。

我的经验:调试时我习惯先看iα和iβ的波形。如果它们是两个相位差90°的正弦波,说明Clark变换做对了。如果波形有畸变,先检查电流采样,再检查变换系数。

2.4 等幅值变换 vs 等功率变换

这里有个坑,我当年踩过。

Clark变换有两种常用的系数约定:

类型 变换系数 特点
等幅值变换 2/3 变换前后矢量幅值不变
等功率变换 √(2/3) 变换前后功率不变

等幅值变换:变换后的αβ电流幅值,和三相电流幅值一样。比如三相电流幅值是1A,那iα和iβ的幅值也是1A。好处是直观,调试时容易对应。

等功率变换:变换前后功率守恒。但αβ电流的幅值会变成三相电流幅值的√(3/2)倍。嗯,算起来麻烦一点。

我曾经踩过的坑:在一个项目中,我用了等幅值变换,但PI调节器的参数是按等功率变换算的。结果电流环一直调不稳,折腾了两天才发现是系数不匹配。所以,一定要在整个系统中统一用一种变换,混用会出大问题。

我个人习惯用等幅值变换。为什么?因为调试时方便。我用示波器看电流波形,幅值直接对应,不用心里再乘个系数。而且FOC里最终要的是力矩,力矩和电流幅值成正比,等幅值变换更直观。

2.5 代码实现——C语言版

好了,理论说完了,上代码。这是我在STM32上实际跑过的代码:

/**
 * @brief Clark变换,等幅值变换
 * @param ia A相电流
 * @param ib B相电流
 * @param ic C相电流(可省略,由三相平衡计算)
 * @param iα α轴电流(输出)
 * @param iβ β轴电流(输出)
 */
void clark_transform(float ia, float ib, float *iα, float *iβ)
{
    // 如果只有两相采样,第三相由平衡条件算出
    // ic = -ia - ib;
    
    // 等幅值Clark变换
    *iα = ia;
    *iβ = (ia + 2.0f * ib) / 1.7320508f;  // 1.7320508 = √3
    
    // 如果是等功率变换,用下面这行:
    // *iα = 0.81649658f * ia;  // 0.81649658 = √(2/3)
    // *iβ = 0.81649658f * (ia + 2.0f * ib) / 1.7320508f;
}

这段代码有几个要点:

  • 只用两相采样:实际项目中,为了省钱,经常只采样两相电流。第三相用ia + ib + ic = 0算出来。但要注意,如果采样有噪声,算出来的第三相误差会放大。
  • √3用常数:1.7320508是√3的近似值。不要在循环里算sqrt(3),太慢了。直接写常数。
  • 浮点运算:如果MCU没有FPU,可以考虑用Q格式定点数。但现在的MCU基本都有FPU,直接用float就行。

避坑指南:我曾经在一个项目中,电流采样有直流偏置。Clark变换后,iα和iβ波形上叠加了一个直流分量,导致后面Park变换出来的d轴电流一直不为零。后来加了高通滤波器才解决。所以,采样前一定要做好偏置校准

2.6 逆Clark变换

有正变换就有逆变换。逆Clark变换用于从αβ坐标系回到三相坐标系,比如在SVPWM调制时要用到。

/**
 * @brief 逆Clark变换,等幅值变换
 */
void inv_clark_transform(float iα, float iβ, float *ia, float *ib, float *ic)
{
    *ia = iα;
    *ib = -0.5f * iα + 0.8660254f * iβ;   // 0.8660254 = √3/2
    *ic = -0.5f * iα - 0.8660254f * iβ;
}

注意看,逆变换的系数和正变换不一样。正变换里iβ的分母有√3,逆变换里没有。这是因为变换矩阵不是正交的(等幅值变换下),所以逆矩阵要重新算。

2.7 小结

Clark变换,说白了就是坐标投影。把三相电流投影到两个垂直的轴上。数学上不复杂,但物理意义很重要——它把三相旋转磁场,变成了两相静止坐标系下的矢量。

嗯,这一章就到这里。下一章我们讲Park变换,把静止的αβ坐标系,转到旋转的dq坐标系。那才是FOC的核心。

记住三个关键点:

  1. Clark变换是降维,从3相到2相
  2. 等幅值和等功率变换,选一种并坚持用到底
  3. 代码实现时注意采样偏置和系数精度

好,动手试试吧。拿一组三相电流数据,手算一遍Clark变换,再跑一遍代码。你会发现,其实没那么神秘。