即使过滤了1024 failsafe值,问题依然存在。从最新log分析:
[MC_CTRL] CH8 entered MANUAL zone: 1800 -> 120 (<1400)
[MC_CTRL] *** Auto mode triggered! Resetting to GOTO_START ***
[MC_CTRL] CH8 entered AUTO zone: 120 -> 1800 (>1600)
[MC_CTRL] *** Stage transition: goto_start -> idle ***
[MC_CTRL] CH8 recovered from failsafe (1024), count=6, new value=1953
[MC_CTRL] SBUS valid changed: 1 -> 0
[MC_CTRL] SBUS valid changed: 0 -> 1
SBUS信号质量极差,频繁丢失和恢复,导致:
不仅过滤1024,过滤所有不在有效范围内的值:
/* 判断是否为有效SBUS值:172-1811范围内,且不是精确的1024 */
HIDO_BOOL is_valid = (ch8_raw >= 172 && ch8_raw <= 1811 && ch8_raw != 1024);
if (is_valid)
{
ch8 = ch8_raw; /* 只更新有效值 */
}
else
{
/* 异常值,保持之前的值 */
DBG_Printf("[MC_CTRL] CH8 failsafe detected (%u), keeping previous value=%u\r\n",
ch8_raw, ch8);
}
过滤范围:
- <172:低于SBUS最小值(如120)
- =1024:SBUS中心值(failsafe默认)
- >1811:高于SBUS最大值(如1953)
核心理念:正在执行任务时,忽略模式切换抖动
if (s_last_auto_condition == HIDO_FALSE && current_auto_condition == HIDO_TRUE)
{
E_MCStage current_stage = g_motion_state.stage;
if (current_stage == MC_STAGE_IDLE || current_stage == MC_STAGE_FINISHED)
{
/* 只有空闲或完成时才允许重新初始化 */
MC_Init(&g_motion_state, &g_motion_config, g_motion_path_xy, g_motion_path_point_count);
}
else
{
/* 正在执行任务,忽略此次模式切换(可能是信号抖动) */
DBG_Printf("[MC_CTRL] WARNING: Auto mode re-triggered during %d, ignoring (SBUS interference)\r\n",
current_stage);
}
}
逻辑:
- IDLE/FINISHED状态:允许重新初始化(用户真正想重新开始)
- GOTO_START/FOLLOW_PATH状态:忽略模式切换(认为是信号干扰)
if (ch8_raw < 172 || ch8_raw > 1811 || ch8_raw == 1024)
→ 忽略,保持last-known-good值
进入自动:CH8 > 1600
退出自动:CH8 < 1400
死区:1400-1600
if (正在执行任务 && 检测到模式切换)
→ 忽略,认为是干扰
[MC_CTRL] CH8 failsafe detected (120), keeping previous value=1800
[MC_CTRL] CH8 failsafe detected (1953), keeping previous value=1800
[MC_CTRL] CH8 recovered from failsafe, count=56, new value=1800
[MC_CTRL] WARNING: Auto mode re-triggered during 2, ignoring (SBUS interference)
软件修复只是workaround,真正需要:
STM32H743/APL/motion_control_task.c - 扩展异常值过滤,添加状态保护BUGFIX_HEADING_CONTROL.md - 航向控制方向修复BUGFIX_CH8_HYSTERESIS.md - CH8迟滞方案BUGFIX_CH8_FAILSAFE_1024.md - 1024 failsafe过滤DEBUG_GOTO_START_LOOP.md - 问题诊断过程这是一个**层层深入、逐步完善**的bug修复过程:
关键教训:
- 复杂的问题往往需要多层防护
- 不要假设只有一个根本原因
- SBUS信号质量问题必须从硬件层面根本解决
- 软件要robust,能应对各种异常情况
本次修复应该能彻底解决状态机重复重置的问题!