第 3 章 FOC 前置数学基石:Clark 变换
前言
在上一章,我们已经完整实现了六步方波换相,电机可以稳定转起来了。但同时也能明显感受到:
- 低速抖动、力矩脉动大
- 高速噪音明显
- 电流波形是方波,谐波大、效率低
想要解决这些问题,就必须进入FOC 磁场定向控制。而 FOC 最核心、最基础、最绕不开的第一步,就是坐标变换。
FOC 本质上就做一件事:把复杂的三相交流电机,通过数学变换,变成简单的直流电机来控制。
整个变换链路是:三相电流两相静止电流两相旋转电流
本章我们只专注讲第一个变换:Clark 变换(Clarke Transform)
1. 为什么要做 Clark 变换?
1.1 原始问题:三相系统不好控制
电机三相绕组 U、V、W 在空间上互差 120°,电流满足:Iu+Iv+Iw=0这是一个三维耦合系统,三个变量不独立,直接控制非常困难:
- 无法单独控制 “力矩”
- 无法单独控制 “磁场”
- 调节器设计复杂,无直观物理意义
1.2 目标:降维 + 解耦
Clark 变换的作用只有一句话:
把三相静止坐标系(abc),等效变换为两相静止坐标系(αβ)用两个正交分量,完整表达原来三个量的全部信息
好处:
- 三维 → 二维,计算量大幅下降
- α、β 轴正交,互不干扰
- 为下一步 Park 变换做准备,最终实现 d/q 解耦控制
简单理解:Clark 变换就是 “三相交流电的正交降维投影”。
2. 三相电流约束关系
三相无刷电机为星形接法(Y 型),中线不引出,所以:
Iu+Iv+Iw=0
这意味着三个电流不是独立变量,只需要两个电流就能完全确定第三个。这也是 Clark 变换能够成立的数学前提。
实际工程中:
- 三电阻采样:直接采 Iu、Iv、Iw
- 双电阻采样:采 Iu、Iv,Iw = -Iu-Iv
- 单电阻采样:通过 PWM 时序重构三相电流
3. Clark 变换标准公式推导
3.1 坐标定义
- a 轴 ≡ U 相
- b 轴滞后 a 轴 120°
- c 轴滞后 b 轴 120°
α 轴与 a(U)轴重合,β 轴超前 α 轴 90°。
3.2 等幅变换
3.3 为什么系数是 2/3?
为了保证:变换前后电流幅值不变即 “等幅值变换”,这样电流环 PID 参数更直观,和实际物理量一致。
如果用 1/√3 系数,是等功率变换,一般用于电力分析,电机控制极少用。
4. 简化形式(利用 Iu+Iv+Iw=0)
因为Iw=−Iu−Iv代入可以把公式进一步简化,只需要 Iu、Iv 两个量。
代入后:Iα=Iu
工程上非常常用,因为很多硬件只采两相电流。
5. 反 Clark 变换(αβ → abc)
在 FOC 最后一步,需要把控制电压从 αβ 变回三相,所以反变换也必须掌握。
6. Clark 变换代码实(STM32 浮点版)
6.1 完整三相输入版本(标准形式)
#include "math.h" /** * @brief Clark 变换 (三相电流 → αβ 坐标系) * @param Iu, Iv, Iw: 采样得到的三相电流 * @param Ialpha, Ibeta: 输出两相静止电流 */ void Clark_Transform(float Iu, float Iv, float Iw, float *Ialpha, float *Ibeta) { // 等幅值 Clark 变换 *Ialpha = (2.0f / 3.0f) * (Iu - 0.5f*Iv - 0.5f*Iw); *Ibeta = (2.0f / 3.0f) * ((sqrtf(3)/2.0f)*Iv - (sqrtf(3)/2.0f)*Iw); }6.2 简化版(只采两相电流)
实际项目 90% 都是双电阻 / 单电阻采样,只给 Iu、Iv:
void Clark_Transform_Simplify(float Iu, float Iv, float *Ialpha, float *Ibeta) { // 由 Iw = -Iu - Iv 推导 *Ialpha = Iu; *Ibeta = (Iu + 2.0f * Iv) / sqrtf(3.0f); }6.3 反 Clark 变换代码
void Inv_Clark(float Valpha, float Vbeta, float *Vu, float *Vv, float *Vw) { *Vu = Valpha; *Vv = -0.5f * Valpha + (sqrtf(3)/2.0f) * Vbeta; *Vw = -0.5f * Valpha - (sqrtf(3)/2.0f) * Vbeta; }7. 定点优化版本(适合无 FPU 单片机)
如果你的芯片是 STM32F103 之类,浮点运算慢,可以用定点 Q 格式,提前把系数存为常数:
// 系数放大 2^15 定点化 #define SQRT3_2 28377 // sqrt(3)/2 * 32768 #define _2_SQRT3 37837 // 2/sqrt(3) * 32768 #define _1_2 16384 // 1/2 * 32768 void Clark_Fixed(int16_t Iu, int16_t Iv, int16_t Iw, int16_t *Ialpha, int16_t *Ibeta) { *Ialpha = (2*(Iu - ((Iv*_1_2)>>15) - ((Iw*_1_2)>>15))) / 3; *Ibeta = ((Iv*SQRT3_2)>>15) - ((Iw*SQRT3_2)>>15); }实际工程一般都用浮点版,代码清晰、调试方便,F1 以上都跑得动。
8. 物理意义直观理解(非常重要)
很多人会背公式,但不知道 α、β 到底代表什么:
- Iα:与 U 相同向的磁场分量
- Iβ:垂直于 U 相的磁场分量
两者合成一个在空间静止不动、但大小随时间正弦变化的磁场矢量。
而 FOC 要做的,就是把这个静止的矢量,通过 Park 变换,变成随转子一起旋转的矢量,从而得到:
- Id:励磁电流(磁场强弱)
- Iq:转矩电流(力气大小)
9. 常见工程陷阱(避坑指南)
9.1 电流采样相位反了
如果采样运放是反向输出,Iu、Iv、Iw 会出现负号,直接导致:
- FOC 失控
- 电机抖动、啸叫
解决:在 Clark 前加一句:
Iu = -Iu; Iv = -Iv;9.2 忘记电流偏置
ADC 采样一般是单极性,会叠加 1.65V/2.5V 偏置,必须先减去直流偏置,再进入 Clark。
Iu = ADC_GetValue(ADC_U) - CURRENT_OFFSET; Iv = ADC_GetValue(ADC_V) - CURRENT_OFFSET;9.3 坐标系定义不统一
- 有的电机 α 轴对齐 U 相
- 有的对齐 V 相
- 有的电角度定义相反
表现:
- 电机能转,但力矩小
- 高速抖动
- 电流环不稳定
解决:整套 FOC 从 Clark → Park → SVPWM 必须使用同一套坐标系,不能混用。
9.4 sqrtf 与 sinf 精度问题
尽量用sqrtf()、sinf()单精度浮点,不要用 double,速度差几倍。
10. 本章总结
Clark 变换是 FOC 的第一道数学大门,核心要点就 4 条:
- 作用:三相 abc → 两相 αβ,降维、解耦
- 公式:记住等幅值变换 2/3 系数
- 简化版:只采两相电流,Iα=Iu,Iβ=(Iu+2Iv)/√3
- 代码:浮点清晰易调试,定点适合低配 MCU
学完 Clark,你已经完成了 FOC 三分之一的工作。但 αβ 仍然是静止坐标系,还做不到像直流电机一样简单控制。
