# Chassis — 差速底盘控制系统 基于 TI MSPM0G3507 (Cortex-M0+, 80MHz) 的两轮差速移动底盘嵌入式固件。 ## 硬件资源 | 资源 | 引脚 | 用途 | |------|------|------| | 左电机 PWM | TIMG7_CH0, A26 | 17kHz PWM 驱动 | | 左电机 DIR | GPIO A27 | 方向控制 | | 右电机 PWM | TIMG0_CH0, B10 | 17kHz PWM 驱动 | | 右电机 DIR | GPIO B11 | 方向控制 | | 右编码器 | QEI 模块 | 硬件正交解码 | | 左编码器 | GPIO EXTI A9/A12 | 软件模拟正交解码 | | IMU SPI | SPI1 (B23/B22/B21/B19) | ICM-42688-P 6轴 IMU | | 灰度 ADC | ADC1_CH5, B18 | 8 通道灰度传感器 | | 灰度 MUX | B8/B9/B14 | 3-8 模拟开关选通 | | 串口 | UART2 (B15/B16) | 上位机通信 115200 8N1 | | 蜂鸣器 | GPIO A14 | 提示音 | ## 目录结构 ``` chassis/ ├── project/ │ ├── code/ # 用户应用代码 │ │ ├── main.c # 入口 + 主循环 │ │ ├── Task.c/h # 任务调度 (10/20/50ms) │ │ ├── Command.c/h # UART 命令解析 + 模式切换 │ │ ├── Motor.c/h # 电机 PWM 驱动 │ │ ├── MotorEncoder.c/h # 编码器测速 │ │ ├── PID_Controller.c/h # 通用 PID (8 项改进) │ │ ├── IMU.c/h # Mahony AHRS 姿态解算 │ │ ├── ICM_42688.c/h # IMU SPI 驱动 │ │ ├── GrayscaleSensor.c/h # 灰度巡线传感器 │ │ └── Beep.c/h # 蜂鸣器 │ ├── user/ │ │ ├── src/main.c # 入口 │ │ ├── src/isr.c # 中断服务 │ │ └── inc/isr.h # 中断声明 │ └── keil/ # Keil MDK 工程 ├── libraries/ # SeekFree MSPM0 开源库 V3.2.0 └── docs/ └── 底盘通信协议指南.md ``` ## 控制架构 ``` ┌────────────────────────────────────────────┐ │ 位置环 (50Hz) │ │ 灰度传感器 → 位置 PID → angle_velocity │ │ 支持识别 90° 直角转弯 │ ├────────────────────────────────────────────┤ │ 角度环 (50Hz) │ │ IMU Yaw → 角度 PID → speed_dif │ │ 左右轮速: base ± speed_dif │ ├────────────────────────────────────────────┤ │ 速度环 (100Hz) │ │ 编码器 → 速度 PID → PWM 占空比 │ └────────────────────────────────────────────┘ ``` ### 任务调度 | 任务 | 周期 | 频率 | 优先级 | 执行内容 | |------|------|------|--------|----------| | Task_10ms | 10ms | 100Hz | 1 | 编码器更新、IMU 更新、速度控制 | | Task_20ms | 20ms | 50Hz | 1 | 灰度扫描、位置控制、角度控制 | | Task_50ms | 50ms | 20Hz | 7 | 按键扫描、蜂鸣器、命令处理 | ## PID 参数 | 环路 | Kp | Ki | Kd | 输出限幅 | 改进位 | |------|----|----|-----|----------|--------| | 速度环 | 300.0 | 150.0 | 0 | 3000 | 积分限幅+积分分离+输出滤波 | | 角度环 | 1.0 | 0 | 0 | 25 | Yaw 误差修正+微分先行 | | 位置环 | 0.5 | 0 | 0 | 90 | — | ## 通信协议 上位机通过 UART2 (115200 8N1) 与底盘通信,协议详见 `docs/底盘通信协议指南.md`。 | 帧头 | 长度 | 方向 | 用途 | |------|------|------|------| | 0xA6 | 8B | PC→MCU | 手动控制 | | 0xA7 | 3B | PC→MCU | 命令帧 (模式切换) | | 0xA8 | 38B | PC→MCU | PID 调试 | | 0xA9 | 6B | MCU→PC | 角速度前馈 | 校验和: 全部字节累加取低 8 位。 ## 工作模式 | 模式 | 控制环 | 说明 | |------|--------|------| | AUTO | 位置+角度+速度 | 灰度巡线自主行驶 | | MANUAL | 角度+速度 | 接收上位机速度/角速度指令 | | DEBUG | 停止 | 电机失能,可在线调参 | ## 传感器参数 | 参数 | 值 | |------|-----| | IMU 型号 | ICM-42688-P | | 加速度计量程 | ±16G | | 陀螺仪量程 | ±2000 deg/s | | IMU ODR | 200Hz | | 陀螺仪 LPF | X:30Hz, Y:20Hz, Z:30Hz | | 加速度计 LPF | 10Hz (三轴) | | 姿态算法 | Mahony AHRS (6轴, fast inv sqrt) | | 灰度通道数 | 8 路 | | ADC 分辨率 | 12-bit, 15 次均值滤波 | | 位置低通 | α=0.5 一阶 IIR | ## 依赖 - **SeekFree MSPM0G3507 开源库 V3.2.0** (zf_driver, zf_device, zf_common) - **TI MSPM0 SDK** (CMSIS-Core, DriverLib) - **ARM Compiler V6.19** (ARMCLANG) - **Keil MDK 5.37** (uvprojx 工程) ## 构建与烧录 使用 Keil MDK 打开 `project/keil/SeekFree_MSPM0G3507_Device_Library.uvprojx`,编译后通过 DAP-Link 烧录至 MSPM0G3507 开发板。