4、Clark变换:从三相电流到两相静止坐标系的数学映射
好,咱们进入FOC的第一个数学关卡——Clark变换。
很多人刚开始学FOC,看到一堆矩阵公式就头大。其实没那么复杂。Clark变换说白了就是一件事:把三个绕组的电流,变成两个垂直方向的电流。
你想想看,电机里三相绕组互差120度,控制起来很麻烦。但如果我们能找到两个互相垂直的轴,把电流投影上去,问题就简化了。这就是Clark变换的核心思想。
4.1 为什么要做这个变换?
三相电机有三个相电流:ia、ib、ic。它们之间有关系:
ia + ib + ic = 0
这意味着三个变量里只有两个是独立的。我们完全可以只用两个变量来描述同一个系统。
Clark变换就把这三个电流映射到α-β两相静止坐标系上。α轴和A相绕组对齐,β轴与α轴垂直。
关键理解:Clark变换不改变电流的频率和相位关系,只是换了一种坐标系来表达。变换前后的电流矢量是完全等价的。
我在项目中遇到过一位同事,他死活想不通为什么非要多此一举。后来我给他画了个图:三相绕组就像三个方向上的力,你很难直观看出合力方向。但换成α-β轴,力的方向一目了然。他看完就明白了。
4.2 数学公式:等幅值变换
Clark变换的数学形式很简单。我习惯用等幅值变换,因为这样变换前后电流的幅值不变,调试时更容易理解。
变换公式如下:
iα = ia
iβ = (ia + 2*ib) / √3
写成矩阵形式更清晰:
[ iα ] [ 1, -1/2, -1/2 ] [ ia ]
[ ] = [ ] [ ]
[ iβ ] [ 0, √3/2, -√3/2 ] [ ib ]
[ ic ]
嗯,这里要注意:公式里的系数是2/3。为什么是2/3?这是为了保持变换前后电流矢量的幅值不变。
我的习惯:做电机控制时,我永远用等幅值变换。等功率变换虽然数学上更优雅,但调试时幅值对不上,容易把人搞晕。等幅值变换更直观,尤其当你用示波器看电流波形时。
4.3 代码实现:C语言版
实际写代码时,我建议把系数提前算好,避免运行时反复计算。下面是我常用的实现:
typedef struct {
float alpha; // α轴电流
float beta; // β轴电流
} clark_t;
clark_t clark_transform(float ia, float ib, float ic) {
clark_t result;
// 预计算系数
const float k1 = 0.5f; // 1/2
const float k2 = 0.866025f; // √3/2
const float k3 = 0.666667f; // 2/3
// Clark变换
result.alpha = k3 * (ia - k1 * ib - k1 * ic);
result.beta = k3 * (k2 * ib - k2 * ic);
return result;
}
如果你只用两个电流传感器(ia和ib),可以简化:
clark_t clark_transform_2sensor(float ia, float ib) {
clark_t result;
// ic = -ia - ib
result.alpha = ia;
result.beta = (ia + 2.0f * ib) * 0.57735f; // 1/√3
return result;
}
我曾经踩过的坑:有一次我直接用浮点运算,没注意MCU的FPU精度。结果在电流很小时,β轴计算误差特别大,导致电机低速抖动。后来我改用Q15定点数运算,问题就解决了。如果你的MCU没有硬件浮点单元,一定要小心浮点精度问题。
4.4 变换前后的波形对比
我们来看一组实际波形数据。假设三相电流是标准的正弦波:
| 角度(°) | ia | ib | ic | iα | iβ |
|---|---|---|---|---|---|
| 0 | 1.00 | -0.50 | -0.50 | 1.00 | 0.00 |
| 30 | 0.87 | 0.00 | -0.87 | 0.87 | 0.50 |
| 60 | 0.50 | 0.50 | -1.00 | 0.50 | 0.87 |
| 90 | 0.00 | 0.87 | -0.87 | 0.00 | 1.00 |
| 120 | -0.50 | 1.00 | -0.50 | -0.50 | 0.87 |
| 150 | -0.87 | 0.87 | 0.00 | -0.87 | 0.50 |
| 180 | -1.00 | 0.50 | 0.50 | -1.00 | 0.00 |
看到规律了吗?iα和ia完全重合,iβ则滞后90度。这就是Clark变换的直观效果——把三相信号变成了两相信号,而且两相信号依然是正弦波。
4.5 Clark变换的物理意义
从物理角度看,Clark变换其实是在做空间矢量分解。
三相电流产生的合成磁动势,在空间上是一个旋转矢量。这个矢量在α轴和β轴上的投影,就是iα和iβ。换句话说:
- iα:代表合成磁动势在A相绕组方向的分量
- iβ:代表合成磁动势在垂直于A相方向的分量
这两个分量合在一起,完整描述了电机内部的磁场状态。
核心结论:Clark变换没有丢失任何信息。三相电流和两相电流之间是一一对应的关系。你完全可以用α-β轴电流来还原出三相电流。
4.6 常见问题与避坑
- 系数选择问题:等幅值和等功率变换的系数不同。如果你从网上抄代码,一定要确认用的是哪种。混用会导致电流环增益不对。
- 电流传感器偏置:如果传感器有直流偏置,Clark变换后α-β轴都会出现直流分量。这会导致电机产生转矩脉动。我一般会在变换前做一次高通滤波。
- 三相不平衡:当三相电流不平衡时,iα和iβ的波形会畸变。这时候要检查电机绕组或驱动电路是否有问题。
调试小技巧:用示波器同时观察iα和iβ,如果看到的是两个相位差90度的正弦波,说明Clark变换正确。如果波形有毛刺或不对称,先检查电流采样时序。
4.7 Clark变换的SVG流程图
下面这张图展示了Clark变换在整个FOC流程中的位置:
从流程图可以看出,Clark变换是FOC的第一道关卡。它把三相电流转换成两相,为后续的Park变换做好准备。没有Clark变换,后面的所有计算都无从谈起。
4.8 小结
Clark变换其实不复杂。记住三点就够了:
- 目的:把三相电流变成两相电流,简化控制
- 方法:用固定矩阵做线性变换,保持幅值不变
- 结果:得到α-β轴电流,仍然是交流量
我个人觉得,Clark变换是FOC里最容易理解的一步。它没有角度信息,没有反馈环路,就是一个纯粹的数学映射。只要公式写对了,结果就一定正确。