实车测试时,车辆在原点和第二个路径点之间反复切换。Log显示:
[MC_CTRL] CH8 crossed threshold: 1800 -> 1024
[MC_CTRL] *** Auto mode triggered! Resetting to GOTO_START ***
[MC_CTRL] CH8 crossed threshold: 1024 -> 1800
每次都精确地跳到1024,而不是随机抖动!
1024是SBUS协议的中心值,也是信号丢失时的failsafe默认返回值!
STM32H743/FML/SBUS.h 第27行:c #define SBUS_CENTER_VALUE 1024 // 通道中心值
STM32H743/FML/SBUS.c 第343-346行:c HIDO_UINT16 SBUS_GetChannel(HIDO_UINT8 _u8Channel) { if (!SBUS_IsSignalValid(SBUS_TIMEOUT_MS)) { return SBUS_CENTER_VALUE; // 返回1024! } return g_stSBUSData.m_au16Channels[_u8Channel]; }
SBUS_IsSignalValid() 返回FALSESBUS_GetChannel(7) 返回failsafe值 10241024 < 1500(阈值) → 退出自动模式1800 > 1500 → 触发"Auto mode triggered"MC_Init被调用 → 状态机重置到GOTO_START不能将1024当作有效的CH8输入! 它是信号丢失的指示,不是遥控器的真实位置。
文件:STM32H743/APL/motion_control_task.c
HIDO_UINT16 ch8_raw = SBUS_GetChannel(MOTION_SBUS_AUTO_CHANNEL);
/* 过滤SBUS failsafe默认值1024:这是信号丢失时的返回值,不应触发模式切换
* 当ch8=1024时,保持之前的有效值不变 */
static HIDO_UINT16 ch8 = 1000; /* 默认手动模式 */
static HIDO_UINT32 s_ch8_failsafe_count = 0;
if (ch8_raw != 1024)
{
ch8 = ch8_raw; /* 只更新非failsafe值 */
if (s_ch8_failsafe_count > 0)
{
DBG_Printf("[MC_CTRL] CH8 recovered from failsafe (1024), count=%u, new value=%u\r\n",
s_ch8_failsafe_count, ch8);
s_ch8_failsafe_count = 0;
}
}
else
{
/* ch8=1024时保持之前的值,记录failsafe事件 */
s_ch8_failsafe_count++;
if (s_ch8_failsafe_count == 1)
{
DBG_Printf("[MC_CTRL] CH8 failsafe detected (1024), keeping previous value=%u\r\n", ch8);
}
}
SBUS_GetChannel在信号丢失时的专用返回值#define CH8_THRESHOLD_ENTER 1600
#define CH8_THRESHOLD_EXIT 1400
互补,不冲突! 建议同时保留:
1. Failsafe过滤:第一道防线,过滤协议层的异常值
2. CH8迟滞:第二道防线,防止真实的模拟量抖动
(无输出,ch8正常更新)
[MC_CTRL] CH8 failsafe detected (1024), keeping previous value=1800
[MC_CTRL] CH8 recovered from failsafe (1024), count=5, new value=1800
软件修复只是权宜之计,真正应该:
编译并烧录最新代码
测试场景1:模拟SBUS信号丢失
STM32H743/APL/motion_control_task.c - 主要修复STM32H743/FML/SBUS.c - SBUS协议实现STM32H743/FML/SBUS.h - SBUS常量定义BUGFIX_CH8_HYSTERESIS.md - 之前的迟滞方案(保留)这是一个经典的**误把协议层failsafe值当作业务数据**的案例。1024不是遥控器的真实输入,而是SBUS协议在信号丢失时的特殊返回值,必须在业务层过滤掉。
关键教训:
1. 理解协议层的特殊值和failsafe机制
2. 区分"协议有效"(格式正确)和"数据有效"(来自真实输入)
3. 对异常值要追根溯源,不能只看表象
4. 用户的直觉往往是对的——"不可能是模拟量抖动"
感谢用户的坚持和正确判断!