Clarke变换

← 返回 FOC MOC | ← 返回主页


一、课程目标

本讲旨在深入理解FOC(磁场定向控制)算法中的第一个关键坐标变换—— Clarke变换 。我们将从物理意义出发,完成数学推导,并最终给出在嵌入式系统中的C语言实现。学完本讲,你将能够:

  • 理解三相静止坐标系(ABC)与两相静止坐标系(α-β)的物理关系。
  • 掌握Clarke变换的两种形式(等幅值变换与等功率变换)的推导过程。
  • 在脑海中构建清晰的坐标变换空间矢量图。
  • 编写出高效、准确的Clarke变换C代码,并应用于实际电机控制项目。

二、物理意义与几何解释

三相无刷电机的三个定子绕组(A, B, C)在空间上互差120度。我们测得的是三个随时间正弦变化、相位互差120度的相电流(, , )。

Clarke变换的核心思想 :将这三个互相关联的变量,等效为两个在空间上垂直(90度)的独立变量。这大大简化了后续的分析与控制。

上图清晰地展示了:一个在空间旋转的电流矢量 ,既可以由它在A, B, C三个轴上的分量(, , )来描述,也可以由它在两个垂直轴α, β上的分量(, )来描述。Clarke变换就是求解 和 的过程。

三、数学推导(等幅值变换)

我们假设三相电流是平衡的(和为0),即:

为了将矢量 投影到α轴(与A轴重合)和β轴(超前α轴90度)上,我们进行几何分解:

推导步骤:

  1. 分量 :直接等于 在α轴上的投影,加上 和 在α轴上的投影。 与 α 轴夹角为 -120°,投影为 。 与 α 轴夹角为 120°,投影为 。 因此: 。
  2. 分量 : 在β轴投影为0。 在β轴投影为 。 在β轴投影为 。 因此: 。
  3. 利用 ,可以简化 表达式:将 代入,可得 。

最终,得到最常用的 等幅值变换 公式:

为了便于嵌入式计算,常将系数进行归一化处理,写成矩阵形式:

四、变换形式对比

变换类型核心特点变换矩阵 应用场景
等幅值变换变换前后电流矢量的幅值保持不变最常用,计算简单,便于理解
等功率变换变换前后系统的功率保持不变对功率计算要求严格的系统
讲师提示:在绝大多数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。因此通常只需采样两相电流。
  • 关键 :理解等幅值变换的物理意义与几何推导。
  • 实现 :使用定点数运算,注意系数定标和防止溢出。

练习题:

  1. 假设在某时刻,测得 , , 。请手动计算 和 。
  2. 为什么在嵌入式代码中,我们经常使用 这个公式来计算 ,而不是 ?
  3. 尝试将本讲提供的C函数,修改为使用浮点数运算的版本,并比较两者的优缺点。

(答案将在下一讲开始时公布)