第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 实战中的注意事项
讲完了原理和代码,我再唠叨几句实战经验:
- 采样同步:电流采样和角度采样必须同步。我见过有人用两个不同的定时器触发ADC和编码器读取,结果角度和电流差了几个微秒,高速运行时误差很大。
- 浮点 vs 定点:如果MCU没有FPU,建议用Q格式做定点运算。我习惯用Q15格式,精度够,速度快。
- 角度补偿:从采样到执行变换,中间有延迟。高速电机运行时,这个延迟会导致角度误差。我一般会做一个角度补偿:θ_comp = θ + ω * T_delay。
- 调试顺序:先调Clark变换,再调Park变换。我习惯在示波器上看Iα和Iβ的波形,确认它们是正交的正弦波,再去做Park变换。
3.6 本章小结
Clark变换和Park变换,是电流环调试的基石。说白了,就是把三相交流这个「麻烦精」,变成两相直流这个「乖孩子」。这样PID才能好好干活。
下一章,咱们就来讲PID参数怎么整定。到时候你会发现,坐标变换搞明白了,电流环调试就成功了一半。
记住三句话:
- Clark变换:三相变两相,静止到静止
- Park变换:两相变两相,静止到旋转
- 逆变换:把电压从旋转系变回静止系,才能驱动电机
好了,这一章就到这儿。有什么问题,欢迎在课程群里讨论。咱们下章见。