/*************************************************** * 文件名: phase2_brake_sm.c * 摘 要:二次谐波制动状态机 — 显式状态机实现 (Phase 2) * * 相对于 Phase 1 的变更: * [OK] static 局部变量 → BrakeSM 结构体 * [OK] 隐式状态组合 → 显式枚举状态 * [OK] 134 行混杂逻辑 → 4 状态 + 清晰转移 * [OK] 需要 extern SecHarOcStartFlag 声明迁移到结构中 * * 集成说明: * 1. 在调用方创建 BrakeSM brakeSM[FA_FD_NUM] 并初始化为 {BRAKE_IDLE,0,0,0,FALSE} * 2. 每周期调用 faFdBrakeJudge_Run(&brakeSM[fd], fd) * 3. 复位时调用 faFdBrakeJudge_Reset(&brakeSM[fd], fd) ***************************************************/ #include "phase2_brake_sm.h" #include "phase1_second_har_brake.h" #include "FANEW.h" #include "zx8600.h" #include "vsp5.h" /*========================================================================== * 状态机实现 *==========================================================================*/ BOOL faFdBrakeJudge_Run(BrakeSM* sm, BYTE fd) { VfaFdRunPara* pRunPara = &faFdRunPara[fd]; BOOL brakeResult = FALSE; /* ------ Step 1: 前置条件检查 ------ */ if (ShouldSkipBrake(fd)) { UpdateBrakeStatus(fd, FALSE, pRunPara); faFdInfo[fd].BrakeRatioTime = 0; faFdBrakeJudge_Reset(sm, fd); return FALSE; } /* 计算二次谐波 */ adCalculateSecHar(fd); /* ------ Step 2: 检测过流触发 ------ */ BOOL ocDetected = SecondHarBrake_faFdStateIsOC(fd); /* ------ Step 3: 状态机转移 ------ */ switch (sm->state) { case BRAKE_IDLE: if (ocDetected) { /* 过流触发 → 进入判断状态 */ sm->state = BRAKE_JUDGING; sm->timeoutCount = BRAKE_JUDGE_TIMEOUT_MAX; faFdInfo[fd].BrakeRatioTime = pRunPara->BrakeRatioTime; } brakeResult = FALSE; break; case BRAKE_JUDGING: if (ocDetected) { /* 持续过流:刷新超时计数 */ sm->timeoutCount = BRAKE_JUDGE_TIMEOUT_MAX; /* 判断谐波制动条件 */ if (faFdInfo[fd].BrakeRatioTime > 0 && CheckSecondHarmonicBrake(fd, pRunPara)) { /* 谐波满足 → 进入制动状态 */ sm->state = BRAKE_ACTIVE; sm->debounceEnter = 0; sm->debounceExit = 0; UpdateBrakeStatus(fd, TRUE, pRunPara); brakeResult = TRUE; } else { /* 谐波不满足:继续判断 */ brakeResult = TRUE; // 保持制动 } } else { /* 过流消失:递减超时 */ if (sm->timeoutCount > 0) { sm->timeoutCount--; if (sm->timeoutCount == 0) { /* 超时 → 退出 */ sm->state = BRAKE_EXITING; sm->brakeDone = TRUE; } } brakeResult = FALSE; } break; case BRAKE_ACTIVE: if (faFdInfo[fd].BrakeRatioTime > 0) { /* 谐波有效时间内 */ if (CheckSecondHarmonicBrake(fd, pRunPara)) { /* 谐波持续:保持制动 */ sm->debounceExit = 0; brakeResult = TRUE; } else { /* 谐波消失:开始退出去抖 */ sm->debounceExit++; if (sm->debounceExit > BRAKE_EXIT_DEBOUNCE_MAX) { /* 去抖完成 → 退出 */ sm->state = BRAKE_EXITING; sm->brakeDone = TRUE; brakeResult = FALSE; } else { brakeResult = TRUE; // 去抖期间保持制动 } } } else { /* 制动超时 → 退出 */ sm->state = BRAKE_EXITING; sm->brakeDone = TRUE; brakeResult = FALSE; } break; case BRAKE_EXITING: /* 退出清理 */ sm->debounceEnter = 0; sm->debounceExit = 0; faFdInfo[fd].BrakeRatioTime = 0; UpdateBrakeStatus(fd, FALSE, pRunPara); sm->state = BRAKE_IDLE; sm->brakeDone = FALSE; brakeResult = FALSE; break; } /* ------ Step 4: 递减定时器 ------ */ if (faFdInfo[fd].BrakeRatioTime > 0) { faFdInfo[fd].BrakeRatioTime--; } return brakeResult; } void faFdBrakeJudge_Reset(BrakeSM* sm, BYTE fd) { sm->state = BRAKE_IDLE; sm->debounceEnter = 0; sm->debounceExit = 0; sm->timeoutCount = 0; sm->brakeDone = FALSE; faFdInfo[fd].BrakeRatioTime = 0; }