Clark 变换(又称为 3/2 变换)是电机控制(尤其是 FOC 磁场定向控制)中的基础数学工具,用于将三相静止坐标系(A-B-C)中的变量变换到两相静止坐标系(α-β)中。
一、Clark 变换(3相 → 2相)
1. 变换目的
将三相电流/电压 (i_a, i_b, i_c) 分解为两个垂直分量:
-
i_α:与 A 轴对齐
-
i_β:超前 i_α 90°
2. 变换公式
前提条件 :三相平衡系统满足 i_a + i_b + i_c = 0
标准形式:
i_α = i_a
i_β = (i_a + 2i_b) / √3
或写成矩阵形式:
[ i_α ] [ 1 -1/2 -1/2 ] [ i_a ]
[ i_β ] = [ 0 √3/2 -√3/2 ] [ i_b ]
[ i_0 ] [ 1/2 1/2 1/2 ] [ i_c ]
功率不变形式(常用):
i_α = (2/3) * (i_a - 0.5*i_b - 0.5*i_c)
i_β = (2/3) * ( (√3/2)*i_b - (√3/2)*i_c )
3. 代码实现(浮点)
void clark_transform(float i_a, float i_b, float i_c, float *i_alpha, float *i_beta)
{
// 功率不变形式
*i_alpha = (2.0f/3.0f) * (i_a - 0.5f*i_b - 0.5f*i_c);
*i_beta = (2.0f/3.0f) * ((SQRT3_2)*i_b - (SQRT3_2)*i_c);
// 或简化形式(需要 i_a + i_b + i_c = 0)
// *i_alpha = i_a;
// *i_beta = (i_a + 2.0f*i_b) / SQRT3;
}
二、反 Clark 变换(2相 → 3相)
1. 变换目的
将两相静止坐标系(α-β)中的变量还原为三相变量。
2. 变换公式
i_a = i_α
i_b = -0.5 * i_α + (√3/2) * i_β
i_c = -0.5 * i_α - (√3/2) * i_β
3. 代码实现
void inverse_clark_transform(float i_alpha, float i_beta, float *i_a, float *i_b, float *i_c)
{
*i_a = i_alpha;
*i_b = -0.5f * i_alpha + SQRT3_2 * i_beta;
*i_c = -0.5f * i_alpha - SQRT3_2 * i_beta;
}
三、Clark 与 Park 的关系
在 FOC 控制中,Clark 和 Park 变换通常串联使用:
三相电流 (A,B,C)
↓ Clark 变换
两相静止 (α, β)
↓ Park 变换 (需要转子角度 θ)
两相旋转 (d, q) ← 用于 PI 控制
-
Clark:消除三相的冗余,减少一维
-
Park:将交流量变为直流量,便于控制
四、常规定义常量
#define SQRT3 1.73205080757f // √3
#define SQRT3_2 0.86602540378f // √3/2
#define INV_SQRT3 0.57735026919f // 1/√3
#define TWO_THIRD 0.66666666667f // 2/3
五、完整示例(FOC 电流采样处理)
// ADC 采样得到的三相电流
float ia = read_current_A();
float ib = read_current_B();
float ic = read_current_C();
// Step 1: Clark 变换 → αβ 坐标系
float i_alpha, i_beta;
clark_transform(ia, ib, ic, &i_alpha, &i_beta);
// Step 2: Park 变换 → dq 坐标系(需要角度 theta)
float id, iq;
park_transform(i_alpha, i_beta, theta, &id, &iq);
// Step 3: PI 控制
vd = pi_id_control(id_ref, id);
vq = pi_iq_control(iq_ref, iq);
// Step 4: 反 Park 变换
float v_alpha, v_beta;
inverse_park_transform(vd, vq, theta, &v_alpha, &v_beta);
// Step 5: 反 Clark 变换 → 三相电压
float va, vb, vc;
inverse_clark_transform(v_alpha, v_beta, &va, &vb, &vc);
// Step 6: 输出到 PWM 模块
set_pwm_duty(va, vb, vc);
六、注意事项
| 要点 | 说明 |
|---|---|
| 三相平衡假设 | Clark 变换要求 i_a + i_b + i_c = 0,否则需要计算零序分量 i_0 |
| 功率不变 vs 幅值不变 | 注意区分两种变换系数(2/3 还是 1),与 Park 变换保持一致 |
| 浮点精度 | 电机控制建议使用 float,double 可能过慢 |
| 快速实现 | 可查表或使用定点数优化 SQRT3_2 乘法 |