Clarke变换
一、课程目标
本讲旨在深入理解FOC(磁场定向控制)算法中的第一个关键坐标变换—— Clarke变换 。我们将从物理意义出发,完成数学推导,并最终给出在嵌入式系统中的C语言实现。学完本讲,你将能够:
- 理解三相静止坐标系(ABC)与两相静止坐标系(α-β)的物理关系。
- 掌握Clarke变换的两种形式(等幅值变换与等功率变换)的推导过程。
- 在脑海中构建清晰的坐标变换空间矢量图。
- 编写出高效、准确的Clarke变换C代码,并应用于实际电机控制项目。
二、物理意义与几何解释
三相无刷电机的三个定子绕组(A, B, C)在空间上互差120度。我们测得的是三个随时间正弦变化、相位互差120度的相电流(, , )。
Clarke变换的核心思想 :将这三个互相关联的变量,等效为两个在空间上垂直(90度)的独立变量。这大大简化了后续的分析与控制。
上图清晰地展示了:一个在空间旋转的电流矢量 ,既可以由它在A, B, C三个轴上的分量(, , )来描述,也可以由它在两个垂直轴α, β上的分量(, )来描述。Clarke变换就是求解 和 的过程。
三、数学推导(等幅值变换)
我们假设三相电流是平衡的(和为0),即:
为了将矢量 投影到α轴(与A轴重合)和β轴(超前α轴90度)上,我们进行几何分解:
推导步骤:
- 分量 :直接等于 在α轴上的投影,加上 和 在α轴上的投影。 与 α 轴夹角为 -120°,投影为 。 与 α 轴夹角为 120°,投影为 。 因此: 。
- 分量 : 在β轴投影为0。 在β轴投影为 。 在β轴投影为 。 因此: 。
- 利用 ,可以简化 表达式:将 代入,可得 。
最终,得到最常用的 等幅值变换 公式:
为了便于嵌入式计算,常将系数进行归一化处理,写成矩阵形式:
四、变换形式对比
| 变换类型 | 核心特点 | 变换矩阵 | 应用场景 |
|---|---|---|---|
| 等幅值变换 | 变换前后电流矢量的幅值保持不变 | 最常用,计算简单,便于理解 | |
| 等功率变换 | 变换前后系统的功率保持不变 | 对功率计算要求严格的系统 | |
| 讲师提示:在绝大多数FOC应用(如无人机电调、伺服驱动器)中,使用等幅值变换即可。因为后续的Park变换和SVPWM会进行相应的系数调整,最终控制效果是一致的。等幅值变换计算量更小。 |
五、C语言实现(嵌入式级优化)
在STM32等MCU中,我们通常使用定点数运算以提高速度。以下是一个经过优化的Clarke变换函数实现:
/**
* @brief Clarke变换 (等幅值变换)
* @param iA, iB: 两相采样电流值 (通常假设 iA + iB + iC = 0,故只采样两相)
* @param pIalpha, pIbeta: 输出 alpha-beta 轴电流变量指针
* @note 使用 Q15 定点格式 (1.15),sqrt(3)/3 ≈ 0.57735,对应 Q15 值为 18918
* 输入电流值建议也缩放至 Q15 范围(例如,对应ADC采样的范围)
*/
void Clarke_Transform(int16_t iA, int16_t iB, int16_t *pIalpha, int16_t *pIbeta)
{
/* 等幅值变换公式:
Ialpha = Ia
Ibeta = (Ia + 2*Ib) / sqrt(3) 或 (Ia/sqrt(3)) + (2*Ib/sqrt(3))
这里采用: Ibeta = (Ia + 2*Ib) * (1/sqrt(3))
1/sqrt(3) ≈ 0.57735026919
在Q15中表示为 0.57735 * 32768 = 18918
*/
int32_t tmp1;
// Ialpha = Ia (直接赋值,注意范围)
*pIalpha = iA;
// 计算 Ibeta = (Ia + 2*Ib) * 18918 >> 15
// 先计算 Ia + 2*Ib,使用32位防止溢出
tmp1 = (int32_t)iA + ((int32_t)iB << 1); // iA + 2*iB
// 乘以系数 18918 (0x49E6),然后右移15位完成Q15乘法
tmp1 = (tmp1 * 18918) >> 15;
// 将结果限制在16位范围内(可选,根据实际需求)
if(tmp1 > 32767) tmp1 = 32767;
if(tmp1 < -32768) tmp1 = -32768;
*pIbeta = (int16_t)tmp1;
/* 另一种等价写法(使用查表或汇编指令优化乘法的场合):
*pIbeta = (int16_t)(((int32_t)iA * 18918 + (int32_t)iB * 37836) >> 15);
*/
}
/*********************** 使用示例 **************************
int16_t Ia, Ib; // 假设从ADC读取并校准后的电流值,范围-32768~32767对应-Imax~Imax
int16_t Ialpha, Ibeta;
// 假设 Ia = 10000, Ib = -5000 (满足 Ia+Ib+Ic=0, 则 Ic = -5000)
Clarke_Transform(Ia, Ib, &Ialpha, &Ibeta);
// 此时 Ialpha = 10000, Ibeta ≈ (10000 + 2*(-5000)) * 0.57735 ≈ 0
************************************************************/六、在FOC算法中的位置
让我们通过一个软件架构图,看清Clarke变换在整体FOC控制环路中的角色:
如图所示,Clarke变换紧随ADC电流采样之后,是将真实的、三相的、时变的电流信号,转化为便于数学处理的二维正交变量的第一步。它的输出(, )将直接送入下一讲要学习的 Park变换 ,从而得到在旋转坐标系下的直轴电流 和交轴电流 。
七、要点总结与练习题
核心要点:
- 目的 :三相→两相,简化系统,为后续变换做准备。
- 前提 :三相电流平衡,和为0。因此通常只需采样两相电流。
- 关键 :理解等幅值变换的物理意义与几何推导。
- 实现 :使用定点数运算,注意系数定标和防止溢出。
练习题:
- 假设在某时刻,测得 , , 。请手动计算 和 。
- 为什么在嵌入式代码中,我们经常使用 这个公式来计算 ,而不是 ?
- 尝试将本讲提供的C函数,修改为使用浮点数运算的版本,并比较两者的优缺点。
(答案将在下一讲开始时公布)