本帖最后由 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 电机控制系统中的主状态机和子状态机的工作原理。主状态机负责电机控制的高层逻辑,而子状态机则通过细化控制步骤,管理电机的每个操作阶段。
|