3、Clark变换:从三相静止坐标系到两相静止坐标系的变换原理与公式
好,咱们继续往前走。
上一章我们把电机里那三个绕组的电流摸清楚了——Iu、Iv、Iw,三相正弦波,相位差120度。理论上,有了这三个电流,我们就能控制电机。但问题来了:三个变量,控制起来太麻烦。你想想看,一个控制环路里同时调三个正弦量,光是算相位就够你喝一壶的。
所以,我们需要一个“降维”操作。
Clark变换,就是干这个的。它把三相静止坐标系(UVW)下的电流,变换到两相静止坐标系(αβ)下。说白了,就是把三个变量变成两个变量,而且这两个变量还是正交的——互相垂直,控制起来舒服多了。
核心思想:三相系统在空间上是对称的,其实信息是冗余的。Clark变换就是去掉这个冗余,用两个正交分量等效描述同一个空间矢量。
3.1 为什么要从三相变两相?
我刚开始学FOC的时候,也有这个疑问:电机本来就是三相的,你硬把它变成两相,这不是脱裤子放屁吗?
后来做项目才明白,这里有两个关键原因:
- 控制维度降低:三个变量互相耦合,调一个另外两个也跟着变。两相正交坐标系下,α轴和β轴完全解耦,你可以独立控制。
- 为下一步Park变换铺路:两相静止坐标系还不是终点。后面我们要做Park变换,把αβ旋转到dq旋转坐标系,变成直流分量。而Park变换的前提,就是输入必须是两相正交信号。
嗯,说白了,Clark变换就是一个“翻译官”。它把电机本体的三相语言,翻译成控制器能轻松处理的两相语言。
3.2 变换的数学原理
咱们先看一个简单的示意图。想象一下,三相绕组在空间上互差120度,它们的磁动势矢量合成一个旋转的磁动势。现在,我们想用两个互相垂直的绕组(α轴和β轴)来产生完全相同的合成磁动势。
我的理解方式:你可以把三相电流想象成三个壮汉拉一个绳子,方向各差120度。Clark变换就是找两个壮汉,站在互相垂直的方向上,拉出完全相同的合力。只要合力一样,电机才不管你是三个人拉的还是两个人拉的。
数学上,这个变换关系可以用一个矩阵来表示。设三相电流为 Iu、Iv、Iw,变换后的两相电流为 Iα 和 Iβ,那么:
┌ ┐ ┌ ┐ ┌ ┐
│ Iα │ │ 1 -1/2 -1/2 │ │ Iu │
│ │ = │ │ │ │
│ Iβ │ │ 0 √3/2 -√3/2 │ │ Iv │
└ ┘ └ ┘ │ │
│ Iw │
└ ┘
等等,这个系数看着有点眼熟?没错,就是三角函数值。α轴与U轴对齐,β轴与U轴垂直。所以U相在α轴上的投影是1,在β轴上是0;V相在α轴上是cos(120°) = -1/2,在β轴上是sin(120°) = √3/2;W相类似。
这个变换叫做等幅值变换。为什么叫等幅值?因为变换前后,合成矢量的幅值不变。我在项目中遇到过一个问题,就是用了等功率变换的系数,结果电流环PI参数怎么调都不对——后来才发现是变换系数没统一。
注意:Clark变换有两种常见形式——等幅值变换和等功率变换。两者差一个系数√(2/3)。FOC中绝大多数实现都采用等幅值变换,因为电流环PI参数可以直接沿用。如果你用等功率变换,PI参数需要重新整定。
3.3 变换的几何意义
咱们用SVG画一张图,把这件事看清楚。
从图上可以看得很清楚:三相的U、V、W轴在空间上互差120度,而两相的α轴与U轴重合,β轴与α轴垂直。合成矢量 Is 在两种坐标系下是同一个东西,只是描述方式不同。
3.4 代码实现
理论说完了,咱们看看代码怎么写。我个人习惯在MCU上用定点数或者浮点数直接实现,这里给一个标准的C语言版本:
/**
* Clark变换:三相电流 → 两相静止坐标系电流
* @param Iu U相电流
* @param Iv V相电流
* @param Iw W相电流
* @param Iα 输出:α轴电流
* @param Iβ 输出:β轴电流
*/
void clark_transform(float Iu, float Iv, float Iw, float *Iα, float *Iβ)
{
// 等幅值Clark变换
*Iα = Iu - 0.5f * Iv - 0.5f * Iw;
*Iβ = 0.8660254f * Iv - 0.8660254f * Iw; // √3/2 ≈ 0.8660254
}
你看,就这么几行。但有几个细节我得提醒你:
- 输入电流的符号:一般ADC采集到的电流值,需要先减去偏置,再乘以标定系数,得到真实的安培值。我见过有人直接拿ADC原始值做变换,结果出来的Iα、Iβ全是正的——那肯定不对。
- 三相电流的约束:理论上
Iu + Iv + Iw = 0(星形连接,中性点不引出)。所以实际实现中,有时只采集两相电流,第三相用Iw = -Iu - Iv算出来。这样可以省一个ADC通道。 - 浮点精度:0.8660254这个系数,如果MCU没有FPU,建议预先算好存成常量,避免每次计算都做除法。
避坑指南:我曾经在一个项目里,直接用sqrt(3)/2的宏定义,结果编译器在每次循环里都重新算一遍,导致Clark变换耗时翻了一倍。后来改成预计算常量,问题解决。嗯,细节决定成败。
3.5 变换前后的波形对比
咱们用表格对比一下,三相电流和两相电流的波形特征:
| 参数 | 三相电流 (Iu/Iv/Iw) | 两相电流 (Iα/Iβ) |
|---|---|---|
| 变量数量 | 3个 | 2个 |
| 相位关系 | 互差120° | 互差90°(正交) |
| 波形形状 | 正弦波 | 正弦波 |
| 幅值关系 | 各相幅值相等 | Iα与Iβ幅值相等 |
| 耦合程度 | 强耦合 | 解耦 |
| 控制难度 | 高(需同时调3个正弦量) | 低(可独立控制) |
从表格可以看出来,Clark变换之后,虽然波形还是正弦波,但变量从3个减到2个,而且变成了正交关系。这为下一步的Park变换打下了基础。
3.6 常见问题与避坑
最后,我总结几个实际项目中容易踩的坑:
- 变换系数不一致:不同文献用的Clark变换系数可能不同。有的用2/3,有的用√(2/3)。你在移植代码时,一定要确认前后级用的系数是否匹配。我吃过这个亏——从某开源项目移植代码,没注意系数,结果电流环震荡了三天。
- ADC采样时序:Clark变换的输入是瞬时值,要求Iu、Iv、Iw在同一时刻采样。如果ADC是轮询采样,三个通道之间有延时,会导致变换结果有相位误差。解决办法是用同步采样或者插值补偿。
- 饱和处理:变换后的Iα、Iβ幅值可能超过ADC量程。建议在变换前做限幅,或者在变换后做饱和判断,防止后续计算溢出。
重要提醒:Clark变换本身不产生任何物理意义的变化——它只是换了一种数学描述方式。电机转不转、转得快不快,跟Clark变换没有直接关系。它只是一个工具,帮我们把问题简化。