能跑不等于可维护。没有清晰的输入规则和运行观测,调试人员只能从车轮动作猜内部状态。当前工程用按键触发任务,用 OLED、串口、LED 和蜂鸣器分别承担状态、数据、心跳与事件反馈。
| 文档属性 | 内容 |
|---|---|
| 文档编号 | TI-CAR-08 |
| 输入 | 六个按键 |
| 本地输出 | OLED、蓝色 LED、蜂鸣器 |
| 数据输出 | 串口诊断 |
| 协同输出 | 外部运行状态 GPIO |
1. 按键底层与消抖分层
Key_Read() 只读取 GPIO,并把低电平按下映射为 1~6 的键值。它不做消抖,也不决定某个按键启动什么任务。
Task_Key() 每 20 ms 运行,在应用层维护候选键、稳定键和连续样本数。只有候选值连续满足配置次数,才接受状态变化。这把“电气采样”和“交互语义”分开。
GPIO 电平 → 原始键值 → 连续样本消抖 → 模式命令当前工程还包含不同编译配置下的按键映射。文章描述的是软件结构,不把某个调试键永久定义成产品交互协议。
2. 任务入口为什么先统一清理
启动新任务前,按键处理会调用 Task_StopAll(),清除上一任务的状态、控制历史与输出,再设置新模式。这样能避免:
- 上一次 PID 积分带入新任务;
- 上一次累计距离成为新原点;
- 循迹阶段停留在旧状态;
- 外部运行信号与实际状态不一致。
交互入口不是简单写一个模式编号,而是完成一次受控的状态迁移。
3. OLED 显示的是状态摘要
OLED 初始化成功后才登记显示任务。Display_App_ShowStatus() 根据编译开关和当前模式选择页面,可显示:
- 当前 20 秒或 30 秒配置;
- IDLE、ACC、RUN、DEC、WAIT 等阶段;
- 左右距离与目标距离;
- 左右目标 RPM 与实际 RPM;
- 位置任务完成状态;
- ICM42688 初始化、标定进度和 yaw 调试页。
OLED 适合现场快速判断,不适合承载全部高速数据。页面更新有独立周期,避免每个控制周期都刷新 I²C 屏幕。
4. 串口用于连续数据而非状态猜测
循迹模式下,Task_Serial() 周期调用 TrackMode_PrintSerial(),输出十项关键量:
- 原始循迹偏差;
- 滤波偏差;
- 偏差微分;
- 转向修正;
- 左目标 RPM;
- 左滤波实际 RPM;
- 左 PWM;
- 右目标 RPM;
- 右滤波实际 RPM;
- 右 PWM。
这些字段覆盖“感知—算法—目标—反馈—输出”整条链,适合导入串口绘图工具或表格进行时间对齐分析。
5. 阻塞串口是调度风险
当前 MyPrintf() 逐字节调用阻塞发送。数据量小、波特率足够时可能可用,但在非抢占式调度器中,大量格式化输出会推迟编码器、循迹和 PID 任务。
工程化改进方向是:
- 固定诊断帧长度与字段版本;
- 降低非关键输出频率;
- 使用环形缓冲区和中断/DMA 异步发送;
- 统计丢帧,而不是阻塞控制任务等待串口;
- 发布版本可以关闭高频调试流。
6. LED 与蜂鸣器提供低成本反馈
LED 任务每 100 ms 翻转蓝灯,可用于确认主循环和任务调度仍在运行。它只能说明调度器仍有机会执行 LED 任务,不能证明控制算法正确。
蜂鸣器采用状态变量和 10 ms 周期任务生成脉冲与间隔,没有用长时间 Delay() 阻塞主循环。任务完成或按键反馈通过脉冲次数表达事件。
这种“状态机式蜂鸣”是非抢占式系统中更合适的写法:每次执行只推进一步,然后立即返回。
7. 外部同步信号
Task_SetExternalRunSignal() 用一个 GPIO 表示任务是否运行。任务开始后置为运行,统一停机时撤销;工程还提供仅模拟运行状态而不启动电机的联调入口。
外部同步信号属于系统接口,应明确:
- 高低电平语义;
- 上电默认状态;
- 何时拉高;
- 正常完成、人工中止和异常时何时拉低;
- 两块板是否共地以及 IO 电平是否兼容。
代码确认了软件语义,电气兼容性仍需原理图与实测确认。
8. 可观测数据应分层
| 层级 | 代表数据 | 适合出口 |
|---|---|---|
| 硬件健康 | 初始化成功、WHO_AM_I、错误计数 | OLED / 串口 |
| 调度健康 | 心跳、任务耗时、超时次数 | LED / 串口 |
| 感知 | 原始循迹、IMU 原始值 | 串口 |
| 算法 | 滤波偏差、微分、姿态有效性 | 串口 / OLED 摘要 |
| 控制 | 目标、实际、PWM、积分状态 | 串口 |
| 任务 | 模式、阶段、完成原因 | OLED / 蜂鸣 / 同步 GPIO |
只输出最终 PWM,无法判断问题来自目标、反馈还是控制器。可观测性必须覆盖因果链。
9. 对外数据还缺什么
当前串口字段是无字段名的数值序列,适合临时调试,但企业化交付还应补充:
- 帧版本和时间戳。
- 运行模式与阶段编号。
- 有效位和错误码。
- 固定单位与缩放说明。
- 丢帧或发送拥塞计数。
- 与对应固件提交号绑定的数据字典。
这样日志才能被另一名成员、脚本或上位机稳定解释。
本篇总结
- 按键底层只采样,应用层完成消抖、模式选择和受控状态迁移。
- OLED 提供现场摘要,串口提供连续诊断,LED 和蜂鸣器提供低成本健康与事件提示。
- 蜂鸣器使用非阻塞状态机;阻塞串口仍是合作式调度中的潜在周期风险。
- 工程化可观测性应覆盖硬件、感知、算法、控制和任务层,并带版本、单位和错误状态。
上一篇:07|ICM42688 姿态模块
下一篇:09|应用层状态机