优化上电复位到底检测与碰撞反弹判定:新增每秒高度采样日志、反弹300ms持续确认滤除急停抖动毛刺、上电先延时2秒等控制盒初始化、延时期间排除堵转判定并增加已位移前置条件;报错帧按错误码沿触发处理防停顿无限续期
This commit is contained in:
@@ -408,20 +408,24 @@ const DBGFunType DebugFun[DEBUG_CMD_CNT] = {
|
||||
* 协议: 01 04 d2 d3 = 报错帧(d2/d3为错误码, 如过热); 01 01 h_hi h_lo = 高度帧(清除复位标志)
|
||||
*=========================================================================================*/
|
||||
#define U3ERR_EVT_MAX 16 /* 事件缓冲条数 */
|
||||
#define U3ERR_STATUS_NUM 12 /* 主状态机状态个数 */
|
||||
#define U3ERR_STATUS_NUM 13 /* 主状态机状态个数 */
|
||||
|
||||
/* 事件类型 */
|
||||
#define U3ERR_T_FIRST 0 /* 首次信息帧(复位标志 0→1) */
|
||||
#define U3ERR_T_REPLY 1 /* 复位中回应信息帧(复位标志已置位) */
|
||||
#define U3ERR_T_DONE 2 /* 复位完成(收到高度帧, 复位标志 1→0) */
|
||||
#define U3ERR_T_UNKNOWN 3 /* 未知帧(非高度/信息帧, 用于捕捉过热等其它报错) */
|
||||
#define U3ERR_T_BOTTOM 4 /* 上电复位到底判定-堵转(下降中高度1秒无变化) */
|
||||
#define U3ERR_T_REBOUND 5 /* 上电复位到底判定-反弹(下降中高度不降反升, 触底震荡/碰撞反向) */
|
||||
#define U3ERR_T_TOUCH 7 /* 上电复位首次反弹-到底接触小反弹(停1秒恢复下降观察, 不转点动) */
|
||||
#define U3ERR_T_HTSAMP 8 /* 上电复位高度采样(每秒一条, 展示下降全程高度曲线) */
|
||||
|
||||
typedef struct{
|
||||
uint8_t Type; /* 事件类型 */
|
||||
uint8_t Bits; /* BIT0/BIT1 输出电平(bit0/bit1) */
|
||||
uint8_t Status; /* 事件时刻主状态机状态 */
|
||||
uint8_t Frame[4]; /* 原始4字节帧 */
|
||||
uint16_t Height; /* type2: 高度帧数值(mm) */
|
||||
uint16_t Height; /* type2: 高度帧数值(mm); type4/5: 判定时刻高度 */
|
||||
uint16_t Repeat; /* 连发合并的重复包数(不含首包) */
|
||||
uint32_t Tick; /* 事件时刻(ms, 上电起) */
|
||||
}U3ErrEvt_t;
|
||||
@@ -431,12 +435,13 @@ static uint8_t m_U3ErrLastType = 0xFF; /* 上一帧类型(0xFF=无) */
|
||||
static uint8_t m_U3ErrLastFrame[4]; /* 上一帧内容 */
|
||||
static uint16_t m_U3ErrLastHeight = 0; /* 上一帧高度(type2) */
|
||||
static uint32_t m_U3ErrLastTick = 0; /* 上一帧时刻 */
|
||||
static uint32_t m_U3ErrFirstTick = 0; /* 当前滞留帧的起始时刻(连发持续超5秒也强制落一条) */
|
||||
static uint16_t m_U3ErrRepeat = 0; /* 上一帧已合并的重复包数 */
|
||||
|
||||
static const char *m_U3ErrStatusName[U3ERR_STATUS_NUM] = {
|
||||
"IDLE", "ON", "OFF", "START_BEEP", "MOTOR_INIT", "ZERO_MARKING",
|
||||
"WAIT_MOTOR_INIT", "WAIT_MOTOR_CALI_UP", "WAIT_MOTOR_CALI_DOWN",
|
||||
"WAIT_STEADY", "END_BEEP", "HEIGHT_CONTROL"
|
||||
"WAIT_STEADY", "END_BEEP", "HEIGHT_CONTROL", "POWER_RESET"
|
||||
};
|
||||
|
||||
static U3ErrEvt_t m_U3ErrEvt[U3ERR_EVT_MAX]; /* 事件环形缓冲 */
|
||||
@@ -504,6 +509,26 @@ void Uart3ErrLog_Push(uint8_t type, const uint8_t *pFrame, uint16_t height)
|
||||
m_U3ErrLastFrame[3] = pFrame[3];
|
||||
m_U3ErrLastHeight = height;
|
||||
m_U3ErrLastTick = tick;
|
||||
m_U3ErrFirstTick = tick;
|
||||
}
|
||||
|
||||
/* 函数名称: Uart3ErrLog_PushBottom
|
||||
* 功能描述: 记录上电复位"下降到底判定"事件(type:4堵转/5反弹, SysTick 1ms例程调用,
|
||||
* 立即落队不参与连发合并), 先落队滞留帧保证事件时间线顺序(临界区保护) */
|
||||
void Uart3ErrLog_PushBottom(uint8_t type, uint16_t height)
|
||||
{
|
||||
uint8_t zero[4] = {0};
|
||||
uint32_t primask = __get_PRIMASK();
|
||||
__disable_irq();
|
||||
if(m_U3ErrLastType != 0xFF){
|
||||
Uart3ErrLog_Enqueue(m_U3ErrLastType, m_U3ErrLastFrame, m_U3ErrLastHeight, m_U3ErrLastTick, m_U3ErrRepeat);
|
||||
m_U3ErrLastType = 0xFF;
|
||||
m_U3ErrRepeat = 0;
|
||||
}
|
||||
Uart3ErrLog_Enqueue(type, zero, height, SysTick_GetTick(), 0);
|
||||
if(primask == 0U){
|
||||
__enable_irq();
|
||||
}
|
||||
}
|
||||
|
||||
/* 函数名称: Uart3ErrLog_BitsName
|
||||
@@ -521,6 +546,9 @@ static const char *Uart3ErrLog_BitsName(uint8_t bits)
|
||||
static const char *Uart3ErrLog_CodeName(const uint8_t *pFrame)
|
||||
{
|
||||
if(pFrame[0] == 0x01 && pFrame[1] == 0x02 && pFrame[2] == 0x00 && pFrame[3] == 0x10) return "(OVERHEAT)";
|
||||
if(pFrame[0] == 0x01 && pFrame[1] == 0x02 && pFrame[2] == 0x40 && pFrame[3] == 0x00) return "(E07)";
|
||||
if(pFrame[0] == 0x01 && pFrame[1] == 0x02 && pFrame[2] == 0x00 && pFrame[3] == 0x08) return "(E12)";
|
||||
if(pFrame[0] == 0x01 && pFrame[1] == 0x02 && pFrame[2] == 0x02 && pFrame[3] == 0x00) return "(E02)";
|
||||
if(pFrame[2] == 0x01 && pFrame[3] == 0xAA) return "(RESET)";
|
||||
return "";
|
||||
}
|
||||
@@ -540,13 +568,16 @@ static const char *Uart3ErrLog_StatusName(uint8_t status)
|
||||
void Uart3ErrLogLoopHandler(void)
|
||||
{
|
||||
uint8_t cnt;
|
||||
/* 连发已结束(超时500ms无同帧)且有滞留帧 → 先落队一条 */
|
||||
if((m_U3ErrLastType != 0xFF) && (m_U3ErrRepeat > 0U) &&
|
||||
((SysTick_GetTick() - m_U3ErrLastTick) >= 500U))
|
||||
{
|
||||
Uart3ErrLog_Enqueue(m_U3ErrLastType, m_U3ErrLastFrame, m_U3ErrLastHeight, m_U3ErrLastTick, m_U3ErrRepeat);
|
||||
m_U3ErrLastType = 0xFF;
|
||||
m_U3ErrRepeat = 0;
|
||||
/* 滞留帧落队时机: ①连发结束(500ms无同帧, 含单帧情况) ②连发持续超5秒强制落一条
|
||||
(控制盒报错状态会持续广播报错帧, 若只等连发结束则期间日志完全静默, 看起来像没收到) */
|
||||
if(m_U3ErrLastType != 0xFF){
|
||||
uint32_t now = SysTick_GetTick();
|
||||
if(((now - m_U3ErrLastTick) >= 500U) || ((now - m_U3ErrFirstTick) >= 5000U))
|
||||
{
|
||||
Uart3ErrLog_Enqueue(m_U3ErrLastType, m_U3ErrLastFrame, m_U3ErrLastHeight, m_U3ErrLastTick, m_U3ErrRepeat);
|
||||
m_U3ErrLastType = 0xFF;
|
||||
m_U3ErrRepeat = 0;
|
||||
}
|
||||
}
|
||||
for(cnt = 0; cnt < 8U; cnt++){
|
||||
char rep[20];
|
||||
@@ -590,6 +621,26 @@ void Uart3ErrLogLoopHandler(void)
|
||||
evt.Frame[0], evt.Frame[1], evt.Frame[2], evt.Frame[3],
|
||||
Uart3ErrLog_CodeName(evt.Frame), rep);
|
||||
break;
|
||||
case U3ERR_T_BOTTOM: /* 上电复位: 高度2秒无变化判定到底(堵转), 停顿后持续下降触发复位 */
|
||||
DBG_LOG("[T+%3u.%03us][%s|OUT:%s] BOTTOM-STALL: Height=%dmm no-change 2s\r\n",
|
||||
s, ms, Uart3ErrLog_StatusName(evt.Status),
|
||||
Uart3ErrLog_BitsName(evt.Bits), evt.Height);
|
||||
break;
|
||||
case U3ERR_T_REBOUND: /* 上电复位: 再次反弹判定碰撞震荡(触底震荡/碰撞反向), 转点动下降 */
|
||||
DBG_LOG("[T+%3u.%03us][%s|OUT:%s] BOTTOM-REBOUND: Height=%dmm collision, switch to inching\r\n",
|
||||
s, ms, Uart3ErrLog_StatusName(evt.Status),
|
||||
Uart3ErrLog_BitsName(evt.Bits), evt.Height);
|
||||
break;
|
||||
case U3ERR_T_TOUCH: /* 上电复位: 首次反弹(到底接触小反弹), 停1秒恢复下降观察不转点动 */
|
||||
DBG_LOG("[T+%3u.%03us][%s|OUT:%s] BOTTOM-TOUCH: Height=%dmm rising, pause 1s then keep descending\r\n",
|
||||
s, ms, Uart3ErrLog_StatusName(evt.Status),
|
||||
Uart3ErrLog_BitsName(evt.Bits), evt.Height);
|
||||
break;
|
||||
case U3ERR_T_HTSAMP: /* 上电复位: 高度采样(每秒), 展示下降全程高度曲线 */
|
||||
DBG_LOG("[T+%3u.%03us][%s|OUT:%s] HEIGHT-SAMP: %dmm\r\n",
|
||||
s, ms, Uart3ErrLog_StatusName(evt.Status),
|
||||
Uart3ErrLog_BitsName(evt.Bits), evt.Height);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user