Clark变换:三相静止到两相静止的坐标变换
Clark变换,说白了就是把电机里那三根线的电流,转换到两相坐标系里。你想想看,三相电机有三根线,每根线都有电流,控制起来多麻烦。但如果我们能把它变成两相,事情就简单多了。
我记得刚入行那会儿,第一次看到Clark变换公式,觉得挺抽象的。后来在项目里调试电机,才真正体会到它的价值。今天我就把这块内容掰开揉碎了讲给你听。
为什么要做Clark变换?
三相电机里,电流是这么走的:
- A相、B相、C相,三根线
- 每根线的电流随时间变化
- 三根线之间相差120度
这就像三个人在跳舞,步调不一样。你想想看,要同时控制三个人,多累啊。Clark变换就是把这「三个人」变成「两个人」,让控制变得简单。
核心思想:三相静止坐标系(ABC)→ 两相静止坐标系(αβ)
说白了,就是把三个变量变成两个变量,但信息不丢失。
变换的数学原理
我们先从物理角度理解。三相电流满足一个条件:
iA + iB + iC = 0
嗯,这里要注意,这是理想情况。实际电机里,因为绕组不对称或者传感器误差,这个和不一定为零。我在项目里就遇到过这个问题,后面会讲怎么处理。
既然三个电流的和为零,那其实只有两个是独立的。Clark变换就是利用这个特性,把三个变量映射到两个轴上:
- α轴:与A相轴线重合
- β轴:与α轴垂直,逆时针旋转90度
你想想看,这样就把三相的120度分布,变成了两相的90度正交分布。正交的好处是什么?控制起来互不影响,解耦了。
公式推导过程
我个人习惯从几何角度去理解。把三相电流看成空间矢量:
iA 在 A 相轴线上
iB 在 B 相轴线上(滞后A相120度)
iC 在 C 相轴线上(滞后A相240度)
现在我们要把它们投影到αβ轴上:
α轴分量:
iα = iA + iB·cos(120°) + iC·cos(240°)
= iA - 1/2·iB - 1/2·iC
β轴分量:
iβ = 0 + iB·sin(120°) + iC·sin(240°)
= 0 + √3/2·iB - √3/2·iC
写成矩阵形式就是:
| iα | | 1 -1/2 -1/2 | | iA |
| | = | | | |
| iβ | | 0 √3/2 -√3/2 | | iB |
| iC |
我的经验:这个矩阵叫Clark变换矩阵。实际编程时,我建议先算好系数,不要每次都算cos和sin,省CPU资源。
等幅值变换 vs 等功率变换
这里有个坑,我当年踩过。Clark变换有两种形式:
| 变换类型 | 变换矩阵 | 特点 |
|---|---|---|
| 等幅值变换 | 系数为 2/3 | 变换前后电流幅值不变 |
| 等功率变换 | 系数为 √(2/3) | 变换前后功率不变 |
我个人习惯用等幅值变换,因为调试时看电流波形更直观。但如果你做功率计算,就得用等功率变换。
避坑指南:我曾经在项目里混用了两种变换,结果算出来的扭矩完全不对。后来花了半天才找到原因。建议你在代码开头就定义好用哪种,全局统一。
代码实现示例
下面是我常用的C代码实现:
// Clark变换 - 等幅值变换
void clark_transform(float iA, float iB, float iC,
float *iAlpha, float *iBeta) {
// 系数预计算
const float sqrt3_2 = 0.8660254f; // √3/2
*iAlpha = iA - 0.5f * iB - 0.5f * iC;
*iBeta = sqrt3_2 * iB - sqrt3_2 * iC;
// 等幅值变换,乘以2/3
*iAlpha *= 0.6666667f;
*iBeta *= 0.6666667f;
}
你看,代码其实很简单。但要注意浮点数精度问题,我建议用float就够了,double太慢。
逆Clark变换
有时候我们需要从αβ变回ABC,比如做电流重构。逆变换公式:
iA = iα
iB = -1/2·iα + √3/2·iβ
iC = -1/2·iα - √3/2·iβ
嗯,这里要注意,逆变换的前提是三相电流和为0。如果实际电流不满足这个条件,逆变换会出错。
实际应用场景:
- 电流采样后,先做Clark变换
- 然后做Park变换(下一章讲)
- 在旋转坐标系下做PI控制
- 再逆变换回去生成PWM
SVG流程图:Clark变换在FOC中的位置
实际项目中的注意事项
我在做电机驱动项目时,总结了几条经验:
- 采样同步:三相电流要同时采样,不能有延迟。我一般用定时器触发ADC,同时采集三路。
- 零点校准:电流传感器有零漂,要先校准。我习惯上电后先采一组数据做平均,作为零点。
- 数值范围:变换后的αβ电流范围会变化,要注意ADC和DAC的满量程匹配。
调试技巧:如果你发现电机转起来有抖动,先检查Clark变换的输出。用示波器看iα和iβ,应该是两个相差90度的正弦波。如果不是,说明采样或者变换有问题。
Clark变换看起来简单,但它是整个FOC的基础。基础打牢了,后面的Park变换、SVPWM才能做好。我个人建议你多动手推导几遍公式,再写代码验证一下,这样理解会更深刻。
公众号:蓝海资料掘金营,微信deep3321