打印
[电机控制专用MCU]

APM32M3514 FOC算法解析系列——第2篇:状态机模块解析

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

1. 主状态机和子状态机概述

APM32M3514 电机控制系统中,状态机是实现不同电机控制功能的关键。它通过主状态(MainState_*)和子状态(RunState_*)之间的切换,管理电机的启动、运行、故障处理等不同阶段。
代码结构
  • 主状态:管理系统的高层行为,如初始化、停止、运行和故障处理。
  • 子状态:管理运行阶段中的各个步骤,如校准、准备、对准、启动、旋转、空转。
关键文件
  • StateMachine.c:主状态机逻辑的实现。
  • StateMachine.h:状态和子状态的定义。


2. 主状态机的实现
APM32M3514 中,主状态机控制着系统的各个阶段,它通过 枚举类型 来定义不同的状态。

2.1 主状态定义在 StateMachine.h 中,主状态通过枚举类型进行定义:
typedef enum {
    MainState_Init = 0,   // 初始化状态
    MainState_Stop,       // 停止状态
    MainState_Run,        // 运行状态
    MainState_Fault       // 故障状态
} MainState_TypeDef;
2.2 主状态切换
主状态的切换逻辑通常通过 switch 语句进行判断,并在不同条件下执行状态转移。

MainState_TypeDef mainState = MainState_Init;  // 默认进入初始化状态

// 状态机主循环
while (1) {
    switch (mainState) {
        case MainState_Init:
            // 执行初始化操作
            System_Init();
            mainState = MainState_Stop;  // 初始化完成后切换到停止状态
            break;

        case MainState_Stop:
            // 执行停止操作,等待启动命令
            if (start_command) {
                mainState = MainState_Run;  // 收到启动命令,切换到运行状态
            }
            break;

        case MainState_Run:
            // 执行运行逻辑,电机工作
            RunMotor();
            if (fault_detected) {
                mainState = MainState_Fault;  // 如果检测到故障,切换到故障状态
            }
            break;

        case MainState_Fault:
            // 执行故障处理
            HandleFault();
            if (reset_command) {
                mainState = MainState_Stop;  // 故障处理完成后,切换到停止状态
            }
            break;

        default:
            // 默认状态
            mainState = MainState_Init;
            break;
    }
}

2.3 主状态切换条件
  • MainState_Init 到 MainState_Stop
    • 通过 System_Init() 函数完成系统初始化,初始化完成后切换到 MainState_Stop。
  • MainState_Stop 到 MainState_Run
    • 在停止状态下,系统等待用户启动命令(如通过按键或串口命令)。接收到启动命令后,系统切换到运行状态。
  • MainState_Run 到 MainState_Fault
    • 在运行过程中,如果发生故障(如过流、过压等),则通过 fault_detected 标志进入故障状态 MainState_Fault。
  • MainState_Fault 到 MainState_Stop
    • 故障处理完成后,接收到复位命令 reset_command 后,系统切换回停止状态。

3. 子状态机的实现
在 MainState_Run 状态下,系统会根据不同的条件进入多个子状态。这些子状态用于处理电机的不同运行阶段,如电流校准、准备、对准、启动和旋转。

3.1 子状态定义
子状态通过枚举类型进行定义,放在 StateMachine.h 中:
typedef enum {
    RunState_Calib = 0,    // 校准状态
    RunState_Ready,        // 准备状态
    RunState_Align,        // 对准状态
    RunState_Startup,      // 启动状态
    RunState_Spin,         // 旋转状态
    RunState_Freewheel     // 空转状态
} RunState_TypeDef;

3.2 子状态切换
在 StateMachine.c 中,子状态的切换通常通过条件判断和执行相应的操作来实现。
RunState_TypeDef runState = RunState_Calib;  // 默认进入校准状态

// 运行状态子状态机
while (mainState == MainState_Run) {
    switch (runState) {
        case RunState_Calib:
            // 执行电流校准
            CalibrateCurrent();
            runState = RunState_Ready;  // 校准完成后切换到准备状态
            break;

        case RunState_Ready:
            // 执行准备操作,确保电机处于可运行状态
            PrepareMotor();
            runState = RunState_Align;  // 准备完成后切换到对准状态
            break;

        case RunState_Align:
            // 执行电机对准操作
            AlignMotor();
            runState = RunState_Startup;  // 对准完成后切换到启动状态
            break;

        case RunState_Startup:
            // 执行开环启动操作
            StartupMotor();
            runState = RunState_Spin;  // 启动完成后切换到旋转状态
            break;

        case RunState_Spin:
            // 电机进入闭环运行,进行转速控制
            SpinMotor();
            if (stop_command) {
                runState = RunState_Freewheel;  // 如果收到停止命令,切换到空转状态
            }
            break;

        case RunState_Freewheel:
            // 电机进入空转状态,等待停机
            FreewheelMotor();
            runState = RunState_Ready;  // 空转完成后,返回准备状态
            break;

        default:
            runState = RunState_Calib;  // 默认状态,回到校准状态
            break;
    }
}

3.3 子状态切换条件
  • RunState_Calib 到 RunState_Ready
    • 校准完成后,系统进入准备状态,准备执行电机的其他操作。
  • RunState_Ready 到 RunState_Align
    • 电机准备好后,进入对准状态,确保电机转子和定子磁场对齐。
  • RunState_Align 到 RunState_Startup
    • 电机完成对准后,进入启动状态,执行开环启动。
  • RunState_Startup 到 RunState_Spin
    • 电机启动完成后,进入旋转状态,闭环控制开始。
  • RunState_Spin 到 RunState_Freewheel
    • 如果接收到停止命令,电机进入空转状态,等待停止。
  • RunState_Freewheel 到 RunState_Ready
    • 电机停止后,进入准备状态,准备再次启动。

4. 状态机的工作流程
4.1 系统流程图
通过主状态和子状态之间的切换,整个系统能够根据电机的不同工作阶段执行相应的控制逻辑。以下是整个状态机的简化流程图:



5. 状态机的交互与集成
状态机通过与主程序的主循环和外设驱动模块的交互,实现电机的高效控制。在整个流程中,状态机负责控制系统的高层次行为,而外设驱动层则负责具体的硬件操作(如PWM控制、ADC采样等)。

状态机与外设驱动层的交互
  • PWM控制:根据当前子状态(如 RunState_Spin),状态机通过设置PWM输出控制电机的转速。
  • ADC采样:状态机在 RunState_Spin 等状态下触发ADC采样,用于反馈电流和电压,保证电机在闭环控制下运行。
中断管理状态机还通过中断处理(如TMR1中断、ADC中断等)与外设驱动层协作,确保系统实时响应电流和速度变化。例如,ADC中断会触发电流采样并更新电机控制参数。

6. 总结
通过结合实际代码,详细解析了 APM32M3514 电机控制系统中的主状态机和子状态机的工作原理。主状态机负责电机控制的高层逻辑,而子状态机则通过细化控制步骤,管理电机的每个操作阶段。





使用特权

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

本版积分规则

35

主题

38

帖子

0

粉丝