第3章:坐标变换基础:Clark变换与Park变换的原理与实现

说到电机控制,坐标变换是绕不开的一关。

我记得刚入行那会儿,看到一堆αβ、dq的公式,头都大了。心想:好好的三相电流,干嘛要变来变去?后来真正上手调电流环,才明白——不变不行啊。

这一章,咱们就把Clark变换和Park变换彻底讲透。不搞玄学,只讲实战。

3.1 为什么要做坐标变换?

先问个问题:三相电机里,电流是交流的,对吧?

交流信号不好控制。PID控制器最喜欢直流信号——给定一个值,反馈一个值,误差一算,输出就出来了。但三相交流电流是正弦波,一直在变,PID追着跑,累不累?

坐标变换的目的,说白了就一个:把交流变直流

核心思想:

  • Clark变换:把三相静止坐标系(abc)变到两相静止坐标系(αβ)
  • Park变换:把两相静止坐标系(αβ)变到两相旋转坐标系(dq)

最终,在dq坐标系下,电流变成了直流量。这时候PID就好办了。

我在项目中遇到过一位同事,死活不理解为什么要做两次变换。他直接在三相上做PID,结果电流震荡得一塌糊涂。后来我给他画了个图,他才明白——你追一个静止的目标,总比追一个旋转的目标容易吧?

3.2 Clark变换(3s/2s变换)

3.2.1 原理

Clark变换,就是把三相绕组产生的磁动势,等效成两相绕组产生的磁动势。

你想想看,三相绕组在空间上相差120°,两相绕组在空间上相差90°。只要保证合成磁动势一样,电机转起来的效果就一样。

数学上,Clark变换的公式是这样的:

Iα = Ia
Iβ = (Ia + 2*Ib) / √3

等等,这里有个细节。上面这个公式是等幅值变换,也是最常用的。还有一种叫等功率变换,系数不一样。

我的习惯:做电流环调试,一律用等幅值变换。因为电流环的给定值就是电流幅值,用等幅值变换,给定和反馈直接对应,不用额外换算。省心。

3.2.2 代码实现

实际写代码时,我建议把变换写成函数,方便复用。下面是我常用的实现:

// Clark变换:三相电流 -> 两相静止电流
// 输入:Ia, Ib, Ic(三相电流)
// 输出:Ialpha, Ibeta(两相静止电流)
void clark_transform(float Ia, float Ib, float Ic, 
                     float *Ialpha, float *Ibeta)
{
    // 等幅值变换
    *Ialpha = Ia;
    *Ibeta = (Ia + 2.0f * Ib) / 1.7320508f;  // 1.7320508 = √3
    
    // 注意:Ic = -(Ia + Ib),所以公式里只用到了Ia和Ib
}

嗯,这里要注意:三相电流是平衡的,Ia + Ib + Ic = 0。所以实际采样时,只需要采两相电流,第三相算出来就行。省一个ADC通道,不香吗?

3.3 Park变换(2s/2r变换)

3.3.1 原理

Clark变换完了,我们有了Iα和Iβ。但它们还是交流量——因为电机在转,磁场在转,绕组切割磁力线产生的电流自然也是交变的。

Park变换就是来解决这个问题的。它把静止的αβ坐标系,旋转起来,变成跟着转子一起转的dq坐标系。

公式如下:

Id = Iα * cos(θ) + Iβ * sin(θ)
Iq = -Iα * sin(θ) + Iβ * cos(θ)

这里的θ,就是转子的电角度。从编码器或者霍尔传感器读到的。

我曾经踩过的坑:θ的零点没对准。有一次调试,电机一启动就剧烈抖动,查了半天,发现是编码器安装时零点偏了5°。Id和Iq里混入了不该有的分量,电流环直接炸了。后来我养成了一个习惯——每次上电先做一次角度校准。

3.3.2 代码实现

// Park变换:两相静止电流 -> 两相旋转电流
// 输入:Ialpha, Ibeta, theta(电角度)
// 输出:Id, Iq
void park_transform(float Ialpha, float Ibeta, float theta,
                    float *Id, float *Iq)
{
    float sin_theta = sinf(theta);
    float cos_theta = cosf(theta);
    
    *Id = Ialpha * cos_theta + Ibeta * sin_theta;
    *Iq = -Ialpha * sin_theta + Ibeta * cos_theta;
}

这里有个性能问题:sin和cos计算很慢。在嵌入式MCU上,我建议用查表法或者CORDIC算法。我个人的做法是预计算一个1024点的正弦表,角度分辨率0.35°,够用了。

3.4 逆变换

有正变换,就有逆变换。电流环输出的是Vd和Vq,要变回Vα和Vβ,再通过SVPWM生成三相电压。

3.4.1 逆Park变换

Valpha = Vd * cos(θ) - Vq * sin(θ)
Vbeta = Vd * sin(θ) + Vq * cos(θ)

3.4.2 逆Clark变换

Va = Valpha
Vb = (-Valpha + √3 * Vbeta) / 2
Vc = (-Valpha - √3 * Vbeta) / 2

小技巧:逆Clark变换的系数,和正变换是对应的。如果你正变换用了等幅值,逆变换也要用等幅值。混用的话,电流环的增益就全乱了。

3.5 实战中的注意事项

讲完了原理和代码,我再唠叨几句实战经验:

  1. 采样同步:电流采样和角度采样必须同步。我见过有人用两个不同的定时器触发ADC和编码器读取,结果角度和电流差了几个微秒,高速运行时误差很大。
  2. 浮点 vs 定点:如果MCU没有FPU,建议用Q格式做定点运算。我习惯用Q15格式,精度够,速度快。
  3. 角度补偿:从采样到执行变换,中间有延迟。高速电机运行时,这个延迟会导致角度误差。我一般会做一个角度补偿:θ_comp = θ + ω * T_delay。
  4. 调试顺序:先调Clark变换,再调Park变换。我习惯在示波器上看Iα和Iβ的波形,确认它们是正交的正弦波,再去做Park变换。

3.6 本章小结

Clark变换和Park变换,是电流环调试的基石。说白了,就是把三相交流这个「麻烦精」,变成两相直流这个「乖孩子」。这样PID才能好好干活。

下一章,咱们就来讲PID参数怎么整定。到时候你会发现,坐标变换搞明白了,电流环调试就成功了一半。

记住三句话:

  • Clark变换:三相变两相,静止到静止
  • Park变换:两相变两相,静止到旋转
  • 逆变换:把电压从旋转系变回静止系,才能驱动电机

好了,这一章就到这儿。有什么问题,欢迎在课程群里讨论。咱们下章见。