打印
[电机控制专用MCU]

APM32M3514 FOC算法解析系列——第3篇:FOC算法模块

[复制链接]
634|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 a976209770 于 2024-12-27 20:08 编辑

1. FOC算法模块概述
FOC(无传感器磁场定向控制)是一种高效的电机控制方法,它通过直接控制电机的磁场方向来实现高精度的转速和位置控制。在 APM32M3514 电机控制系统中,FOC算法结合了电流环、速度环、以及SVPWM(空间矢量脉宽调制)技术,从而实现对电机的精确控制。

1.1 关键功能
  • 电流环控制:确保电机输出的力矩与电流成正比。
  • 速度环控制:控制电机的转速,通过调整电流命令值来实现目标速度。
  • SVPWM调制:通过生成合适的PWM信号来控制逆变器,从而实现对电机相电流的精确控制。

2. FOC算法模块的文件结构

2.1 关键文件
  • MOTOR_CONTROL/FOC_Ctrl.c:
    • 该文件实现了FOC算法的核心功能,包括电流环控制、速度环控制、SVPWM调制等。
    • 文件中包括了 PI控制器 的实现和 空间矢量脉宽调制(SVPWM) 的生成函数。
  • MOTOR_CONTROL/inc/FOC_Ctrl.h:
    • 该头文件声明了FOC算法所需要的函数原型。
    • 包含电流环、速度环控制的函数声明,及SVPWM函数的声明。


3. 电流环和速度环控制的实现
3.1 电流环控制
电流环控制是FOC算法的核心部分,电流环的作用是调节电机的转矩。通过测量电机的电流并与参考电流进行比较,PI控制器将调整电流命令,以确保电机产生正确的转矩。
FOC_Ctrl.c 中,电流环的实现代码如下:
void current_ctrl(Motor_TypeDef *Motor)
{
    clarke(&Motor->Foc.stc_Iuvw, &Motor->Foc.stc_Iab); // Clarke 变换
    park(&Motor->Foc.stc_Iab, &Motor->Foc.stc_SinCos, &Motor->Foc.stc_Idq); // Park 变换

    /* PI 控制器用于 D 轴电流 */
    Motor->stc_IdPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_D - Motor->Foc.stc_Idq.s16q15_D;
    anti_pi(&Motor->stc_IdPi);

    Motor->Foc.stc_Vdq.s16q15_D = Motor->stc_IdPi.s32_Out;

    /* 限制 Vq 的最大值 */
    uint32_t u32_Temp;
    int16_t s16q15Vmax = Motor->Foc.s16Vbus * 18918 >> 15; // Vmax = Vbus / sqrt(3)
    u32_Temp = s16q15Vmax * s16q15Vmax
               - Motor->Foc.stc_Vdq.s16q15_D * Motor->Foc.stc_Vdq.s16q15_D;
    Motor->stc_IqPi.s32_Umax = isqrt32(u32_Temp);
    Motor->stc_IqPi.s32_Umin = -Motor->stc_IqPi.s32_Umax;

    /* PI 控制器用于 Q 轴电流 */
    Motor->stc_IqPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_Q - Motor->Foc.stc_Idq.s16q15_Q;
    anti_pi(&Motor->stc_IqPi);

    Motor->Foc.stc_Vdq.s16q15_Q = Motor->stc_IqPi.s32_Out;

    /* 逆 Park 变换 */
    inv_park(&Motor->Foc.stc_Vdq, &Motor->Foc.stc_SinCos, &Motor->Foc.stc_Vab);
}

电流环控制流程
  • 误差计算:计算实际电流与目标电流(IqRef 和 IdRef)之间的差值。
  • PI控制:使用PI控制器对误差进行调节,输出控制量(Iq_control 和 Id_control)。
  • 电流命令输出:根据PI控制器的输出,调整电流参考值,控制逆变器的PWM输出。

PI控制器PI控制器通过调节比例(P)和积分(I)参数,确保电流误差最小化。PI控制器的计算代码如下:
Motor->stc_IdPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_D - Motor->Foc.stc_Idq.s16q15_D;
anti_pi(&Motor->stc_IdPi);
Motor->Foc.stc_Vdq.s16q15_D = Motor->stc_IdPi.s32_Out;
Motor->stc_IqPi.s16_Error = Motor->Foc.stc_IdqCmd.s16q15_Q - Motor->Foc.stc_Idq.s16q15_Q;
anti_pi(&Motor->stc_IqPi);
Motor->Foc.stc_Vdq.s16q15_Q = Motor->stc_IqPi.s32_Out;

KpKi 为比例和积分增益,控制器根据误差调整电流输出。

3.2 速度环控制
速度环控制是FOC算法的另一重要组成部分,其作用是控制电机的转速,确保电机运行在目标速度下。
速度环控制实现的核心思想是:根据目标速度(s16SpdCmd)和实际速度(s16SpeedActual)之间的误差,调整电流(IqRef)来调节电机的转速。
FOC_Ctrl.c 中,速度环的实现代码如下:
static void M1_RunSpinSlow(void)
{
    Motor_type.Foc.u16q15VdqSqrt = isqrt32((uint32_t)(Motor_type.Foc.stc_Vdq.s16q15_D * Motor_type.Foc.stc_Vdq.s16q15_D + Motor_type.Foc.stc_Vdq.s16q15_Q * Motor_type.Foc.stc_Vdq.s16q15_Q));
    Motor_type.Foc.s16SpeedRamp = ramp_s16(Motor_type.Foc.s16SpdCmd,&stc_SpdRamp);
    /*  low pass filter for speed, Fc : 200Hz*/
    Motor_type.Foc.s16SpdFilt = (Motor_type.Foc.s16SpdFilt*14521 + Motor_type.stc_SmoPara.s16q15SpdObs*18247) >> 15;
    /*  pi for speed    */
    Motor_type.stc_SpdPi.s16_Error = Motor_type.Foc.s16SpeedRamp - Motor_type.Foc.s16SpdFilt;
    anti_pi(&(Motor_type.stc_SpdPi));
    /*  set Id/q command    */
    Motor_type.Foc.stc_IdqCmd.s16q15_Q = Motor_type.stc_SpdPi.s32_Out;
    Motor_type.Foc.stc_IdqCmd.s16q15_D = 0;
   
    if((abs(Motor_type.Foc.s16SpeedRamp)<Motor_type.User.u16FreeWheelSpdCmd) && (abs(Motor_type.Foc.s16SpdCmd)<Motor_type.User.u16FreeWheelSpdCmd))
    {
        M1_SwitchRunSpinFreewheel();
    }
}

速度环控制流程
  • 误差计算:计算目标速度与实际速度之间的差值。
  • PI控制:通过PI控制器调节速度误差,输出电流参考(IqRef),用于电流环控制。


4. SVPWM(空间矢量脉宽调制)生成逻辑
SVPWM 是一种高效的调制方法,用于控制逆变器输出的三相电压,从而控制电机的转矩和速度。SVPWM 通过选择合适的矢量组合,实现逆变器的PWM信号生成,从而控制电机的相电流。

4.1 SVPWM生成代码
在控制中,SVPWM的实现的部分代码如下:
void PWM_CompareConfig(uint16_t usCmpA,uint16_t usCmpB,uint16_t usCmpC)
{
  PWM_CMPR1 = usCmpA;//A相比较值点
  PWM_CMPR2 = usCmpB;//B相比较值点
  PWM_CMPR3 = usCmpC;//C相比较值点

  PWM_CMPR1_CC1C = usCmpA;//A相比较值点
  PWM_CMPR2_CC2C = usCmpB;//B相比较值点
  PWM_CMPR3_CC3C = usCmpC;//C相比较值点
}


SVPWM生成流程
  • 计算电压矢量:根据电流命令值(Iq_control 和 Id_control)以及转子角度(Theta),计算空间矢量的V_alpha和V_beta分量。
  • 计算PWM占空比:根据电压矢量分量计算PWM占空比,最终生成三相电机驱动的PWM信号。


5. 参考速度(s16SpdCmd)的作用
参考速度 s16SpdCmd 是系统输入的重要参数,表示用户期望的电机转速。通过速度环控制,s16SpdCmd 和实际速度之间的误差被PI控制器调节,生成电流参考(IqRef)。电流参考进一步影响电机的力矩输出。


5.1 参考速度与电流控制的关系
// 更新电流参考
IqRef = speed_control;  // 速度环输出影响电流参考值
功能说明
  • 目标速度 s16SpdCmd 影响 IqRef 的值,最终通过电流控制系统调节电机的转矩。


6. FOC控制算法的整体流程
整个 FOC 控制过程由多个环节和函数协同工作,包含坐标变换、电流控制、速度控制、以及PWM生成。以下是整个算法的整体流程:



流程图详细描述
  • 开始
    • 系统开始执行FOC算法。
  • 读取电流反馈(Iu, Iv, Iw)
    • 从电流传感器获取三相电流反馈。
  • Clarke变换(Iu, Iv 到 Ialpha, Ibeta)
    • Clarke变换将三相电流(Iu, Iv, Iw)转换为 α-β 轴电流(Ialpha, Ibeta)。
    • 变换公式:Ialpha=IuIbeta=(Iu+2∗Iv)/√3Ialpha = IuIbeta = (Iu + 2 * Iv) / √3
  • Park变换(Ialpha, Ibeta 到 Id, Iq)
    • 使用 Park 变换将 α-β 电流转换到 d-q 轴电流(Id, Iq)。
    • 变换公式:Id=Ialpha∗cos(θ)+Ibeta∗sin(θ)Iq=−Ialpha∗sin(θ)+Ibeta∗cos(θ)Id = Ialpha * cos(θ) + Ibeta * sin(θ)Iq = -Ialpha * sin(θ) + Ibeta * cos(θ)
  • 电流环控制 PI
    • 对 Id 和 Iq 进行 PI 控制,确保电机的转矩和磁场方向精确控制。
    • PI 控制函数会计算出新的电流控制命令。
  • 速度环控制 PI
    • 计算目标速度 s16SpdCmd 与实际速度 s16SpeedActual 之间的误差,采用 PI 控制调节速度。
    • 输出控制信号作为电流参考 IqRef。
  • 计算电流参考 IqRef
    • 根据速度环的输出结果调节 IqRef,调整电流参考,以实现目标转速。
  • 滑模观测器估算转子角度和速度
    • 使用滑模观测器或其他无传感器方法估算转子的位置和速度。
    • 结合电流和电压的反馈信息估算转子位置 (Theta) 和转速 (Speed)。
  • 计算电压矢量 Vd, Vq
    • 根据电流参考 IqRef 和 IdRef 计算电机的电压矢量 Vd 和 Vq,这将用来控制逆变器的输出。
  • SVPWM生成
    • 使用 SVPWM(空间矢量脉宽调制)生成逆变器控制的PWM信号,控制电机的相电流。
    • 通过逆变器调整电机相电压,从而实现对电机转速和转矩的控制。
  • 计算PWM占空比
    • 根据 Vd 和 Vq 计算电压矢量的占空比,调节PWM信号。
  • 生成PWM信号
    • 生成适用于逆变器的PWM信号,调整逆变器的开关状态。
  • 控制逆变器输出三相电压
    • 通过控制逆变器的三相电压,最终控制电机的运行。
  • 驱动电机
    • 输出的三相电压驱动电机旋转。
  • 监测电机状态
    • 系统实时监测电机的运行状态,确保电机在正常工况下运行。
  • 状态切换判断
    • 如果检测到停止命令或错误(如过流、过压等),则切换电机的状态。
    • 如果没有错误或停止命令,则继续运行。
  • 切换到新状态
    • 当发生故障或需要停机时,系统会切换到适当的状态,如 RunState_Freewheel(空转状态)或 RunState_Stop(停止状态)。
  • 继续控制电机
    • 如果没有发生状态切换,则系统继续按照FOC算法控制电机。

7. 总结
在本篇文章中,详细介绍了 APM32M3514FOC控制算法 模块的实现,包括电流环控制、速度环控制、SVPWM生成和转子角度估算。通过结合实际代码和流程图,可以更清晰地理解 FOC 算法的工作原理及其实现过程。
FOC 算法的成功实现依赖于多个关键环节的协调工作,包括坐标变换、电流调节、速度控制、转子角度估算和PWM调制等。通过这些步骤,系统能够精确控制电机的转速和转矩。








使用特权

评论回复
沙发
dongnanxibei| | 2024-12-27 08:25 | 只看该作者
太给力了,最近学电机呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

40

帖子

0

粉丝