05 TI M0 Workspace
项目定位
这是一个围绕 TI MSPM0G3507 的完整工作区,原始资料位于 raw/projects/ti-m0-workspace。它不仅包含 MSPM0 固件工程,还包含 PID 调参上位机、J-Link/RTT 调试脚本、spec-workflow 文档和若干调试资料。
当前最清晰的主线是“双电机速度环 PID 调试”:固件通过 UART0 输出 PID, 开头的 CSV 数据,上位机或串口工具发送 T/KP/KI/KD/AUTO/DBG/RUN 命令完成目标速度、参数和运行状态控制。
原始资料位置
| 类别 | 路径 | 用途 |
|---|---|---|
| 固件工程 | my_empty_project/ | MSPM0G3507 DriverLib 工程 |
| 工程说明 | my_empty_project/README.md | Empty Project / LaunchPad 基础说明 |
| PID 调试提示 | my_empty_project/agent.md | 双电机速度环 PID 调试规则、协议和安全约束 |
| PID 应用 | my_empty_project/APP/pid_app.c | 速度环、循迹环、角度环 PID 应用 |
| PID 算法 | my_empty_project/Middleware/PID/pid.c | PID 核心算法 |
| 调度器 | my_empty_project/Middleware/Schedule/schedule.c | 任务注册与周期调度 |
| 电机驱动 | BSP/bsp_tb6612.*、Driver/tb6612_driver.* | TB6612 电机驱动封装 |
| 编码器 | APP/encode_app.*、BSP/encode_bsp.h、BSP/encoude_bsp.c | 编码器速度反馈 |
| 灰度传感器 | APP/gray_app.*、Driver/*grayscale* | 循迹灰度输入 |
| BNO080 | APP/bno080_app.*、BSP/bno080_bsp.* | 姿态传感器接口 |
| UART | APP/uart_app.*、BSP/uart_bsp.*、UART_*_GUIDE.md | 串口调试与 DMA 指南 |
| Qt 上位机 | PID_QT上位机/ | 串口连接、PID 数据解析、曲线显示、命令发送 |
| 调试脚本 | jlink_*.jlink、tools/rtt_monitor/ | J-Link / RTT 调试辅助 |
工作区结构
ti-m0-workspace/
├─ my_empty_project/ MSPM0G3507 固件工程
│ ├─ APP/ 应用层:pid、motor、encoder、gray、uart、bno080、adc
│ ├─ BSP/ 板级支持:TB6612、UART、ADC、I2C、编码器、延时
│ ├─ Driver/ 设备驱动:TB6612、灰度传感器
│ ├─ Middleware/ 中间件:PID、Schedule、SEGGER_RTT
│ ├─ Debug/ti_msp_dl_config.* SysConfig 生成代码
│ ├─ empty.syscfg TI SysConfig 配置
│ ├─ UART_DEBUG_GUIDE.md UART 调试说明
│ ├─ UART_DMA_GUIDE.md UART DMA 说明
│ ├─ TB6612_README.md 电机驱动说明
│ └─ SCHEDULE_GUIDE.md 调度器说明
├─ PID_QT上位机/ PID 调参桌面软件
│ ├─ src/ Qt/C++ 源码
│ ├─ resources/ QSS / qrc 资源
│ ├─ samples/pid_sample.log 示例 PID 日志
│ ├─ tests/manual_validation.md 手工验证记录
│ └─ ui-workflow/ UI 需求、预览、计划和评审资料
└─ jlink_*.jlink J-Link 调试脚本固件控制主线
APP/pid_app.c 当前包含四类 PID 控制器:
| 控制器 | 用途 | 当前参数/范围 |
|---|---|---|
pid_speed_left | 左轮速度环 | kp=3.90, ki=0.15, kd=2.5, 输出 ±999 |
pid_speed_right | 右轮速度环 | kp=3.90, ki=0.15, kd=2.5, 输出 ±999 |
pid_line | 循迹环 | kp=5.20, ki=0, kd=40.00, 输出 ±999 |
pid_angle | 角度环 | kp=1.0, ki=0.00001, kd=10.80, 输出 ±999 |
速度环关键事实:
- 速度目标范围:
0 ~ 100 cm/s。 PID_Task()在PID_Init()中注册到调度器,周期为10 ms。- 反馈来自
encoder_motor1.speed_cm_s和encoder_motor2.speed_cm_s。 - 输出通过
Motor1_SetSpeed()、Motor2_SetSpeed()写入电机控制层。 - 调试模式下每
50 ms通过 UART0 输出一行 PID CSV。 - 自动阶跃目标序列为
0, 20, 40, 60, 80, 100, 60, 30 cm/s,周期3000 ms。 - 积分限幅当前为
-250 ~ 250。
UART0 PID 调试协议
固件周期输出 CSV:
PID,t_ms,target_milli,left_milli,right_milli,out_l_milli,out_r_milli,kp_milli,ki_milli,kd_milli,err_l_milli,err_r_milli字段说明:
| 字段 | 单位 | 含义 |
|---|---|---|
t_ms | ms | 系统 tick |
target_milli | cm/s * 1000 | 目标速度 |
left_milli / right_milli | cm/s * 1000 | 左右轮当前速度 |
out_l_milli / out_r_milli | 输出 * 1000 | 左右轮 PID 输出 |
kp_milli / ki_milli / kd_milli | 参数 * 1000 | 当前速度环 PID 参数 |
err_l_milli / err_r_milli | cm/s * 1000 | 左右轮速度误差 |
可发送命令:
T=30 # 设置目标速度 30 cm/s,并关闭 AUTO
KP=3.2 # 设置左右轮 Kp
KI=0.08 # 设置左右轮 Ki
KD=0.0 # 设置左右轮 Kd
AUTO=1 # 启用自动阶跃
AUTO=0 # 关闭自动阶跃
DBG=1 # 进入速度环调试模式,外环不覆盖速度目标
DBG=0 # 退出速度环调试模式,恢复外环逻辑
RUN=1 # 使能 PID 输出
RUN=0 # 停止电机输出Qt 上位机资料
PID_QT上位机/src 中的模块可以整理为:
| 模块 | 职责 |
|---|---|
serial_port_manager.* | 串口扫描、连接、收发管理 |
pid_protocol_parser.* | 解析 PID, CSV 行,过滤非协议数据 |
pid_command_builder.* | 构造 T/KP/KI/KD/AUTO/DBG/RUN 命令 |
pid_data_model.* | 保存 PID 实时数据与历史序列 |
pid_analyzer.* | 计算调参指标,例如超调、稳态误差、饱和等 |
plot_widget.* | 绘制目标速度、左右轮速度、输出曲线 |
realtime_data_panel.* | 实时数据显示面板 |
main_window.* | 主窗口、控件布局和交互连接 |
上位机资料还包含 ui-workflow/,可作为后续重构 UI 或迁移 Web UI 的需求来源。
调参原则
- 首次测试前必须确认能发送
RUN=0,并确认可以断电或复位。 - 初始建议先用 PI,
KD=0,避免低速编码器噪声被 D 项放大。 - 首测目标建议从
T=20或T=40开始,不直接做0 -> 100大阶跃。 - 每次只改一个参数,并保留同样阶跃日志用于对比。
- 输出长期接近
±999时,不应继续增加Kp/Ki,应先排查供电、负载、编码器比例、电机方向和限幅。 - 若目标为正但反馈反向增大,优先判断方向或符号错误,立即
RUN=0。
后续补全计划
- 拆出
MSPM0 速度环 PID 调试:固化 UART 协议、日志解析和调参流程。 - 拆出
TB6612 电机驱动:整理 PWM、方向控制、限幅和死区策略。 - 拆出
编码器速度反馈:说明速度单位、采样周期、滤波和方向判定。 - 拆出
Qt PID 上位机架构:整理模块职责、数据流和 UI 交互。 - 拆出
MSPM0 调度器:整理Schedule_RegisterTask、周期任务和实时性边界。 - 拆出
J-Link / RTT 调试:记录脚本用途、寄存器检查和故障定位流程。