# CarB **Repository Path**: lirongman/car-b ## Basic Information - **Project Name**: CarB - **Description**: ............ - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-24 - **Last Updated**: 2026-07-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MSPM0G3507 智能小车 — WIT 陀螺仪 + 编码器 + TB6612 + OLED + UART TI MSPM0G3507(CCS Theia + SysConfig),裸机任务框架。维特智能陀螺仪 DMA 姿态解算,20ms 定时器中断 PID 闭环控制,TB6612 电机驱动 + 编码器。 ## 硬件接线 | 外设 | 单片机 | 说明 | |---|---|---| | OLED SCL | PB2 | SSD1306 | | OLED SDA | PB3 | SSD1306 | | WIT TX | PB6 | 维特智能陀螺仪 | | WIT RX | PB7 | 维特智能陀螺仪 | | UART TX | PA21 | USB-TTL (115200) | | UART RX | PA22 | USB-TTL | | M1 PWM | PA12 | TB6612 PWMA | | M2 PWM | PA13 | TB6612 PWMB | | M1 IN1 | PA26 | TB6612 方向 | | M1 IN2 | PA24 | TB6612 方向 | | M2 IN1 | PB9 | TB6612 方向 | | M2 IN2 | PA27 | TB6612 方向 | | STBY | PA7 | TB6612 使能 | | M1 编码 A | PB0 | 编码器 (中断) | | M1 编码 B | PB1 | 编码器 | | M2 编码 A | PB4 | 编码器 (中断) | | M2 编码 B | PB16 | 编码器 | ## 工程结构 ``` ├── main.c # 初始化 → 超级循环 ├── main.h # 统一头文件 ├── oled-software-i2c.syscfg # SysConfig: GPIO/UART/PWM/Timer/DMA │ ├── App/ # 应用层 (裸机任务框架) │ ├── task.h # Task_CheckDelay + Task_Test/Task_WIT/Task_OLED/Task_UART │ ├── task.c # 任务实现 + 测试函数 │ ├── Encoder.c/h # 编码器 (GPIO 中断) │ ├── Motor.c/h # TB6612 电机驱动 │ └── Motor_pid.c/h # PID 控制器 + 模式标志位 │ └── Drivers/ ├── WIT/ # 维特智能陀螺仪 (DMA) │ ├── wit.h/c # API + DMA 接收 + 角度解算 │ └── wit_config.h # DMA 通道配置 ├── MSPM0/ # SysTick / 中断 (编码器 + DMA + TIMER PID) │ ├── clock.c/h # tick_ms / system_time_ms │ └── interrupt.c/h # 编码器 ISR + DMA ISR + TIMER PID ISR └── OLED_Software_I2C/ # SSD1306 ``` ## 控制架构 ``` TIMER_0 (20ms 硬件中断) — PID 控制: 编码器更新 → 根据模式标志位执行不同控制 → Set_PWM 主循环 (非实时): Task_Test() — 设标志位+目标 Task_WIT() — 陀螺仪角度 10ms Task_OLED() — 显示刷新 100ms Task_UART() — 串口输出 200ms ``` ## PID 模式 | 标志位 | 模式 | 说明 | |---|---|---| | `S_PID = 1` | 速度环 | `pidMotor1Speed.target_val` → PWM | | `L_PID = 1` | 位置环 | `pidMotor1Loc.target_val` → PWM | | `S_L_PID = 1` | 速度串位置 | 外层位置环(`g_pos_speed_limit`限速) → 内层速度环 | | `AS_PID = 1` | 角度保持 | `pidYaw.target_val` → 差速 PWM, 锁定 Yaw 角 | ```c /* 测试函数 App/task.c: Task_Test() */ S_L_PID = 1; g_pos_speed_limit = 20; pidMotor1Loc.target_val = 1000; // 位置串速度 S_PID = 1; pidMotor1Speed.target_val = 20; // 纯速度 L_PID = 1; pidMotor1Loc.target_val = 500; // 纯位置 AS_PID = 1; pidYaw.target_val = 0; // 角度保持 ``` ## PID 参数 | PID | Kp | Ki | Kd | 限幅 | |---|---|---|---|---| | 速度环 M1 | 2.55 | 3.1 | 1.58 | ±999 | | 速度环 M2 | 2.50 | 2.94 | 1.08 | ±999 | | 位置环 | 1.0 | 0 | 3.0 | `g_pos_speed_limit` | | Yaw 角 | 5.8 | 0 | 0.8 | ±100 | ### 调参 - **速度环**: `Motor_pid.c` → `pidMotor1Speed.Kp/Ki/Kd` - **位置环**: `Motor_pid.c` → `pidMotor1Loc.Kp/Kd` - **位置环限速**: `g_pos_speed_limit` - **Yaw 角**: `Motor_pid.c` → `pidYaw.Kp/Kd` ## API 速查 ```c /* WIT 陀螺仪 */ WIT_Init(); // DMA 接收 WIT_GetUnlimitedAnglesAccumulated(&pitch, &roll, &yaw); // 多圈角度 /* 电机 */ Motor_on(); // 使能 Set_PWM(m1, m2); // 开环 PWM (±999) /* 编码器 */ Encoder_Init(); // GPIO 中断 + NVIC encoder_value1; // 速度 (脉冲/20ms) location_1; // 累计位置 /* PID */ PID_init(); // 初始化参数 PID_calc(&pid, actual, limit); // 通用 PID PID_yaw_calc(&pidYaw, yaw); // Yaw 角度 PID (处理 ±180° 跳变) ``` ## 编译与烧录 - CCS Theia: Build / Flash - 命令行: `cd Debug && "E:/CCS-/ccs/utils/bin/gmake" -k -j 16 all -O` - 工具链: CCS `E:\CCS-`, SDK `E:\SDK\mspm0_sdk_2_04_00_06`