1. 项目背景与核心目标
三轮竞速智能车系统是嵌入式开发领域一个极具挑战性的实践项目,它综合了机械结构设计、传感器融合、运动控制算法等多个技术模块。基于STM32的方案因其性价比高、生态完善,成为大多数高校电子竞赛和创客项目的首选平台。
这个项目的核心目标是通过STM32实现一个能够自主循迹、避障并完成竞速任务的三轮小车系统。相比传统的四轮结构,三轮设计(通常采用两轮驱动+万向轮方案)在转向灵活性和机械复杂度之间取得了更好的平衡,特别适合在狭窄赛道中实现快速转向。
我在去年指导大学生电子设计竞赛时,团队就采用了类似的架构。实测表明,合理的三轮布局能让小车在直径50cm的弯道实现1.5m/s的稳定通过速度,这个数据已经接近实验室自制赛车的性能极限。
2. 系统架构设计
2.1 硬件组成框架
整个系统的硬件架构可以划分为五个关键子系统:
-
主控单元:STM32F407系列单片机,168MHz主频配合FPU浮点运算单元,能够满足实时控制需求。选择这款芯片主要考虑三点:
- 充足的GPIO资源(多达114个)
- 6个硬件串口(方便多传感器通信)
- 内置定时器支持6路PWM输出
-
感知系统:
- 红外对管阵列(通常7-12路)用于赛道边界检测
- MPU6050六轴传感器获取姿态数据
- 超声波模块(HC-SR04)实现前方障碍检测
- 编码器电机(1000线)提供速度反馈
-
动力系统:
- 直流减速电机(12V/300RPM)配合TB6612驱动模块
- 3S锂聚合物电池(11.1V)供电方案
- 万向轮采用金属轴承结构减少摩擦
-
调试接口:
- SWD下载调试接口
- 蓝牙模块(HC-05)用于参数调整
- 0.96寸OLED显示运行状态
-
电源管理:
- LM2596降压模块(12V→5V)
- AMS1117稳压芯片(5V→3.3V)
- 电压电流检测电路
2.2 软件架构设计
软件部分采用分层架构,通过RT-Thread实时操作系统实现任务调度:
c复制// 典型任务优先级设置
#define TASK_PRIORITY_SENSOR 10
#define TASK_PRIORITY_CONTROL 20
#define TASK_PRIORITY_COMM 5
#define TASK_PRIORITY_DEBUG 3
关键任务包括:
- 传感器数据采集(100Hz)
- 运动控制计算(50Hz)
- 无线通信处理(20Hz)
- 状态显示更新(10Hz)
3. 核心算法实现
3.1 循迹控制策略
采用改进的加权模糊PID算法处理红外阵列数据。以7路红外传感器为例,位置偏差计算如下:
code复制误差值 = (S1*3 + S2*2 + S3*1 - S5*1 - S6*2 - S7*3) / (S1+S2+S3+S4+S5+S6+S7)
其中S1-S7为各传感器二值化结果(0/1),S4为中央基准传感器。这种算法相比传统位置式PID具有更好的抗干扰性,实测在赛道存在反光干扰时仍能保持稳定。
3.2 运动控制模型
三轮小车的运动学模型需要考虑万向轮的滑动摩擦。建立车身坐标系下的速度转换方程:
code复制Vx = (ω1 + ω2) * R / 2
ω = (ω2 - ω1) * R / L
其中:
- ω1, ω2为左右轮转速(rad/s)
- R为驱动轮半径(通常3.5cm)
- L为轮距(建议15-20cm)
关键提示:实际调试中发现万向轮摩擦系数对转向影响显著。建议采用聚氨酯材质的万向轮,摩擦系数控制在0.15-0.25之间。
3.3 姿态融合算法
通过互补滤波融合MPU6050的陀螺仪和加速度计数据:
code复制角度 = 0.98*(上一角度 + 陀螺仪*dt) + 0.02*加速度计角度
这个简单的算法在大多数场景下已经足够,如果追求更高精度可以改用Mahony滤波。实测在2m/s速度下,角度误差能控制在±1°以内。
4. 关键实现细节
4.1 PWM电机控制
使用TIM1和TIM8产生4路PWM信号驱动TB6612模块。关键配置:
c复制TIM_OCInitTypeDef oc;
oc.TIM_OCMode = TIM_OCMode_PWM1;
oc.TIM_OutputState = TIM_OutputState_Enable;
oc.TIM_Pulse = 0; // 初始占空比0%
oc.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &oc);
经验之谈:电机死区时间建议设置为500ns-1μs,过小会导致MOS管发热,过大会影响控制响应。
4.2 编码器接口配置
正交编码器接口使用TIM2和TIM3的编码器模式:
c复制TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising,
TIM_ICPolarity_Rising);
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2, ENABLE);
速度计算采用M法测速,每50ms读取一次计数值:
code复制转速(rpm) = (ΔCNT * 60) / (4*PPR*Δt)
其中PPR为编码器线数(1000线),Δt为采样周期(0.05s)
4.3 红外传感器布局
推荐两种安装方案:
- 前突式布局:传感器板伸出车体5-8cm,优点是前瞻距离长,缺点是容易受震动影响
- 下沉式布局:传感器贴近地面(2-3cm),优点是稳定性好,缺点是检测距离短
我们最终选择折中方案:传感器板与车头平齐,但通过软件补偿提前量。具体安装角度建议15-30°倾斜,这样可以增强对不同颜色赛道的适应性。
5. 系统调试技巧
5.1 PID参数整定步骤
- 先调Kp:从小到大增加,观察小车是否出现等幅振荡
- 再调Kd:抑制振荡,提高系统阻尼
- 最后调Ki:消除静差,但不宜过大
- 加入死区控制:误差小于阈值时停止调节
典型参数范围:
- 位置环Kp:8-15
- 速度环Kp:0.5-2.0
- 转向环Kd:0.1-0.5
5.2 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 小车走直线偏移 | 电机转速不一致 | 校准电机参数,加入转速补偿 |
| 急弯时冲出赛道 | 转向响应慢 | 提高差速系数,增加前馈控制 |
| 检测到虚假赛道 | 环境光干扰 | 调整传感器阈值,增加软件滤波 |
| 电池低压时失控 | 电源纹波大 | 增加稳压电容,优化PCB布局 |
5.3 竞速优化策略
通过实测发现几个提升速度的关键点:
- 弯道切内线:在检测到弯道时主动向内偏移1-2cm
- 出弯加速:当检测到50%以上传感器看到直道时提前加速
- 动态速度规划:根据曲率半径调整目标速度:
code复制其中μ取0.8-1.2(取决于轮胎材质)Vmax = sqrt(μ*g*R)
6. 机械结构优化建议
经过多次迭代,总结出几个关键设计要点:
- 重心位置:建议重心高度不超过轮轴上方3cm,前后位置在两驱动轮中间
- 万向轮选型:直径3-5cm为宜,太小容易卡滞,太大增加转动惯量
- 传感器支架:采用3D打印的镂空结构减重,同时保证刚度
- 线材管理:所有线缆用扎带固定,避免缠绕影响转向
一个容易被忽视的细节是电机安装座的刚度。我们曾遇到因铝制支架变形导致的两轮不同步问题,后来改用5mm厚碳纤维板后彻底解决。