1. 项目概述
这个智能小车项目是我去年带学生做的一个嵌入式系统综合实验,核心目标是实现红外遥控和自动寻迹两大功能。选择STC90C516RD+作为主控芯片主要是考虑到它性价比高、资源丰富,特别适合教学场景。整个系统硬件成本控制在200元以内,但实现了相当完整的智能车基础功能。
在实际开发中,我们遇到了几个典型问题:红外信号接收不稳定、电机响应延迟、寻迹灵敏度调节等。通过反复调试PWM占空比和传感器阈值,最终实现了稳定运行。下面我会详细拆解整个系统的设计思路和实现细节。
2. 硬件系统设计
2.1 核心器件选型
主控芯片选用STC90C516RD+主要基于以下考量:
- 内置64KB Flash和1280B RAM,足够存储控制程序
- 支持4个PWM输出通道,正好驱动两个电机
- 工作电压3.3-5V,与外围器件兼容性好
- 价格仅8元左右,性价比极高
电机驱动选用L293D双H桥芯片,主要优势:
- 单芯片可驱动两个直流电机
- 峰值输出电流600mA,满足小型减速电机需求
- 内置保护二极管,电路设计更简单
2.2 传感器模块设计
红外接收使用VS1838B一体化接收头,其特点包括:
- 38kHz载波频率解调
- 输出TTL电平信号
- 接收角度约±45度
寻迹传感器采用三路ST188反射式光电对管,布局方案:
code复制[左传感器] [中传感器] [右传感器]
间距2.5cm,离地高度1cm
这种布局可以检测3cm宽的黑线,通过调节发射管电流可以适应不同反光率的地面。
2.3 电源系统设计
采用两节18650锂电池(7.4V)供电,通过:
- AMS1117-5.0稳压到5V(单片机、传感器)
- AMS1117-3.3稳压到3.3V(部分IC)
- 直接7.4V驱动电机
实测电流消耗:
- 静态:约80mA
- 电机全速:约350mA
- 峰值电流:500mA(电机启动瞬间)
3. 软件架构实现
3.1 主程序流程
c复制void main() {
hardware_init(); // 外设初始化
lcd_init(); // 显示屏初始化
while(1) {
if(ir_flag) // 红外接收中断标志
remote_ctrl();
else
track_run(); // 自动寻迹
lcd_show(); // 刷新显示
}
}
3.2 红外解码实现
关键解码逻辑:
- 配置定时器捕获下降沿
- 测量脉冲间隔时间:
- 引导码:9ms低电平+4.5ms高电平
- 数据位:560us低电平+逻辑1(1690us)/0(560us)高电平
- 32位数据包结构:
- 前16位:用户码
- 后16位:键值+反码
典型键值处理:
c复制switch(ir_code) {
case 0x45: motor_forward(); break; // 前进
case 0x46: motor_stop(); break; // 停止
case 0x47: motor_left(30); break; // 左转30%功率
case 0x44: motor_right(30); break; // 右转30%功率
}
3.3 寻迹算法设计
采用三态控制策略:
- 中间传感器检测到黑线:直行
- 左侧传感器检测到:左转修正
- 右侧传感器检测到:右转修正
- 全部未检测到:维持最后状态
PWM调速参数:
- 直行:左轮80% 右轮80%
- 左转:左轮30% 右轮80%
- 右转:左轮80% 右轮30%
4. 调试经验总结
4.1 红外接收优化
遇到的主要问题:遥控距离短(<1米)、角度受限
改进措施:
- 增加接收头数量(前、后各1个)
- 软件去抖动处理:
c复制if(ir_pin == LOW) {
delay_ms(10); // 消抖
if(ir_pin == LOW) {
// 确认为有效信号
}
}
- 在接收头前加装透明亚克力导光柱
4.2 寻迹稳定性提升
常见问题及解决方案:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 冲出赛道 | 车速过快 | 降低PWM占空比至60% |
| 左右摇摆 | 传感器太灵敏 | 调整比较器阈值电压 |
| 不响应急弯 | 传感器间距大 | 增加传感器数量至5路 |
4.3 电机控制技巧
- 加速/减速渐变:
c复制void motor_speed(uint8_t target) {
static uint8_t current = 0;
while(current != target) {
current += (current < target) ? 1 : -1;
pwm_set(current);
delay_ms(20); // 20ms步进间隔
}
}
- 死区补偿:当PWM占空比<15%时,电机可能不启动,需要在软件中做补偿:
c复制if(pwm < 15) pwm = 15;
5. 系统扩展方向
基于现有平台可以进一步开发:
- 超声波避障功能
- 添加HC-SR04模块
- 实现10-200cm距离检测
- 蓝牙遥控
- 通过HC-05模块
- 支持手机APP控制
- 路径记忆
- 增加AT24C02 EEPROM
- 记录行驶轨迹
硬件改造建议:
- 改用STM32F103C8T6主控,提升处理能力
- 采用TB6612FNG替代L293D,降低功耗
- 增加6轴MPU6050传感器实现姿态控制
这个项目最让我意外的是STC单片机表现出的稳定性——在电机干扰环境下依然能可靠工作。建议初学者可以先用STC入门,再过渡到更复杂的ARM平台。对于想要完整代码的朋友,可以在我的GitHub仓库找到全部工程文件。
