4. FOC核心原理(上):Clark变换与Park变换的数学推导与物理意义

好,咱们进入FOC最核心的数学基础部分。很多初学者看到Clark和Park变换的公式就头大,觉得这是天书。其实说白了,这两个变换就是「换坐标系」——把电机里复杂的交流量,变成我们熟悉的直流量来控制。

我当年刚接触FOC时,也花了不少时间琢磨。后来发现,只要理解了物理意义,数学推导就是个顺理成章的事。今天咱们就把这块硬骨头啃下来。

4.1 为什么要做坐标变换?

先想一个问题:三相永磁同步电机(PMSM)里,定子绕组通的是三相正弦交流电,产生的磁场是旋转的。转子本身也是个旋转的磁铁。我们要控制转矩,本质上就是控制定子磁场和转子磁场的夹角。

但在三相静止坐标系(ABC坐标系)下,这些量都是随时间正弦变化的。你想想看,用PID去跟踪一个正弦波,难度有多大?而且三个相之间还互相耦合。

核心思路: 把三相交流量,先变成两相交流量(Clark变换),再变成两相直流量(Park变换)。这样控制就简单了——像控制直流电机一样控制FOC。

我个人习惯把这两个变换比作「翻译官」:Clark把三相翻译成两相,Park把静止的两相翻译成旋转的两相。翻译完了,我们就能用熟悉的PI控制器去处理了。

4.2 Clark变换:从ABC到αβ

4.2.1 物理意义

Clark变换,也叫3s/2s变换(三相静止到两相静止)。它的目标很明确:把空间上相差120°的三个绕组,等效成空间上相差90°的两个绕组。

为什么能等效?因为电机里产生的磁动势(MMF)是矢量。三个绕组产生的合成磁动势,和两个绕组产生的合成磁动势,只要大小和方向一样,对电机来说就是一样的。

我的经验: 做Clark变换时,一定要保证变换前后的功率不变。有些教材用等幅值变换,有些用等功率变换。GD32的FOC库默认用等功率变换,这点要注意,否则算出来的电流环参数会差一个系数。

4.2.2 数学推导

假设三相电流为 ia、ib、ic,且满足 ia + ib + ic = 0(星形连接无中线)。

两相静止坐标系下的电流 iα、iβ 为:

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

写成矩阵形式:

[ 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,可以忽略。

避坑指南: 我曾经在一个项目里直接用等幅值变换的系数,结果电流环怎么调都震荡。后来发现是变换矩阵的系数不对。GD32的库用的是等功率变换,系数是√(2/3)。如果你自己写代码,一定要确认清楚。

4.2.3 代码实现

在GD32上实现Clark变换,其实就是几个乘加运算。我一般这样写:

// Clark变换:ABC -> αβ
// 输入:ia, ib, ic(三相电流采样值)
// 输出:ialpha, ibeta(两相静止坐标系电流)
void clark_transform(float ia, float ib, float ic, 
                     float *ialpha, float *ibeta)
{
    // 等功率变换,系数 sqrt(2/3)
    const float K = 0.8164965809f;  // sqrt(2/3)
    
    *ialpha = K * (ia - 0.5f*ib - 0.5f*ic);
    *ibeta  = K * (0.8660254038f*ib - 0.8660254038f*ic);
    
    // 如果系统平衡,也可以简化为:
    // *ialpha = ia;
    // *ibeta  = (ia + 2.0f*ib) / 1.7320508076f;
}

4.3 Park变换:从αβ到dq

4.3.1 物理意义

Clark变换后,我们得到了两个正交的正弦量 iα 和 iβ。它们还是随时间变化的。Park变换就是要把这两个静止的正弦量,变成旋转坐标系下的直流量。

想象一下:你站在一个旋转的圆盘上,看外面一个旋转的物体。如果你们转速一样,那这个物体在你眼里就是静止的。Park变换就是这个道理——把坐标系转到和转子同步。

关键点: Park变换需要转子的位置角 θ(电角度)。这个角度通常来自编码器或霍尔传感器。没有准确的角度,Park变换就是瞎变。

4.3.2 数学推导

设转子电角度为 θ,则 dq 轴电流为:

id =  iα * cos(θ) + iβ * sin(θ)
iq = -iα * sin(θ) + iβ * cos(θ)

写成矩阵:

[ id ]   [  cos(θ)  sin(θ) ] [ iα ]
[ iq ] = [ -sin(θ)  cos(θ) ] [ iβ ]

这里 id 是直轴电流(励磁分量),iq 是交轴电流(转矩分量)。对于表贴式PMSM,我们通常控制 id = 0,只控制 iq 来产生转矩。

我的习惯: 调试时我会先让电机空转,用示波器看 iα 和 iβ 的波形。如果它们是相位差90°的正弦波,说明Clark变换没问题。然后给一个固定的 θ 值,看 id 和 iq 是不是直流量。这一步能快速定位问题。

4.3.3 代码实现

// Park变换:αβ -> dq
// 输入:ialpha, ibeta, theta(电角度)
// 输出:id, iq
void park_transform(float ialpha, float ibeta, float theta,
                    float *id, float *iq)
{
    float sin_theta = arm_sin_f32(theta);
    float cos_theta = arm_cos_f32(theta);
    
    *id =  ialpha * cos_theta + ibeta * sin_theta;
    *iq = -ialpha * sin_theta + ibeta * cos_theta;
}

注意,这里用了ARM的DSP库函数计算正余弦。如果MCU没有硬件浮点,可以考虑查表法。GD32F303有FPU,直接用浮点运算就行。

4.4 逆变换:从dq回到ABC

控制完 id 和 iq 后,我们得到的是 dq 坐标系下的电压指令。要送到SVPWM模块,还得变回三相电压。这就是逆Park和逆Clark变换。

4.4.1 逆Park变换

iα = id * cos(θ) - iq * sin(θ)
iβ = id * sin(θ) + iq * cos(θ)

4.4.2 逆Clark变换

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

注意: 逆变换的系数要和正变换保持一致。如果正变换用了等功率变换,逆变换也要用等功率变换的系数,否则会引入误差。

4.5 知识结构总览

下面这张图总结了整个坐标变换的流程,我建议你把它记在脑子里:

FOC坐标变换流程 三相ABC ia, ib, ic Clark 两相αβ iα, iβ Park 两相dq id, iq PI控制器 Vd*, Vq* 逆Park 逆Clark 三相电压 Va, Vb, Vc θ(电角度) 说明 Clark: ABC→αβ Park: αβ→dq

4.6 常见问题与避坑

问题 现象 原因 解决方法
电流环震荡 电机噪音大,电流波形毛刺多 Clark变换系数不对 确认使用等功率变换系数 √(2/3)
转矩输出不足 同样iq下,转矩比预期小 Park变换角度偏差 校准编码器零位偏移
id不为零 id有较大的直流分量 电流采样偏置未校准 做电流采样偏置校准
高速时失控 电机在高速时抖动或停转 角度更新延迟太大 优化角度读取时序,使用预测算法

调试小技巧: 我习惯在代码里加一个「开环测试模式」——给定固定的Vd和Vq,不接电流环,直接看电机能不能转起来。如果Clark和Park变换正确,电机应该能平稳旋转。这个模式能快速验证坐标变换代码的正确性。

4.7 小结

Clark和Park变换是FOC的数学基础。说白了,它们就是坐标变换工具,把复杂的交流量变成简单的直流量。理解物理意义比死记公式更重要。

记住几个关键点:

  • Clark变换:三相→两相,等功率变换系数 √(2/3)
  • Park变换:静止→旋转,需要转子位置角 θ
  • 逆变换:控制完再变回去给SVPWM用
  • 角度精度直接影响控制效果