打印
[电机控制专用MCU]

APM32M3514 FOC算法解析系列——第5篇:基于中断的FOC快速环与慢速环实现

[复制链接]
81|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在无刷电机(BLDC)矢量控制(FOC)中,高性能和实时性是控制系统的核心要求。中断是实现实时响应的关键技术,特别是在APM32M3514芯片的无感矢量控制算法中,快速环与慢速环的设计与实现高度依赖中断的调度与执行。本篇文章将详细解析APM32M3514中基于中断的FOC控制策略,以及快速环和慢速环的具体实现。

一、FOC算法中的快速环与慢速环
1. 快速环(电流环)
  • 职责: 调节电机电流,确保目标电流与实际电流的误差最小。
  • 运行频率: 与PWM频率一致,通常在15kHz以上。
  • 实现方法:
    • 实时读取电流采样值(U相、V相)。
    • 调用PI控制器计算控制量。
    • 更新PWM占空比。
2. 慢速环(速度环)
  • 职责: 调节电机速度,生成目标电流值(如Iq_ref)。
  • 运行频率: 通常为1kHz。
  • 实现方法:
    • 获取当前速度和目标速度。
    • 调用PI控制器计算目标电流。
    • 将目标电流传递给快速环。

二、中断在FOC算法中的应用

在APM32M3514的FOC控制中,主要使用以下中断:
  • ADC中断: 负责采集电流和母线电压的实时数据,并驱动快速环状态机。
  • 定时器中断: 实现慢速环分频与状态切换。
  • 故障中断: 响应过流、欠压等硬件保护事件。

中断触发与执行顺序

  • ADC中断触发快速环:
    • 通过定时器的PWM更新事件触发ADC采样完成中断。
    • 在中断中读取电流数据,并调用快速环状态机。
  • 慢速环通过计数器分频执行:
    • 快速环中每执行一定次数,标记慢速环执行标志。
    • 慢速环在主循环中被调度。
  • 故障中断优先级最高:
    • 响应硬件保护信号,立即关闭PWM输出保护电机。


三、代码解析:快速环与慢速环

1. 快速环实现

快速环在ADC_COMP_IRQHandler中实现,核心逻辑如下:
代码片段
void ADC_COMP_IRQHandler(void)
{
    ADC->STS = ADC->STS; // 清除中断标志位
    static uint8_t u8ADCTimeCnt = 0;

    if (u16Cnt <= 127) // 偏移校准
    {
        u16Cnt++;
        u32IbSum += (int16_t)ADC_GetValue(CURR_CHANNEL_V);
        u32IaSum += (int16_t)ADC_GetValue(CURR_CHANNEL_U);
    }
    else if (u16Cnt == 128) // 完成校准
    {
        u32IbSum = u32IbSum >> 7;
        u32IaSum = u32IaSum >> 7;
        Motor_type.Foc.stc_IuvwOffset.s16q15_V = u32IbSum << 3;
        Motor_type.Foc.stc_IuvwOffset.s16q15_U = u32IaSum << 3;
    }
    else
    {
        /* 读取采样数据 */
        Get_ADC_Result(&Motor_type);

        /* 快速环状态机 */
        s_STATE_FAST[eM1_MainState]();
        
        /* 慢速环分频标志 */
        if (++u8ADCTimeCnt >= Motor_type.User.u16SlowLoopDiv)
        {
            u8ADCTimeCnt = 0;
            Motor_type.User.bSlowLoopFlag = 1;
        }
    }
}
逻辑分析
  • 电流采样与校准:
    • 通过ADC采集相电流,并进行偏移校准。
  • 快速环状态机调用:
    • 根据当前主状态eM1_MainState,调用快速环对应的函数(如M1_Run_Fast)。
  • 慢速环标志设置:
    • 每运行一定次数快速环,设置慢速环标志以触发慢速环。

2. 慢速环实现

慢速环由主循环调度,标志位bSlowLoopFlag控制其执行。
        if(Motor_type.User.bSlowLoopFlag)
        {
            WWDTFeedDog();
            /* Slow Loop Statemachine */
            s_STATE_SLOW[eM1_MainState]();
            Motor_type.User.bSlowLoopFlag =  0;
        }


逻辑分析
  • 慢速环标志检测:
    • 每此main循环检测标志bSlowLoopFlag是否置位。
  • 调用状态机函数:
    • 根据主状态eM1_MainState,调用对应的慢速环函数(如M1_Run_Slow)。



四、流程实现

以下为进入主循环后代码执行流程图



六、总结

  • 主流程:
    • 主函数负责系统初始化和主循环逻辑,其中主循环对慢速环标志进行检测并调用对应任务。
  • ADC 中断:
    • 负责快速环逻辑的核心实现,包括采样、PI控制器调用、PWM更新,以及分频触发慢速环。
  • TMR1 中断:
    • 负责硬件故障保护和计数器更新处理。




使用特权

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

本版积分规则

36

主题

39

帖子

0

粉丝