STM32自动循迹小车设计与电赛实战经验
1. 项目背景与竞赛要求解析
2018年山西省大学生电子设计竞赛的自动循迹小车(题目3)是一个典型的嵌入式系统综合设计项目。这类竞赛题目通常考察学生对传感器应用、电机控制、算法实现等核心技能的掌握程度。从技术角度看,题目要求小车能够自主识别路径(通常为黑色引导线),并完成指定动作(如硬币检测、坡道行驶等附加任务)。
在实际参赛过程中,我们团队选择了STM32F103C8T6作为主控芯片,这是当时电赛中最常用的MCU之一。其72MHz主频、丰富的外设接口(包括多路PWM输出和ADC通道)以及成熟的生态支持,使其成为性价比极高的选择。特别值得注意的是,这款芯片的GPIO口驱动能力足够直接驱动OLED显示屏,为实时数据显示提供了便利。
2. 硬件系统架构设计
2.1 主控模块选型
STM32F103C8T6最小系统板包含:
- 8MHz晶振(主时钟)
- 32.768kHz晶振(RTC备用)
- 复位电路
- 烧录接口(SWD模式)
- 3.3V稳压电路
实际调试中发现:使用外部有源晶振能显著提高系统稳定性,特别是在PWM波形生成时,可避免因时钟漂移导致的电机控制异常。
2.2 循迹传感器方案对比
我们测试了三种主流方案:
红外对管阵列(最终采用方案)
- TCRT5000模块x5
- 安装间距15mm
- 检测高度8-12mm
- 成本:¥2.5/个
LDC1000电感检测(测试后放弃)
- 优点:可检测金属轨迹
- 缺点:响应速度慢(>10ms)
- 功耗高(持续工作电流>50mA)
摄像头方案(OpenMV)
- 图像处理效果最佳
- 但STM32F103资源不足
- 系统复杂度大幅增加
传感器布局采用前3后2的"箭头形"排列,前部三个传感器间距较窄(10mm)用于精确循迹,后部两个间距较宽(30mm)用于检测急弯。
3. 核心电路实现细节
3.1 电机驱动电路
采用双H桥驱动方案:
- 驱动芯片:TB6612FNG
- 工作电压:6-15V
- 峰值电流:1.2A/通道
- PWM频率:10kHz(实测最佳值)
关键参数计算:
电机堵转电流 = 电压 / 内阻 = 7.4V / 3.2Ω ≈ 2.3A 实际工作电流 ≈ 0.3-0.8A(带载) 故需保证MOSFET的Id > 1.5A(留有裕量)3.2 电源管理系统
- 主电源:7.4V 2000mAh锂电池
- 3.3V稳压:AMS1117-3.3
- 5V转换:LM2596可调模块
- 电流分配:
- 主控:<100mA
- 传感器:~50mA
- 电机:峰值1.2A
重要教训:电机启停会造成电压骤降,必须在电源输入端并联470μF以上电解电容,否则会导致MCU复位。
4. 软件算法实现
4.1 循迹控制算法
采用改进型PD算法:
// 误差计算 int error = 0; if(sensor[2]) error = 2; else if(sensor[1]) error = 1; else if(sensor[3]) error = -1; else if(sensor[0]) error = 2; else if(sensor[4]) error = -2; // PD控制 static int last_error = 0; float output = Kp*error + Kd*(error - last_error); last_error = error; // 电机输出 MotorL_SetSpeed(base_speed + output); MotorR_SetSpeed(base_speed - output);参数整定经验:
- 先调Kp至小车能基本跟随
- 再调Kd消除振荡(典型值Kp=30,Kd=15)
- 采样周期建议10ms
4.2 OLED显示实现
使用4线SPI驱动0.96寸OLED:
// 引脚定义 #define OLED_SCK PA5 #define OLED_SDA PA7 #define OLED_RES PB0 #define OLED_DC PB1 #define OLED_CS PA4 // 初始化序列 void OLED_Init(void) { OLED_WriteCmd(0xAE); // 关闭显示 OLED_WriteCmd(0xD5); // 设置时钟分频 OLED_WriteCmd(0x80); OLED_WriteCmd(0xA8); // 设置复用率 OLED_WriteCmd(0x3F); // ...更多初始化命令 OLED_WriteCmd(0xAF); // 开启显示 }显示优化技巧:
- 使用页地址模式减少数据传输量
- 建立显示缓冲区避免频繁刷新
- 关键参数用反色显示提高可视性
5. 现场调试与问题排查
5.1 典型故障现象及解决方案
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 小车走S形路线 | PD参数不合适 | 增大Kd值 |
| 响应迟钝 | 传感器高度过高 | 调整至8-10mm |
| 电机异响 | PWM频率过低 | 提高到10-15kHz |
| OLED花屏 | 电源干扰 | 增加0.1μF去耦电容 |
5.2 竞赛现场应急方案
- 备用程序烧录:准备多个含不同参数的hex文件
- 传感器快速校准:预留地面测试模式按键
- 电压监控:OLED实时显示电池电压
- 参数热调整:通过按键微调PID参数
6. 系统优化方向
6.1 硬件改进
- 改用磁编码器电机提高速度控制精度
- 增加IMU模块实现姿态补偿
- 采用数字红外传感器(如GP2Y0A21)替代模拟输出
6.2 软件升级
- 引入状态机管理运行模式
- 增加自适应PID算法
- 实现SD卡参数存储功能
在实际比赛中,我们通过精确的机械结构调整(传感器距地面高度保持一致)和软件滤波(对传感器信号进行移动平均处理),最终使小车在2cm宽的黑色引导线上实现了±1mm的循迹精度。这个项目最深的体会是:电赛作品的成功=60%的硬件可靠性+30%的算法鲁棒性+10%的临场应变能力。建议后续参赛者至少预留3天时间进行全工况测试(不同光照、不同地面材质等),这往往是决定名次的关键因素。