/*************************************************** * 文件名: phase2_brake_sm.h * 摘 要:二次谐波制动状态机 — 显式状态定义 (Phase 2) * * Phase 2 变更: * 1. 将 faFdBrakeJudge 中的 3 个 static 状态变量 * + 2 个计数器封装为 BrakeSM 结构体 * 2. 状态定义从隐含的变量组合变为显式枚举 * 3. 支持多馈线实例化(faFdRunPara[fd] 对应的状态机) * * 用法: * BrakeSM brakeSM[FA_FD_NUM]; // 全局或放在 faFdInfo 中 * faFdBrakeJudge_Run(&brakeSM[fd], fd); ***************************************************/ #ifndef _PHASE2_BRAKE_SM_H #define _PHASE2_BRAKE_SM_H #include #ifdef __cplusplus extern "C" { #endif /*========================================================================== * 显式状态定义 *==========================================================================*/ /** @brief 二次谐波制动状态机状态 */ typedef enum { BRAKE_IDLE = 0, // 空闲:未检测到过流,未启动制动 BRAKE_JUDGING = 1, // 判断中:过流已触发,正在判断谐波条件 BRAKE_ACTIVE = 2, // 制动中:谐波条件满足,正在执行制动 BRAKE_EXITING = 3, // 退出中:谐波制动超时或谐波消失,去抖退出 } BrakeState; /*========================================================================== * 状态机结构体 *==========================================================================*/ /** @brief 二次谐波制动状态机上下文 */ typedef struct { BrakeState state; // 当前状态 BYTE debounceEnter; // 进入制动去抖计数(Phase 1: inbrake) BYTE debounceExit; // 退出制动去抖计数(Phase 1: outbrake) WORD timeoutCount; // 判断超时计数(Phase 1: BrakeJudgeCount) BOOL brakeDone; // 制动周期已完成(Phase 1: BrakeJudgeEnd) } BrakeSM; /*========================================================================== * 去抖/超时参数 *==========================================================================*/ #define BRAKE_ENTER_DEBOUNCE_MAX 5 // 进入制动最大去抖计数 #define BRAKE_EXIT_DEBOUNCE_MAX 20 // 退出制动最大去抖计数 #define BRAKE_JUDGE_TIMEOUT_MAX 100 // 判断状态最大超时计数 /*========================================================================== * 状态机函数 *==========================================================================*/ /** * @brief 运行一次状态机(每周期调用) * @param sm 状态机指针 * @param fd 馈线号 * @return TRUE=制动中, FALSE=非制动 * * 状态转移: * BRAKE_IDLE → 过流触发 → BRAKE_JUDGING * BRAKE_JUDGING → 谐波满足 → BRAKE_ACTIVE * BRAKE_ACTIVE → 谐波消失+去抖 → BRAKE_EXITING * BRAKE_EXITING → 去抖完成 → BRAKE_IDLE * BRAKE_JUDGING → 超时 → BRAKE_EXITING */ BOOL faFdBrakeJudge_Run(BrakeSM* sm, BYTE fd); /** * @brief 复位状态机 * @param sm 状态机指针 * @param fd 馈线号 */ void faFdBrakeJudge_Reset(BrakeSM* sm, BYTE fd); #ifdef __cplusplus } #endif /* extern "C" */ #endif /* _PHASE2_BRAKE_SM_H */