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

好,咱们进入正题。上一章聊了聊FOC的整体框架,说白了就是怎么把电机控制得服服帖帖。这一章,我们来啃第一块硬骨头——Clark变换

你可能会问:好好的三相电流,为什么要折腾成两相?

嗯,这个问题我当年也困惑过。后来在项目里调试一个风机驱动板,三相电流波形乱七八糟,用示波器一看,相位差120°没错,但控制起来就是别扭。后来才明白——三相系统在数学上不好处理。你想想看,三个变量互相耦合,PID调起来跟解九连环似的。

Clark变换就是干这个的。它把三相静止坐标系(a, b, c)下的物理量,映射到两相静止坐标系(α, β)下。这样一来,三个变量变成两个,而且α轴和β轴是正交的,解耦了。

3.1 为什么要做Clark变换?

我个人的理解是这样的:

  • 简化计算:三相电流ia、ib、ic加起来等于零(星形接法),实际上只有两个独立变量。Clark变换正好利用这一点。
  • 为Park变换铺路:Park变换需要两相正交的输入,Clark变换就是那个“预处理”步骤。
  • 便于观察:α-β坐标系下的电流波形是正弦波,比三相的“三胞胎”波形直观多了。

核心思想:Clark变换不改变信号的频率和幅值,只是换了个坐标系来看问题。就像你从正面看一个人,和从侧面看,人还是那个人,但视角变了。

3.2 数学推导——其实没那么可怕

咱们先看公式。假设三相电流为ia、ib、ic,那么Clark变换的数学表达式是:

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

等等,你是不是觉得少了点什么?ic去哪了?

别急。因为ia + ib + ic = 0,所以ic = -ia - ib。代入进去化简,就得到上面这个简洁的形式。我在项目里手算过好几次,确认无误。

写成矩阵形式更清楚:

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

这里多了一个i0分量,叫零序分量。对于星形接法且三相平衡的系统,i0 = 0。但如果你做的是三相四线制系统,或者电机有中性点引出,那i0就不能忽略了。

我的经验:在实际嵌入式代码里,我通常只算iα和iβ,i0直接忽略。因为大多数无刷电机都是星形接法,中性点不引出。省一个计算步骤,MCU的算力就多一分。

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

这里有个坑,我当年踩过。Clark变换有两种常见形式:等幅值变换等功率变换

类型 变换矩阵系数 特点 常见应用
等幅值变换 2/3 变换前后幅值不变 电流环控制、SVPWM
等功率变换 √(2/3) 变换前后功率不变 功率计算、能量分析

我个人习惯用等幅值变换。为什么?因为做SVPWM时,电压矢量的幅值直接对应到逆变器的占空比,用等幅值变换算出来的结果更直观。你想想看,如果幅值变了,调试的时候还得心里换算一遍,多麻烦。

注意:如果你在代码里用了等功率变换,后面Park变换和SVPWM的系数也要相应调整。我曾经在一个项目里混用了两种变换,结果电机转起来嗡嗡响,电流波形像锯齿。查了两天才发现是系数不匹配。

3.4 代码实现——手把手教你写

好了,理论说完了,咱们上代码。这是我在STM32F4上用的Clark变换函数:

typedef struct {
    float i_alpha;
    float i_beta;
} clark_output_t;

clark_output_t clark_transform(float ia, float ib, float ic) {
    clark_output_t out;
    
    // 等幅值变换,忽略零序分量
    out.i_alpha = ia;
    out.i_beta  = (ia + 2.0f * ib) * 0.577350269f;  // 1/√3 ≈ 0.57735
    
    return out;
}

你看,代码就这么几行。但有几个细节要注意:

  • 输入顺序:我习惯先读ia和ib,ic通过计算得到。但如果你ADC采样了三相电流,直接传进来也行。
  • 浮点精度:1/√3这个系数,我建议用常量定义,别每次算。省点CPU周期。
  • 饱和处理:如果电流采样有噪声,输出可能会超出ADC范围。我一般会在后面加个限幅。

避坑指南:我曾经在代码里直接用1.0f / sqrtf(3.0f),结果每次调用都算一遍开方,CPU负载直接飙到30%。后来改成预计算常量,负载降到5%以下。嗯,这种细节往往决定项目成败。

3.5 仿真验证——眼见为实

光说不练假把式。咱们用MATLAB/Simulink搭个模型看看效果。

假设三相电流为:

  • ia = 5 * sin(ωt)
  • ib = 5 * sin(ωt - 120°)
  • ic = 5 * sin(ωt + 120°)

经过Clark变换后,iα和iβ的波形应该是:

  • iα = 5 * sin(ωt)
  • iβ = 5 * cos(ωt)

你看,iα和iβ是正交的正弦波,幅值不变(等幅值变换),相位差90°。这就是一个标准的旋转矢量在α-β平面上的投影。

我在实际项目中,会用DAC把iα和iβ输出到示波器。看到两个正交的正弦波,心里就有底了——Clark变换没写错。

3.6 小结

Clark变换是FOC的基石,说白了就是把三相问题变成两相问题。记住三点:

  1. 公式很简单,但要注意等幅值和等功率的区别。
  2. 代码实现就几行,但系数精度和计算效率要留意。
  3. 仿真验证不可少,波形对了再往下走。

下一章,咱们聊Park变换——从静止坐标系到旋转坐标系。到时候你会发现,Clark变换只是开胃菜,真正的硬菜在后面。