1. 项目概述
这个基于STC90C516RD+单片机的智能小车项目,是我去年带领学生团队完成的一个嵌入式系统综合实践案例。它实现了两个核心功能:红外遥控操作和自动循迹行驶。这种双模式设计不仅涵盖了嵌入式系统开发的基础知识点,还涉及了传感器应用、电机控制等实用技术。
在实际开发过程中,我们遇到了不少挑战。比如红外信号的干扰问题、循迹传感器的灵敏度调节、电机驱动的稳定性等。通过反复调试和优化,最终实现了一个响应灵敏、运行稳定的智能小车系统。这个项目特别适合作为嵌入式学习的进阶实践,因为它涵盖了从硬件搭建到软件编程的完整开发流程。
2. 硬件系统设计
2.1 核心控制器选型
我们选择STC90C516RD+作为主控芯片,主要基于以下几点考虑:
- 性价比高:相比STM32系列,这款51内核单片机价格更低,但性能足够满足本项目需求
- 开发简单:使用Keil C51开发环境,学习曲线平缓
- 资源丰富:具有4个8位I/O口、3个定时器、1个UART串口,完全满足小车控制需求
注意:虽然项目关键词提到STM32,但实际使用的是STC90C516RD+。如果需要移植到STM32平台,需要注意外设寄存器的配置差异。
2.2 电机驱动方案
采用两片L293D电机驱动芯片驱动四个直流减速电机,这种设计有以下优势:
- 每片L293D可以驱动两个直流电机
- 内置保护二极管,防止电机反电动势损坏电路
- 最大输出电流600mA,足够驱动小型减速电机
电机驱动电路连接要点:
- 使能端(EN1,EN2)接PWM信号控制速度
- 输入引脚(IN1-IN4)接单片机I/O控制方向
- 输出引脚(OUT1-OUT4)接电机两极
- VS引脚接电机电源(与逻辑电源分开)
2.3 传感器模块设计
2.3.1 红外遥控接收
使用VS1838B红外接收头,其特点包括:
- 载波频率38kHz
- 输出信号可直接被单片机识别
- 集成解调功能,简化电路设计
在实际调试中发现,需要添加一个100μF的滤波电容来消除电源干扰,否则会出现误触发。
2.3.2 循迹传感器
采用三路ST188反射式光电传感器,安装时需注意:
- 传感器间距应略小于循迹黑线宽度
- 离地高度控制在1cm左右
- 通过可调电阻调节灵敏度
- 中间传感器应对准黑线中心
实测数据表明,当传感器距离地面0.8-1.2cm时,检测效果最佳。太近容易受地面不平影响,太远则反射信号太弱。
2.4 电源系统设计
供电方案采用两节18650锂电池(7.4V)通过AMS1117-5.0稳压为系统供电:
- 电机直接使用电池电压(7.4V)
- 单片机、传感器等使用稳压后的5V
- 添加1000μF电容滤除电机干扰
电源设计经验:
- 电机电源与逻辑电源最好分开走线
- 在靠近单片机处添加0.1μF去耦电容
- 使用肖特基二极管防止电源反接
3. 软件系统实现
3.1 程序架构设计
整个系统软件采用模块化设计,主要分为以下几个部分:
c复制// 主程序框架示例
void main() {
sys_init(); // 系统初始化
lcd_init(); // 液晶初始化
motor_init(); // 电机初始化
ir_init(); // 红外初始化
track_init(); // 循迹初始化
while(1) {
key_scan(); // 按键扫描
mode_select(); // 模式选择
if(auto_mode) track_run(); // 自动循迹模式
else remote_ctrl(); // 遥控模式
power_monitor(); // 电源监控
}
}
3.2 红外遥控解码实现
红外遥控采用NEC编码协议,解码流程如下:
- 检测9ms的引导码
- 确认4.5ms的空间码
- 接收32位数据(地址码+命令码+反码)
- 校验数据有效性
关键代码实现:
c复制// 红外接收中断服务程序
void IR_ISR() interrupt 0 {
static uint8_t ir_data[4];
static uint16_t pulse_width;
pulse_width = TH0*256 + TL0; // 获取脉冲宽度
TH0 = TL0 = 0; // 重置定时器
if(pulse_width > 8000) { // 检测引导码
ir_step = 1;
return;
}
switch(ir_step) {
case 1: // 等待空间码
if(pulse_width > 4000) ir_step = 2;
break;
case 2: // 接收数据位
ir_data[ir_cnt/8] >>= 1;
if(pulse_width > 1000) ir_data[ir_cnt/8] |= 0x80;
if(++ir_cnt >= 32) ir_step = 3;
break;
}
}
3.3 自动循迹算法
循迹控制采用经典的PID算法,具体实现如下:
-
传感器状态检测:
- 000:未检测到黑线
- 010:居中行驶
- 110/011:偏离中心
- 111:十字路口
-
PID控制公式:
c复制
error = kp * (left_sensor - right_sensor) + kd * (last_error - current_error); pwm_left = base_speed + error; pwm_right = base_speed - error; -
参数调节经验:
- Kp先调,使小车能快速响应偏差
- Kd后调,抑制超调和振荡
- 基础速度(base_speed)设为PWM周期的70%左右
3.4 电机控制实现
电机控制主要涉及以下功能:
-
方向控制:
c复制// 电机正转 IN1 = 1; IN2 = 0; // 电机反转 IN1 = 0; IN2 = 1; -
PWM速度控制:
c复制// 定时器0中断产生PWM波 void Timer0_ISR() interrupt 1 { static uint8_t pwm_cnt; if(++pwm_cnt >= 100) pwm_cnt = 0; EN1 = (pwm_cnt < left_speed); EN2 = (pwm_cnt < right_speed); } -
加减速控制:
- 采用渐变方式改变PWM占空比
- 每次调整不超过5%的变化量
- 加速和减速曲线可以不对称
4. 系统调试与优化
4.1 常见问题排查
在实际调试中,我们遇到了以下典型问题及解决方案:
-
红外遥控不灵敏:
- 检查VS1838B电源滤波电容
- 确认遥控器电池电量充足
- 调整接收头朝向角度
-
循迹不稳定:
- 重新校准传感器阈值
- 调整传感器安装高度
- 优化PID参数(kp=0.8, kd=0.2效果较好)
-
电机转动异常:
- 检查L293D散热情况
- 测量电机实际工作电流
- 添加续流二极管
4.2 性能优化技巧
通过以下优化措施,系统性能得到显著提升:
-
电源优化:
- 电机电源线加粗
- 增加储能电容(2200μF)
- 使用低ESR的陶瓷电容
-
软件优化:
- 关键代码用汇编重写
- 采用查表法替代复杂计算
- 优化中断服务程序
-
机械结构改进:
- 降低重心提高稳定性
- 使用橡胶轮胎增加摩擦
- 调整轮距提高转弯性能
5. 项目扩展方向
基于现有系统,还可以进行以下功能扩展:
-
蓝牙/WiFi控制:
- 添加HC-05蓝牙模块
- 开发手机APP控制界面
- 实现更多控制功能
-
环境感知:
- 添加超声波避障
- 集成温湿度传感器
- 实现简单SLAM
-
视觉导航:
- 使用OpenMV进行图像识别
- 实现颜色跟踪
- 二维码导航
这个项目从硬件选型到软件实现,完整展示了一个嵌入式系统的开发流程。在实际教学中,学生通过这个项目能够掌握单片机编程、传感器应用、电机控制等实用技能。特别值得一提的是,我们在循迹算法中融入了PID控制思想,这为后续学习更复杂的控制算法打下了基础。