1. 项目概述
这个项目源于我在大学期间参加智能车竞赛的经历。当时我们团队需要设计一辆能够在复杂赛道上自主行驶的三轮竞速智能车,核心要求是速度快、稳定性高、能应对各种突发情况。经过多次迭代,最终我们基于STM32单片机开发了一套完整的智能车系统,在比赛中取得了不错的成绩。
三轮智能车相比传统的四轮车有几个显著特点:结构更简单、转向更灵活、重量更轻,但同时也带来了控制难度增加的问题。我们的系统通过精心设计的硬件架构和算法优化,成功克服了这些挑战。下面我就把整个项目的设计思路和实现细节完整分享出来。
2. 系统整体设计
2.1 硬件架构设计
整个系统采用模块化设计思路,主要包含以下几个核心模块:
-
主控模块:STM32F407ZGT6作为主控芯片
- 选择理由:168MHz主频,1MB Flash,192KB RAM
- 丰富的外设接口(12个定时器,3个ADC,2个DAC等)
- 充足的GPIO资源满足多传感器需求
-
传感器模块:
- 7路红外光电传感器(TCRT5000)
- 6轴IMU(MPU6050)
- 编码器(100线增量式)
- 超声波测距模块(HC-SR04)
-
驱动模块:
- 电机驱动(TB6612FNG双路驱动)
- 舵机驱动(SG90微型舵机)
-
电源模块:
- 7.4V 2200mAh锂电池
- 3.3V和5V稳压电路
提示:硬件布局时要特别注意电磁兼容性,电机驱动模块要远离传感器,避免干扰。
2.2 软件架构设计
软件采用分层架构,从下到上分为:
- 硬件驱动层:提供各外设的基础驱动
- 算法处理层:实现核心控制算法
- 应用逻辑层:处理比赛策略和状态机
关键设计决策:
- 使用FreeRTOS实时操作系统
- 采用DMA方式采集传感器数据
- 控制周期设置为5ms(200Hz)
3. 核心算法实现
3.1 循迹算法设计
我们采用了改进的加权平均算法处理7路红外传感器数据:
c复制#define SENSOR_NUM 7
int sensor_values[SENSOR_NUM] = {0};
int weights[SENSOR_NUM] = {-3,-2,-1,0,1,2,3}; // 权重分配
float calculate_error() {
int sum = 0, weighted_sum = 0;
for(int i=0; i<SENSOR_NUM; i++){
sum += sensor_values[i];
weighted_sum += sensor_values[i] * weights[i];
}
return (sum != 0) ? (float)weighted_sum/sum : 0;
}
算法特点:
- 对中间传感器赋予更高权重
- 加入动态阈值调整机制
- 采用滑动窗口滤波消除噪声
3.2 运动控制算法
三轮车的运动控制比四轮更复杂,我们采用了PID+前馈的复合控制策略:
-
速度环PID:
c复制typedef struct { float Kp, Ki, Kd; float integral; float prev_error; } PID_Controller; float PID_Update(PID_Controller* pid, float error, float dt) { float derivative = (error - pid->prev_error) / dt; pid->integral += error * dt; pid->prev_error = error; return pid->Kp*error + pid->Ki*pid->integral + pid->Kd*derivative; } -
转向控制:
- 使用模糊控制处理急弯情况
- 加入陀螺仪数据补偿车身倾斜
-
动力分配:
- 后轮双电机差速控制
- 前轮转向舵机角度限制
4. 系统优化与调试
4.1 实时性优化
通过以下手段确保系统实时性:
- 关键任务设为最高优先级
- 使用硬件定时器触发ADC采样
- DMA传输传感器数据
- 控制算法使用查表法加速运算
4.2 稳定性提升
-
电源管理:
- 增加大容量滤波电容
- 实现低电压报警功能
-
故障处理:
c复制void emergency_stop() { set_motor_speed(0, 0); set_servo_angle(90); buzzer_on(); led_blink(FAST); } -
参数自适应:
- 根据电池电压调整PWM占空比
- 动态调整PID参数
5. 实际测试与问题解决
5.1 测试方案设计
我们设计了多阶段测试流程:
- 单元测试:各模块单独验证
- 集成测试:系统联调
- 场景测试:
- 直线加速
- S弯道
- 急转弯
- 坡道行驶
5.2 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 车辆跑偏 | 传感器安装不平 | 重新校准传感器高度 |
| 转向抖动 | PID参数不合适 | 减小D项,增加滤波 |
| 速度不稳 | 电机供电不足 | 检查电池连接,增加电容 |
| 误判赛道 | 环境光干扰 | 调整传感器阈值,增加遮光罩 |
5.3 性能指标
最终系统达到以下指标:
- 最大速度:3.5m/s
- 最小转弯半径:30cm
- 赛道识别精度:±1cm
- 系统响应时间:<10ms
6. 项目扩展与改进
在实际使用中,我们发现还可以从以下几个方向进行优化:
- 视觉增强:增加摄像头实现更复杂的赛道识别
- 无线调试:加入蓝牙模块实现参数实时调整
- 能量回收:刹车时通过电机发电
- 机器学习:使用神经网络优化控制参数
这个项目让我深刻体会到,一个好的嵌入式系统需要硬件和软件的完美配合。特别是在实时控制系统中,每一个微秒的优化都可能带来性能的显著提升。建议后来者在开发类似项目时,一定要重视基础测试,从最简单的功能开始逐步完善。