51 lines
1.4 KiB
C++
51 lines
1.4 KiB
C++
/**
|
||||
|
|
* @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--;
|
|||
|
|
}
|
|||
|
|
}
|