STM32自动循迹小车设计与电赛实战经验

📅 2026/7/19 11:28:26 👁️ 阅读次数 📝 编程学习
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 循迹传感器方案对比

我们测试了三种主流方案:

  1. 红外对管阵列(最终采用方案)

    • TCRT5000模块x5
    • 安装间距15mm
    • 检测高度8-12mm
    • 成本:¥2.5/个
  2. LDC1000电感检测(测试后放弃)

    • 优点:可检测金属轨迹
    • 缺点:响应速度慢(>10ms)
    • 功耗高(持续工作电流>50mA)
  3. 摄像头方案(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 竞赛现场应急方案

  1. 备用程序烧录:准备多个含不同参数的hex文件
  2. 传感器快速校准:预留地面测试模式按键
  3. 电压监控:OLED实时显示电池电压
  4. 参数热调整:通过按键微调PID参数

6. 系统优化方向

6.1 硬件改进

  • 改用磁编码器电机提高速度控制精度
  • 增加IMU模块实现姿态补偿
  • 采用数字红外传感器(如GP2Y0A21)替代模拟输出

6.2 软件升级

  • 引入状态机管理运行模式
  • 增加自适应PID算法
  • 实现SD卡参数存储功能

在实际比赛中,我们通过精确的机械结构调整(传感器距地面高度保持一致)和软件滤波(对传感器信号进行移动平均处理),最终使小车在2cm宽的黑色引导线上实现了±1mm的循迹精度。这个项目最深的体会是:电赛作品的成功=60%的硬件可靠性+30%的算法鲁棒性+10%的临场应变能力。建议后续参赛者至少预留3天时间进行全工况测试(不同光照、不同地面材质等),这往往是决定名次的关键因素。