首页 / 驱动算法 / 入门篇

Clarke与Park变换:从三相到旋转坐标系

FOC的核心操作。3相→2相→旋转坐标系,每一步变换的几何意义、公式推导和交互式可视化。

1. 为什么需要坐标变换?

上一篇我们讲到,FOC的核心是控制id和iq——把定子电流分解成产生磁通的d轴分量和产生转矩的q轴分量。

但现实是:我们能直接测量和控制的只有三相电流 ia, ib, ic,它们是随转子位置不断变化的交流量。而我们想要控制的id和iq直流量(在稳态下)。

💡 核心矛盾

我们能控制的是三相交流量,我们想控制的是旋转坐标系下的直流量。坐标变换就是在这两者之间架起桥梁。

FOC中的坐标变换分两步:

  1. Clarke变换:三相静止坐标系(ABC) → 两相静止坐标系(αβ)
  2. Park变换:两相静止坐标系(αβ) → 两相旋转坐标系(dq)

反过来,从dq到ABC需要反Park变换反Clarke变换(在SVPWM中完成)。

2. Clarke变换:3相 → 2相静止

2.1 几何意义

三相电流ia, ib, ic在空间上相差120°,它们可以合成一个空间电流矢量。Clarke变换的本质就是把这个三维的矢量投影到一个二维平面上。

α轴与A相重合,β轴超前α轴90°。

2.2 公式推导

等幅值Clarke变换(最常用,保证变换前后幅值不变):

Clarke变换(等幅值)

iα = ia

iβ = (ia + 2·ib) / √3

由于三相电流满足 ia + ib + ic = 0(星形连接,无中线),所以只需要测量两相电流就能算出第三相。

✅ 等幅值 vs 等功率

Clarke变换有两种常见形式:等幅值变换(变换后αβ幅值与相电压幅值相同)和等功率变换(变换前后功率不变,系数为√(2/3))。FOC中一般用等幅值变换,因为PI参数整定更直观。本文所有公式均为等幅值变换。

3. Park变换:2相静止 → 2相旋转

3.1 几何意义

Clarke变换后,iα和iβ仍然是随转子旋转的交流量。Park变换做的事情是:把坐标系也跟着转子一起旋转

想象你站在地面上看一个旋转的矢量——它在你眼中是不断转动的(交流量)。但如果你站在一个和矢量同速旋转的转盘上看它,它就是静止的(直流量)。Park变换就是让你"站到转盘上"。

d轴与转子磁场方向重合,q轴超前d轴90°。d和q坐标系以转子电角速度ω旋转。

3.2 公式推导

设转子电角度为θ(d轴与α轴的夹角),则Park变换为:

Park变换

id = iα·cosθ + iβ·sinθ

iq = -iα·sinθ + iβ·cosθ

反Park变换(从dq回到αβ):

反Park变换

vα = vd·cosθ - vq·sinθ

vβ = vd·sinθ + vq·cosθ

⚠️ 符号约定很重要

不同教材和代码库中,Park变换的符号约定可能不同(有的q轴定义为滞后d轴90°,有的是超前)。这会导致iq的符号相反。在移植代码或对比公式时,一定要先确认符号约定。本文采用q轴超前d轴90°的约定(电动机惯例,正iq产生正转矩)。

4. 交互式演示:完整坐标变换

下面这个工具可以让你直观理解整个变换过程。拖动滑块调节三相电流幅值和转子角度,观察αβ矢量和dq分量的实时变化。

Clarke + Park 变换交互式演示
ia=0.00, ib=-0.87, ic=0.87 → iα=0.00, iβ=1.00 → id=0.00, iq=1.00 (纯转矩电流)

观察要点:

5. FOC控制环中的坐标变换

现在把坐标变换放到完整的FOC控制环中看:

FOC电流环信号流

测量 ia, ibClarke变换 → iα, iβPark变换(θ) → id, iq
→ PI控制器(d轴和q轴) → vd, vq反Park变换(θ) → vα, vβSVPWM → 六路PWM输出

注意几个关键点:

  1. Clarke和Park变换在电流采样后,把反馈电流变换到dq坐标系
  2. PI控制器在dq坐标系下工作,控制的是直流量,所以PI参数整定和直流系统一样简单
  3. 反Park变换在PI控制器后,把控制电压变换回静止坐标系
  4. SVPWM接收vα和vβ,生成六路PWM(下一篇详细讲)
  5. 所有变换都需要实时的转子角度θ,来自编码器、霍尔或无感观测器

6. 代码实现(C语言)

坐标变换的代码非常简洁,每个变换只有几行。在FOC中,这些运算每个PWM周期都要执行一次(通常20kHz)。

/* Clarke变换:三相 → αβ(等幅值) */ void clarke_transform(float ia, float ib, float *i_alpha, float *i_beta) { *i_alpha = ia; *i_beta = (ia + 2.0f * ib) * 0.577350269f; /* 1/sqrt(3) */ } /* Park变换:αβ → dq */ void park_transform(float i_alpha, float i_beta, float theta, float *i_d, float *i_q) { float sin_theta = sinf(theta); float cos_theta = cosf(theta); *i_d = i_alpha * cos_theta + i_beta * sin_theta; *i_q = -i_alpha * sin_theta + i_beta * cos_theta; } /* 反Park变换:dq → αβ */ void inv_park_transform(float v_d, float v_q, float theta, float *v_alpha, float *v_beta) { float sin_theta = sinf(theta); float cos_theta = cosf(theta); *v_alpha = v_d * cos_theta - v_q * sin_theta; *v_beta = v_d * sin_theta + v_q * cos_theta; }
⚡ 性能优化提示

在Cortex-M0等低性能MCU上,sinf/cosf浮点运算可能较慢。优化方法:①用查表法(256点或512点正弦表)代替sinf/cosf;②用定点数运算(Q15/Q31格式);③利用PWM模块的硬件坐标变换(部分MCU支持)。对于20kHz的FOC,即使是Cortex-M0+,用查表法也能轻松跑满。

7. 常见误区

误区1:Clarke变换需要测三相电流

不需要。由于 ia+ib+ic=0,测两相就能算出第三相。三电阻采样测三相是为了在PWM特殊扇区也能获得有效采样,不是Clarke变换本身需要。

误区2:Park变换的角度用电角度还是机械角度

必须用电角度。电角度 = 机械角度 × 极对数。例如7对极电机,机械转一圈(360°),电角度转7圈(2520°)。用错角度会导致id/iq完全错误,电机不转或剧烈振动。

误区3:坐标变换有误差没关系

关系很大。Clarke变换的系数误差、Park变换的角度误差、电流采样的偏移误差,都会直接导致id/iq不准确,表现为转矩脉动大、效率低、电流波形畸变。FOC调参的很大一部分工作就是校准这些误差。

8. 小结

  1. Clarke变换把三相交流量变成两相静止交流量(αβ),本质是三维到二维的投影
  2. Park变换把两相静止交流量变成两相旋转直流量(dq),本质是坐标系跟着转子旋转
  3. id控制磁通,iq控制转矩;id=0时效率最高
  4. FOC控制环中:采样→Clarke→Park→PI→反Park→SVPWM,形成闭环
  5. Park变换必须用电角度,符号约定要统一,代码中注意sin/cos的性能优化

下一篇我们将进入FOC的另一个核心模块——SVPWM空间矢量调制,理解vα和vβ是如何变成六路PWM波形的。