1. 项目概述与设计思路
这个基于STM32F103C8的循迹避障灭火小车项目,是我在嵌入式系统教学过程中开发的一个综合性实践案例。它不仅涵盖了STM32基础外设的使用,还融合了传感器数据采集、电机控制、人机交互等多个关键技术点。对于想要系统学习STM32开发的朋友来说,这个项目能让你快速掌握从硬件搭建到软件开发的完整流程。
这个小车的核心功能包括:
- 通过两路红外传感器实现黑线循迹
- 利用超声波传感器进行前方障碍物检测
- 采用PWM技术对电机进行精确调速
- 通过OLED显示屏实时显示系统状态
- 使用DS18B20监测环境温度
- 通过继电器控制灭火装置(理论设计)
- 蜂鸣器报警提示异常情况
2. 硬件系统设计详解
2.1 主控芯片选型与配置
我们选择了STM32F103C8作为主控芯片,这款芯片属于STM32F1系列的"中等容量"产品,具有:
- 72MHz主频的Cortex-M3内核
- 64KB Flash和20KB SRAM
- 丰富的外设接口(3个USART、2个SPI、2个I2C等)
- 多达7个定时器(包括高级定时器和通用定时器)
在实际项目中,我们主要使用了以下外设资源:
- TIM2用于生成PWM信号控制电机
- TIM4用于超声波测距计时
- GPIO用于传感器数据采集和状态控制
- I2C接口连接OLED显示屏
2.2 传感器模块选型与电路设计
2.2.1 红外循迹传感器
我们采用了两路TCRT5000红外反射式传感器,这种传感器具有以下特点:
- 检测距离可调(2-15mm)
- 数字输出(检测到黑线输出低电平)
- 工作电压3.3V-5V兼容
电路连接方式:
- VCC接3.3V
- GND接地
- OUT引脚接STM32的GPIO(PB4和PB5)
注意:实际安装时,建议将传感器高度调整到距离地面约1cm,这个距离下检测效果最佳。
2.2.2 超声波测距模块
选用常见的HC-SR04超声波模块,主要参数:
- 测距范围:2cm-400cm
- 精度:约3mm
- 工作电压:5V
连接方式:
- VCC接5V
- Trig接PB8(触发信号)
- Echo接PC1(回波信号)
- GND接地
2.2.3 温度传感器
DS18B20数字温度传感器特点:
- 测量范围:-55°C至+125°C
- 精度:±0.5°C
- 单总线接口
连接方式:
- VDD接3.3V
- DQ接PA0(需接4.7K上拉电阻)
- GND接地
2.3 电机驱动系统
采用L298N双H桥电机驱动模块,主要特性:
- 驱动电压:5V-35V
- 单路最大电流2A
- 支持PWM调速
接线说明:
- IN1、IN2接左电机控制信号
- IN3、IN4接右电机控制信号
- ENA、ENB接PWM信号(PA5和PA6)
3. 软件系统设计与实现
3.1 开发环境搭建
我们使用以下工具链:
- Keil MDK-ARM 5(建议使用V5.25及以上版本)
- STM32标准外设库(建议使用V3.5.0)
- Proteus 8.15用于电路仿真
提示:在Keil中新建工程时,务必正确配置芯片型号为STM32F103C8,并选择正确的启动文件(startup_stm32f10x_md.s)。
3.2 系统软件架构
整个软件系统采用模块化设计,主要包含以下功能模块:
code复制├── 主循环(main.c)
│ ├── 系统初始化
│ ├── 模式切换处理
│ └── 状态监测
├── 传感器驱动
│ ├── 红外传感器(ir_sensor.c)
│ ├── 超声波(ultrasonic.c)
│ └── 温度传感器(ds18b20.c)
├── 执行机构驱动
│ ├── 电机控制(motor.c)
│ ├── 舵机控制(servo.c)
│ └── 继电器控制(relay.c)
├── 人机交互
│ ├── OLED显示(oled.c)
│ └── 按键处理(key.c)
└── 系统服务
├── 延时函数(delay.c)
└── 中断服务(isr.c)
3.3 关键算法实现
3.3.1 循迹控制算法
我们采用经典的PD控制算法来实现稳定的循迹功能:
c复制// 循迹控制参数
#define KP 0.8 // 比例系数
#define KD 0.2 // 微分系数
int last_error = 0; // 上一次误差
void Track_Control(void)
{
int error = IR_Read() - 1; // 获取当前误差(-1,0,1)
int output = KP * error + KD * (error - last_error);
last_error = error;
// 调整电机速度
Motor_SetSpeed(LEFT_MOTOR, BASE_SPEED + output);
Motor_SetSpeed(RIGHT_MOTOR, BASE_SPEED - output);
}
3.3.2 避障决策逻辑
超声波避障采用分级响应策略:
c复制void Obstacle_Avoidance(uint16_t distance)
{
if(distance < 10) { // 紧急停止
Motor_Stop();
Beeper_Alert(3);
}
else if(distance < 20) { // 减速并准备转向
Motor_SetSpeed(LEFT_MOTOR, BASE_SPEED/2);
Motor_SetSpeed(RIGHT_MOTOR, BASE_SPEED/2);
Servo_SetAngle(90); // 舵机回中
}
else if(distance < 40) { // 轻微减速
Motor_SetSpeed(LEFT_MOTOR, BASE_SPEED*0.8);
Motor_SetSpeed(RIGHT_MOTOR, BASE_SPEED*0.8);
}
// 大于40cm不处理
}
4. 系统调试与优化
4.1 常见问题及解决方法
在实际调试过程中,我们遇到了以下几个典型问题:
-
电机响应不稳定
- 现象:PWM控制电机时出现抖动
- 原因:电源功率不足
- 解决:为电机驱动单独供电,与控制系统电源隔离
-
超声波测距误差大
- 现象:测量距离与实际距离偏差较大
- 原因:环境噪声干扰
- 解决:增加多次测量取平均值,并添加软件滤波
-
红外循迹误检测
- 现象:在非黑线区域也触发检测
- 原因:环境光干扰
- 解决:调整传感器灵敏度电位器,增加检测阈值判断
4.2 性能优化技巧
通过实践总结,以下几个优化措施能显著提升系统性能:
-
中断优先级管理
- 将超声波回波中断设为最高优先级
- 电机控制中断设为中等优先级
- 其他功能使用低优先级
-
电源管理优化
- 为数字电路和模拟电路分别供电
- 在电源入口处增加大容量滤波电容
-
软件架构优化
- 采用状态机设计模式
- 关键功能使用RTOS任务管理
5. 项目扩展与进阶
这个基础框架可以进一步扩展更多功能:
-
无线遥控功能
- 添加HC-05蓝牙模块实现手机控制
- 或添加NRF24L01实现2.4G遥控
-
图像识别扩展
- 使用OV7670摄像头模块
- 实现基于OpenMV的视觉识别
-
物联网功能
- 添加ESP8266 WiFi模块
- 实现远程监控和数据上传
-
多车协同
- 基于Zigbee或LoRa的车间通信
- 实现车队编队行驶
在实际教学中,我发现这个项目最让学生受益的是它涵盖了嵌入式开发的完整流程。从最初的方案设计,到硬件选型,再到软件开发和系统调试,每个环节都需要认真思考和反复实践。特别是当看到自己设计的小车能够稳定地循迹行驶时,那种成就感是难以言表的。
对于想要复现这个项目的朋友,我有几个小建议:
- 先从Proteus仿真开始,验证基本功能
- 分模块调试,不要试图一次完成所有功能
- 做好详细的调试记录,这对排查问题非常有帮助
- 多参考STM32的参考手册和标准外设库例程
