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.mdEmpty 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.cPID 核心算法
调度器my_empty_project/Middleware/Schedule/schedule.c任务注册与周期调度
电机驱动BSP/bsp_tb6612.*Driver/tb6612_driver.*TB6612 电机驱动封装
编码器APP/encode_app.*BSP/encode_bsp.hBSP/encoude_bsp.c编码器速度反馈
灰度传感器APP/gray_app.*Driver/*grayscale*循迹灰度输入
BNO080APP/bno080_app.*BSP/bno080_bsp.*姿态传感器接口
UARTAPP/uart_app.*BSP/uart_bsp.*UART_*_GUIDE.md串口调试与 DMA 指南
Qt 上位机PID_QT上位机/串口连接、PID 数据解析、曲线显示、命令发送
调试脚本jlink_*.jlinktools/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_sencoder_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_msms系统 tick
target_millicm/s * 1000目标速度
left_milli / right_millicm/s * 1000左右轮当前速度
out_l_milli / out_r_milli输出 * 1000左右轮 PID 输出
kp_milli / ki_milli / kd_milli参数 * 1000当前速度环 PID 参数
err_l_milli / err_r_millicm/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=20T=40 开始,不直接做 0 -> 100 大阶跃。
  • 每次只改一个参数,并保留同样阶跃日志用于对比。
  • 输出长期接近 ±999 时,不应继续增加 Kp/Ki,应先排查供电、负载、编码器比例、电机方向和限幅。
  • 若目标为正但反馈反向增大,优先判断方向或符号错误,立即 RUN=0

后续补全计划

  • 拆出 MSPM0 速度环 PID 调试:固化 UART 协议、日志解析和调参流程。
  • 拆出 TB6612 电机驱动:整理 PWM、方向控制、限幅和死区策略。
  • 拆出 编码器速度反馈:说明速度单位、采样周期、滤波和方向判定。
  • 拆出 Qt PID 上位机架构:整理模块职责、数据流和 UI 交互。
  • 拆出 MSPM0 调度器:整理 Schedule_RegisterTask、周期任务和实时性边界。
  • 拆出 J-Link / RTT 调试:记录脚本用途、寄存器检查和故障定位流程。