实车测试时,车辆在原点和第二个路径点之间反复切换,无法正常完成路径跟踪。Log显示状态机反复从follow_path回到goto_start。
CH8通道(自动模式开关)剧烈抖动,在1024和1800之间反复跳变。
从log分析(python/hitl/runlog.txt):
[HOST=1764923751.607s] CH8 crossed threshold: 1800 -> 1024
[HOST=1764923751.686s] *** Auto mode triggered! Resetting to GOTO_START ***
[HOST=1764923751.688s] CH8 crossed threshold: 1024 -> 1800
[HOST=1764923752.166s] CH8 crossed threshold: 1800 -> 1024
[HOST=1764923752.387s] *** Auto mode triggered! Resetting to GOTO_START ***
[HOST=1764923752.389s] CH8 crossed threshold: 1024 -> 1800
每次CH8跨越阈值1500时,都会触发自动模式的开关,导致状态机被MC_Init重新初始化到GOTO_START。
在短短10秒内,CH8跨越阈值触发了**50+次**"Auto mode triggered",导致:
- 车辆无法完成路径跟踪
- 目标点在原点和第二个路径点之间反复切换
- 状态机不断被重置
使用**施密特触发器**原理,为CH8设置两个阈值:
手动模式状态:
- 保持手动,直到 CH8 > 1600 (高阈值)
- 当 CH8 > 1600 时 → 切换到自动模式
自动模式状态:
- 保持自动,直到 CH8 < 1400 (低阈值)
- 当 CH8 < 1400 时 → 切换到手动模式
死区(1400-1600):
- 在此区间内,保持之前的状态不变
- 避免在阈值附近抖动时反复切换
文件:STM32H743/APL/motion_control_task.c
static HIDO_BOOL s_ch8_auto_state = HIDO_FALSE; /* CH8迟滞状态 */
/* CH8迟滞阈值定义 */
#define CH8_THRESHOLD_ENTER 1600 // 进入自动模式的阈值
#define CH8_THRESHOLD_EXIT 1400 // 退出自动模式的阈值
if (s_ch8_auto_state == HIDO_FALSE)
{
/* 当前在手动模式,检查是否应该进入自动模式 */
if (ch8 > CH8_THRESHOLD_ENTER)
{
s_ch8_auto_state = HIDO_TRUE;
}
}
else
{
/* 当前在自动模式,检查是否应该退出自动模式 */
if (ch8 < CH8_THRESHOLD_EXIT)
{
s_ch8_auto_state = HIDO_FALSE;
}
}
/* 使用迟滞状态而不是直接使用CH8值 */
HIDO_BOOL current_auto_condition = (sbus_valid == HIDO_TRUE &&
s_ch8_auto_state == HIDO_TRUE &&
gps_ready == HIDO_TRUE);
修改前: [MC_CTRL] CH8 crossed threshold: 1800 -> 1024 (threshold=1500) [MC_CTRL] CH8 crossed threshold: 1024 -> 1800 (threshold=1500) ... (每次跨越1500都记录,输出大量重复信息)
修改后: [MC_CTRL] CH8 entered MANUAL zone: 1800 -> 1024 (<1400) [MC_CTRL] CH8 entered AUTO zone: 1024 -> 1800 (>1600) ... (只记录真正的状态切换,简洁清晰)
s_ch8_auto_state静态变量来保存CH8的迟滞状态CH8_THRESHOLD_ENTER(1600)和CH8_THRESHOLD_EXIT(1400)ch8 > MOTION_SBUS_AUTO_THRESHOLD_US (1500)s_ch8_auto_state == HIDO_TRUE(使用迟滞状态)迟滞逻辑特别适用于:
- 模拟开关输入(如PWM通道)
- 温度控制(恒温器)
- 电池电量检测
- 任何需要避免在阈值附近反复切换的场景
STM32H743/APL/motion_control_task.c - 主要修改BUGFIX_HEADING_CONTROL.md - 之前修复的航向控制问题DEBUG_GOTO_START_LOOP.md - 问题诊断文档通过为CH8通道添加迟滞逻辑,彻底解决了因通道抖动导致的状态机反复重置问题。这是一个经典的**去抖动(Debouncing)**应用案例,使用施密特触发器原理提高了系统的稳定性和鲁棒性。
关键教训:对于任何模拟开关输入,特别是可能在阈值附近抖动的信号,都应该考虑添加迟滞或时间延迟来提高稳定性。