/** * @file sys/run_inhibit.cpp * @brief 电机"禁止运行"闸门实现 */ #include "run_inhibit.h" #include "Timer.h" #include "motor.h" // 全局单例:定义放本文件,声明在 main.cpp 之外由各调用方 extern(见 run_inhibit.h) RunInhibit run_inhibit; /** * @brief 申请禁止 */ void RunInhibit::request(u32 src) { bits |= src; } /** * @brief 撤销本来源的禁止申请 */ void RunInhibit::release(u32 src) { bits &= ~src; } /** * @brief 执行闸门:禁止/唤醒建立期封 PWM,禁止时让驱动睡眠;解除后唤醒并等建立时间 * @note 睡眠(nSLEEP 拉低)本身会复位 DRV8313 内部逻辑含故障锁存,所以 * "芯片侧锁存"由这里顺带清掉;"要不要继续禁止"完全由位图决定。 * 解除后不立即派发控制函数:DRV8313 手册 7.4.1 要求唤醒后约 1ms 才 * 完全工作,这段建立期内输出保持 0。若故障源还在,检测方会在下一轮 * 轮询里重新 request(),本模块不需要知道是谁、为什么。 */ void RunInhibit::update(void) { if (bits != 0U) { if (!stopped) { motor_sleep(); stopped = true; } // 建立窗口每拍重置:解除后要重新等满 DRV_WAKE_SETTLE_50US wake_ticks = DRV_WAKE_SETTLE_50US; Set_3Pwm(0.0f, 0.0f, 0.0f); return; } if (stopped) { motor_resume(); stopped = false; } if (wake_ticks != 0U) { Set_3Pwm(0.0f, 0.0f, 0.0f); wake_ticks--; } }