3、坐标变换理论:Clark变换、Park变换及其逆变换的数学原理与物理意义

好,咱们今天聊点硬核的——坐标变换。

说实话,我刚入行那会儿,看到Clark和Park这两个名字,第一反应是:这又是哪个数学家在折腾我们搞电机的?后来真正做项目了才发现,没有这两把刷子,你连电机转都转不起来,更别提什么低速大扭矩控制了。

坐标变换,说白了就是换一个角度看问题。你站在地面上看飞机,和坐在飞机里看地面,感觉完全不一样。电机控制也是这个道理。

3.1 为什么需要坐标变换?

先问一个问题:三相电机里,电流是交流的,一会儿正一会儿负,你怎么控制它输出恒定的扭矩?

答案是——你没法直接控制。因为三相静止坐标系下的电流是时变的,控制起来非常麻烦。我早期做项目时,试过直接在ABC三相上做PID,结果调了三天,电机抖得像筛糠。

后来我才明白,我们需要把交流量变成直流量。这就是坐标变换的核心目的:把时变的交流量,变成时不变的直流量。这样一来,你就可以像控制直流电机一样,用简单的PI控制器去控制交流电机了。

核心思想:坐标变换不是改变物理量本身,而是改变观察这个物理量的坐标系。就像你手里的杯子,从正面看是圆的,从侧面看是方的——杯子没变,只是你看的角度变了。

3.2 Clark变换:从ABC到αβ

Clark变换,也叫3/2变换。它的任务是把三相静止坐标系(A、B、C)下的量,变换到两相静止坐标系(α、β)下。

为什么要这么做?因为三相系统有冗余。你想想看,三相电流满足 iA + iB + iC = 0,实际上只有两个自由度。用两相坐标系,刚好去掉冗余。

3.2.1 数学原理

Clark变换的数学表达式是这样的:

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

嗯,这个矩阵看着有点眼熟对吧?其实就是把三相投影到两相上。我习惯用等幅值变换,也就是变换前后电流的幅值保持不变。

这里有个细节要注意:等幅值变换和等功率变换,系数是不一样的。等幅值变换前面有个2/3系数,等功率变换前面是√(2/3)。我个人习惯用等幅值,因为调试时看电流波形更直观。

3.2.2 物理意义

Clark变换的物理意义,其实就是把三个互差120°的矢量,投影到两个互相垂直的轴上。

你可以想象一下:三根绳子从三个方向拉一个点,现在换成两根互相垂直的绳子来拉,效果是一样的。这就是Clark变换干的事。

我的经验:在调试无传感器算法时,我经常先看αβ坐标系下的电流波形。如果α轴和β轴的电流是标准的正弦波且相位差90°,说明Clark变换没问题。我曾经有一次发现β轴波形畸变,查了半天,结果是电流采样通道的增益没校准——这种坑,踩过一次就记住了。

3.3 Park变换:从αβ到dq

Clark变换只是第一步。αβ坐标系下的电流仍然是交流量,没法直接用PI控制。我们需要再转一次,转到旋转坐标系下。

Park变换的任务,就是把两相静止坐标系(α、β)下的量,变换到两相旋转坐标系(d、q)下。这个旋转坐标系,是跟着转子磁链一起转的。

3.3.1 数学原理

Park变换的公式:

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

其中θ是转子位置角。你看,这个变换矩阵其实就是个旋转矩阵,把静止的αβ轴旋转θ角度,就得到了dq轴。

反过来,逆Park变换:

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

3.3.2 物理意义

Park变换的物理意义,就是把交流变直流

你想想看,电机在转,转子位置θ在变。如果αβ轴上的电流是正弦波,乘以cosθ和sinθ之后,正好把那个正弦的波动给抵消了。结果就是,dq轴上的电流变成了直流量。

d轴电流控制磁通,q轴电流控制转矩。这两个量是解耦的,你可以独立控制。这就是矢量控制(FOC)的精髓。

注意:Park变换需要知道转子位置θ。对于有传感器方案,直接读编码器就行。但对于无传感器方案,θ是估算出来的——如果估算不准,Park变换就会出错,dq轴电流会耦合,控制性能急剧下降。我在做低速大扭矩时,这个问题特别突出,后面章节会详细讲。

3.4 逆变换:从dq回到ABC

控制算法算出来的是dq轴上的电压指令,但最终要给电机的是三相电压。所以我们需要逆变换回去。

先做逆Park变换(dq→αβ),再做逆Clark变换(αβ→ABC)。

逆Clark变换:

[ VA ]   [ 1      0     ] [ Vα ]
[ VB ] = [ -1/2   √3/2  ] [ Vβ ]
[ VC ]   [ -1/2  -√3/2  ]

嗯,这个矩阵其实就是Clark变换矩阵的转置(对于等幅值变换来说)。

3.5 知识体系总览

为了让你更直观地理解整个变换流程,我画了一张图:

坐标变换知识体系总览 三相静止坐标系 A, B, C Clark变换 两相静止坐标系 α, β Park变换 两相旋转坐标系 d, q 逆Park变换 逆Clark变换 关键说明: • 正向路径(实线):电流采样 → Clark → Park → 得到直流量,用于PI控制 • 反向路径(虚线):PI输出 → 逆Park → 逆Clark → 得到三相电压,用于SVPWM调制 • Park变换需要转子位置θ,无传感器方案中θ由观测器估算 • 整个流程在每一个PWM周期内执行一次,典型频率10kHz-20kHz

3.6 代码实现示例

说了这么多理论,咱们看看代码怎么写。这是我项目里实际用过的C代码片段:

// Clark变换:ABC → αβ
void clark_transform(float iA, float iB, float iC, float *iAlpha, float *iBeta) {
    *iAlpha = iA;                                    // α轴 = A相
    *iBeta  = (iA + 2.0f * iB) / 1.7320508f;        // β轴 = (A+2B)/√3
    // 注意:这里用了等幅值变换,iC = -iA - iB 已隐含
}

// Park变换:αβ → dq
void park_transform(float iAlpha, float iBeta, float theta, float *id, float *iq) {
    float cosT = cosf(theta);
    float sinT = sinf(theta);
    *id =  iAlpha * cosT + iBeta * sinT;
    *iq = -iAlpha * sinT + iBeta * cosT;
}

// 逆Park变换:dq → αβ
void inv_park_transform(float vd, float vq, float theta, float *vAlpha, float *vBeta) {
    float cosT = cosf(theta);
    float sinT = sinf(theta);
    *vAlpha = vd * cosT - vq * sinT;
    *vBeta  = vd * sinT + vq * cosT;
}

// 逆Clark变换:αβ → ABC
void inv_clark_transform(float vAlpha, float vBeta, float *vA, float *vB, float *vC) {
    *vA = vAlpha;
    *vB = -0.5f * vAlpha + 0.8660254f * vBeta;
    *vC = -0.5f * vAlpha - 0.8660254f * vBeta;
}

避坑指南:我曾经在逆Clark变换里把符号搞反了,结果电机反转,还以为是编码器装反了。查了两天才发现是代码里少了个负号。所以我的建议是——写完变换代码后,先用直流测试信号验证。给A相通1A,B、C通-0.5A,看αβ轴输出是不是1和0。这个小测试能省你半天调试时间。

3.7 总结

坐标变换是整个矢量控制的基石。Clark变换把三相变两相,Park变换把静止变旋转。逆变换则是把控制结果送回物理世界。

记住一句话:变换的是坐标系,不变的是物理量。电流还是那个电流,只是你看它的角度变了。

下一节我们会聊到,在低速大扭矩场景下,位置估算不准时,这些变换会出什么问题——嗯,那才是真正考验算法功底的地方。


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