grace@dev-site:~$write
← blog/

STM32 FOC 电机控制入门

STM32FOC电机控制嵌入式C

从零理解磁场定向控制(FOC)的基本原理,以及如何在 STM32 上实现 Clark/Park 变换与 PI 调速器。

STM32 FOC 电机控制入门

磁场定向控制(Field-Oriented Control,FOC)是控制永磁同步电机最精准的方式之一。本文介绍基本原理和 STM32 实现思路。

什么是 FOC?

传统 PWM 直接控制相电压,而 FOC 将三相电流投影到旋转坐标系,独立控制产生转矩的电流分量(iqi_q)和产生磁通的电流分量(idi_d),从而实现精准力矩控制。

坐标变换

Clarke 变换(三相 → 两相静止)

[iαiβ]=23[1121203232][iaibic]\begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix} = \frac{2}{3} \begin{bmatrix} 1 & -\frac{1}{2} & -\frac{1}{2} \\ 0 & \frac{\sqrt{3}}{2} & -\frac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} i_a \\ i_b \\ i_c \end{bmatrix}
void Clarke_Transform(float ia, float ib, float *alpha, float *beta)
{
    *alpha = ia;
    *beta = (ia + 2.0f * ib) / 1.732051f;
}

Park 变换(静止 → 旋转)

[idiq]=[cosθsinθsinθcosθ][iαiβ]\begin{bmatrix} i_d \\ i_q \end{bmatrix} = \begin{bmatrix} \cos\theta & \sin\theta \\ -\sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} i_\alpha \\ i_\beta \end{bmatrix}
void Park_Transform(float alpha, float beta, float theta, float *id, float *iq)
{
    float cos_t = arm_cos_f32(theta);
    float sin_t = arm_sin_f32(theta);
    *id = alpha * cos_t + beta * sin_t;
    *iq = -alpha * sin_t + beta * cos_t;
}

PI 控制器

typedef struct {
    float Kp, Ki;
    float integral;
    float out_max;
} PI_Controller;

float PI_Update(PI_Controller *pi, float error, float dt)
{
    pi->integral += pi->Ki * error * dt;
    pi->integral = CLAMP(pi->integral, -pi->out_max, pi->out_max);
    float out = pi->Kp * error + pi->integral;
    return CLAMP(out, -pi->out_max, pi->out_max);
}

控制环路

FOC 通常有三个嵌套控制环:

  1. 电流环(最内层,最快):控制 idi_diqi_q,带宽约 1~5 kHz
  2. 速度环:控制转速,带宽约 50~200 Hz
  3. 位置环(最外层):控制角度,带宽约 10~50 Hz

总结

FOC 的关键是坐标变换 + PI 调节 + 精准角度测量。掌握这三点,就能在 STM32 上实现高性能电机控制。

下一篇将介绍如何对 PI 参数进行整定。

✏ 编辑此文章