3、坐标变换理论:Clark变换、Park变换、反Park变换

坐标变换,说白了就是换个角度看问题。

我刚开始接触FOC时,最头疼的就是这一块。三相电流明明在电机里转得好好的,为什么非要折腾成两相?还要再转来转去?后来踩过几次坑才明白——坐标变换不是炫技,而是把复杂问题变简单的利器

3.1 为什么需要坐标变换?

你想想看,三相电机里电流是正弦波,磁场在旋转,转矩在波动。直接控制这些交流量,PID调参能调到怀疑人生。

但如果我们换个坐标系呢?

  • Clark变换:把三相(A、B、C)变成两相(α、β),减少变量
  • Park变换:把静止的两相(α、β)变成旋转的两相(d、q),让交流变直流

一旦变成直流,PID控制就简单了——调个P、I参数,跟控制直流电机一样顺手。

核心思想:坐标变换不改变物理本质,只改变观察角度。就像你站在地上看旋转木马,和坐在木马上的感觉完全不同。

3.2 Clark变换(3相→2相静止坐标系)

Clark变换,也叫3s/2s变换。它的任务是把三相电流(iA、iB、iC)投影到两相静止坐标系(α、β)上。

数学表达式很简单:

iα = iA
iβ = (iA + 2*iB) / √3

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

嗯,这里有个小秘密——三相电流之和为零(星形接法)。所以iC = -(iA + iB),不需要单独计算。

写成矩阵形式更直观:

[ iα ]   [ 1      -1/2    -1/2  ] [ iA ]
[ iβ ] = [ 0      √3/2   -√3/2 ] [ iB ]
                                [ iC ]

我的经验:实际项目中,Clark变换很少单独用。它通常是Park变换的前置步骤。但我建议你单独测试一下Clark变换的输出——用示波器看iα和iβ,它们应该是相位差90°的正弦波。如果不是,说明采样或计算有问题。

3.3 Park变换(静止→旋转坐标系)

Clark变换后,我们有了α、β两相。但它们还是交流量,控制起来依然麻烦。

Park变换就是来解决这个问题的——把静止的α、β,投影到旋转的d、q轴上

公式:

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

这里的θ是转子位置角,也就是编码器或霍尔传感器读到的角度。

变换之后,id和iq就变成了直流量。其中:

  • id:励磁分量,控制磁场强度
  • iq:转矩分量,控制电机出力

你看,这样一来,控制电机就变成了控制两个直流分量——调id让磁场稳定,调iq让转矩跟上。是不是清晰多了?

我曾经踩过的坑:Park变换的角度θ必须是电角度,不是机械角度。电机极对数不同,电角度和机械角度的关系也不同。我有一回忘了乘以极对数,结果电机抖得像筛子一样……嗯,从那以后我再也没犯过这个错。

3.4 反Park变换

控制完id和iq,我们得到了想要的电压值Vd和Vq。但问题来了——电机需要的是三相电压,不是两相。

所以需要反Park变换:

Vα = Vd * cos(θ) - Vq * sin(θ)
Vβ = Vd * sin(θ) + Vq * cos(θ)

然后再用反Clark变换(或者直接SVPWM)得到三相电压。

说白了,反Park变换就是Park变换的逆过程。你从α、β变到d、q,现在再变回去。

注意:反Park变换的公式和Park变换很像,但符号不同。我建议你写代码时,把Park和反Park放在一起对比着写,不容易搞混。

3.5 变换的物理意义

聊完了公式,咱们说说物理意义。这部分我当年学的时候觉得最抽象,但也是最有意思的。

Clark变换的物理意义

  • 把三相绕组的磁场,等效成两相正交绕组的磁场
  • 说白了就是降维——从3个变量变成2个变量,计算量减半

Park变换的物理意义

  • 把观察者从静止的定子,搬到旋转的转子上
  • 你跟着转子一起转,看到的电流就是直流

反Park变换的物理意义

  • 把转子上的控制量,翻译回定子能理解的语言
  • 就像你坐在旋转木马上指挥地面的人——你说「向前」,但地面的人需要知道你的「向前」对应哪个方向

3.6 知识体系总览

下面这张图,是我自己总结的坐标变换全流程。你看一遍就能串起来:

坐标变换知识体系总览 三相电流 (iA, iB, iC) Clark变换 3相 → 2相静止 αβ坐标系 (iα, iβ) Park变换 静止 → 旋转 dq坐标系 (id, iq) 直流量 PID控制 (Vd, Vq) 反Park变换 旋转 → 静止 SVPWM 2相 → 3相 三相电压 (Va, Vb, Vc) 转子角度 θ 虚线表示角度θ同时参与Park变换和反Park变换

3.7 代码实现要点

最后,分享一段我常用的C代码框架。实际项目中,坐标变换通常用浮点或定点实现:

// 坐标变换结构体
typedef struct {
    float alpha;
    float beta;
} Clarke_t;

typedef struct {
    float d;
    float q;
} Park_t;

// Clark变换
Clarke_t clarke_transform(float ia, float ib, float ic) {
    Clarke_t out;
    out.alpha = ia;
    out.beta = (ia + 2.0f * ib) / 1.7320508f;  // 1/√3
    return out;
}

// Park变换
Park_t park_transform(float alpha, float beta, float theta) {
    Park_t out;
    float sin_theta = sinf(theta);
    float cos_theta = cosf(theta);
    out.d = alpha * cos_theta + beta * sin_theta;
    out.q = -alpha * sin_theta + beta * cos_theta;
    return out;
}

// 反Park变换
Clarke_t inv_park_transform(float vd, float vq, float theta) {
    Clarke_t out;
    float sin_theta = sinf(theta);
    float cos_theta = cosf(theta);
    out.alpha = vd * cos_theta - vq * sin_theta;
    out.beta = vd * sin_theta + vq * cos_theta;
    return out;
}

我的建议:调试时,先让电机空转,用DAC或串口把id、iq的值打印出来。如果id和iq是稳定的直流量(而不是正弦波),说明你的坐标变换写对了。如果id、iq还在波动,检查角度θ是否准确,或者采样时序是否有延迟。

好了,坐标变换就聊到这儿。记住一句话:变换的是坐标系,不变的是物理本质。下一节咱们聊聊SVPWM——怎么把算好的电压真正送到电机上。


公众号:蓝海资料掘金营,微信deep3321