本专题不再按工程文件逐个介绍,而是按“整体—部分—整体”组织:先知道整车有什么、能做什么、如何运行;再深入每个模块的底层驱动、数据处理和应用接口;最后把所有模块放回一次完整任务中。
| 文档属性 | 内容 |
|---|---|
| 文档编号 | TI-CAR-01 |
| 文档类型 | 系统总览 / 专题入口 |
| 面向读者 | 已接触 GPIO、PWM 和 C 语言的新成员 |
| 主控口径 | 全系列统一称为 MSPM0G35XX |
| 代码基线 | 当前工程 TI_CAR_test1_6.7 |
1. 这辆小车由什么组成
整车采用双轮差速结构。MSPM0G35XX 读取编码器与循迹传感器,生成左右轮目标速度,经速度闭环得到 PWM,再由 TB6612 驱动左右电机。按键负责选择任务,OLED、串口、LED 和蜂鸣器负责把内部状态暴露给调试人员。
| 模块 | 底层接口 | 数据处理 | 应用层用途 | 当前证据 |
|---|---|---|---|---|
| TB6612 电机驱动 | GPIO 方向、双通道 PWM、STBY | 极性统一、幅值限幅 | 左右轮执行 | 已由代码确认 |
| 左右编码器 | TIMG8/TIMG9 硬件 QEI | 差分计数、RPM、累计距离 | 速度与位置反馈 | 已由配置和代码确认 |
| 五路循迹 | GPIO 采样 | 黑线解码、加权偏差、低通与微分 | 差速转向、终点识别 | 已由代码确认 |
| ICM42688 | I²C、数据就绪中断 | 量程换算、静止标定、Fusion 融合 | 姿态观测接口 | 驱动和应用代码已确认,默认关闭 |
| 人机交互 | 按键、OLED、LED、蜂鸣器、串口 | 消抖、格式化、节拍控制 | 任务选择与诊断 | 已由代码确认 |
| 外部同步 | GPIO 运行信号 | 启停状态映射 | 与外部板协同 | 已由代码确认 |
2. 它实现了什么
当前主流程具备三类核心能力:
- 根据左右轮编码器完成速度闭环,并将控制量输出到 TB6612。
- 根据累计脉冲完成相对距离控制,并在接近目标时降速、停稳。
- 根据五路循迹偏差修正左右轮目标速度,按加速、巡航、减速和终点阶段推进任务。
ICM42688 模块已经形成从寄存器驱动到姿态融合的代码链,但 ICM42688_ENABLE 当前为 0U。因此它应被理解为“可接入能力”,不是当前默认循迹任务的必需输入。
3. 软件为什么围绕调度器组织
main() 完成 SysConfig 初始化与 Task_Init() 后,只在无限循环中反复调用 Task_Start(Sys_GetTick)。任务调度器检查每个任务是否到期,到期后按优先级顺序直接调用任务函数。
SysTick 递增系统时基 ↓主循环调用 Task_Start ↓检查 Encoder / Tracker / PID / Key / OLED 等任务 ↓到期任务依次运行并返回 ↓主循环再次扫描这是非抢占式,也称合作式调度:一个任务运行时,普通任务不会在中途抢走 CPU。它的优点是调用关系清晰、共享状态简单;代价是任何阻塞或超时过长的任务都会推迟后续任务。
4. 一次控制循环如何流动
以循迹任务为例,信息沿着固定方向传递:
五路 GPIO → 线位置偏差 → 低通/微分 → 转向修正编码器 QEI → 左右轮 RPM ───────────┐任务状态机 → 基础目标速度 ─────────┼→ 左右轮目标 RPM ↓ 速度 PID + 前馈 ↓ PWM/方向 → TB6612 ↓ 电机传感器先回答“车现在怎样”,应用层再回答“车应该怎样”,控制器计算“需要输出多少”,执行层最后把数值变成电气信号。调试时也应沿这条链逐层定位,不能看到小车跑偏就直接修改 PWM。
5. APP 与 BSP 的职责边界
BSP 面向外设和芯片寄存器,负责“如何读写”:例如 QEI 计数、PWM 比较值、I²C 传输和 GPIO 状态。APP 面向整车业务,负责“何时做、做什么”:例如启动 20 秒模式、计算目标速度、判断终点和统一停机。
一个可维护的调用方向应保持为:
任务与状态机(APP) ↓控制、规划与数据处理(APP/BSP 算法模块) ↓设备驱动(BSP) ↓DriverLib / MSPM0G35XX 外设如果底层驱动直接决定任务阶段,或应用层到处写寄存器,模块就会互相绑定。后续文章始终按“底层驱动—数据处理—应用层”拆解,正是为了守住这个边界。
6. 专题阅读地图
| 篇次 | 主题 | 需要建立的工程认知 |
|---|---|---|
| 02 | 非抢占式调度与软件分层 | 周期、优先级、最坏执行时间 |
| 03 | TB6612 电机驱动 | 方向、PWM、STBY 与安全输出 |
| 04 | 编码器反馈 | QEI、RPM、距离与误差来源 |
| 05 | 速度环与位置环 | 滤波、前馈 PID、斜坡和停稳 |
| 06 | 五路循迹 | 采样、偏差、滤波 PD 与阶段判断 |
| 07 | ICM42688 | I²C 驱动、标定、Fusion 与启用边界 |
| 08 | 人机交互与观测 | 按键、OLED、串口和诊断数据 |
| 09 | 应用状态机 | 模式切换、任务阶段、统一停机 |
| 10 | 整车协作 | 从按键启动到任务完成的完整时序 |
7. 阅读代码时使用三条证据线
- 配置线:
empty.syscfg决定外设实例、引脚复用和生成代码。 - 调用线:初始化、
Task_Add()与任务函数决定模块是否进入运行主线。 - 状态线:共享状态、有效标志和错误计数决定数据是否可被上层使用。
只找到一个 .c 文件,只能说明“有这段实现”。只有配置存在、初始化成功、任务被登记、结果被应用层消费,才能说明模块真正进入当前运行链。
本篇总结
- 整车由执行、反馈、感知、控制、交互和同步模块组成,主控统一称为 MSPM0G35XX。
- 软件核心是基于系统时基的非抢占式任务调度器,普通任务必须短时、可返回。
- 当前循迹闭环使用编码器和五路循迹输入;ICM42688 代码完整但默认关闭。
- 后续文章按具体模块的底层驱动、数据处理和应用层接口展开,最后再回到整车协作。
下一篇:02|非抢占式调度器与软件分层