1. 项目概述
作为一名电子工程师,我经常需要测量各种移动设备的行驶速度和里程。市面上的成品测速仪要么价格昂贵,要么功能单一,于是我决定自己动手做一个基于单片机的里程速度测试表。这个小玩意儿成本不到50元,但精度完全能满足日常使用需求,特别适合DIY爱好者和学生用来做各种小车、滑板等移动设备的测速实验。
这个测试表的核心原理很简单:通过传感器检测车轮转动,单片机计算转动次数和时间,就能得出速度和里程。听起来容易,但实际做起来有不少门道。比如怎么选择传感器、如何提高测量精度、怎样优化显示效果等等。下面我就把整个设计过程详细拆解,包括硬件选型、电路设计、程序编写和实际调试中的各种经验教训。
2. 硬件设计与选型
2.1 核心器件选择
主控芯片我选了STC89C52RC,这是款经典的51单片机,价格只要5块钱左右,有8K Flash和512字节RAM,完全够用。更关键的是它内置了定时器/计数器,正好可以用来计算脉冲信号。
传感器方面,我对比了霍尔传感器和光电对管两种方案。霍尔传感器需要配合磁铁使用,安装比较麻烦;最后选了槽型光电开关(型号EE-SX670),价格3元一个,直接卡在轮辐上就能用,而且输出信号干净,抗干扰能力强。
显示部分用了0.96寸OLED(SSD1306驱动),比LCD更省电,可视角度也更好。虽然价格贵一点(15元左右),但显示效果提升明显,特别是在户外使用时。
2.2 电路设计要点
电源部分需要注意,光电传感器工作电压是5V,而OLED是3.3V的。我用了AMS1117-3.3稳压芯片给OLED供电,主电路还是用5V。这里有个坑:STC单片机虽然标称5V工作,但实际IO口耐压只有4.5V,所以光电传感器的输出信号要加个1kΩ电阻限流。
信号处理电路很关键,光电开关输出的是脉冲信号,需要经过施密特触发器(74HC14)整形后再送给单片机。我最初没加这个芯片,结果在低速时经常漏计数,后来加上就好了。电路图里一定要给光电开关加上拉电阻(我用的是10kΩ),否则输出信号会不稳定。
重要提示:所有数字信号线都要加100nF的退耦电容,特别是OLED的电源引脚。我调试时就因为没加这个电容,显示会出现乱码。
3. 软件设计与算法实现
3.1 脉冲计数与速度计算
速度计算的核心是测量两个脉冲之间的时间间隔。我用的是单片机Timer0工作在16位定时器模式,每收到一个脉冲就记录当前定时器值。假设车轮周长是L(单位:米),脉冲间隔时间是Δt(单位:秒),那么瞬时速度v = L/Δt。
这里有几个优化点:
- 采用移动平均算法,我取最近5次测量的平均值,这样速度显示更稳定
- 加入最小时间阈值(我设的是50ms),避免因传感器抖动导致的误触发
- 对极端值进行过滤,比如速度突然从0跳到极大值,显然是错误数据
c复制// 速度计算核心代码示例
#define WHEEL_CIRCUMFERENCE 0.5 // 车轮周长0.5米
float calculate_speed(unsigned int time_interval) {
if(time_interval < 50) return 0; // 过滤异常短间隔
float speed = (WHEEL_CIRCUMFERENCE * 1000) / time_interval; // 转换为cm/ms
return speed * 3.6; // 转换为km/h
}
3.2 里程累计与存储
里程就是脉冲总数乘以车轮周长。为了防止断电丢失数据,我每隔1分钟就把当前里程保存到EEPROM(AT24C02)。这里要注意写EEPROM有寿命限制(约10万次),所以不能频繁写入。
我设计了一个双缓冲机制:RAM中维护两个累计值,一个实时更新,另一个用于显示和存储。这样即使正在写入EEPROM时断电,也只会丢失最多1分钟的数据。
3.3 OLED显示优化
OLED刷新率设置很关键,太高会闪烁,太低则反应迟钝。经过测试,我将刷新间隔设为200ms效果最好。显示内容分为三部分:
- 顶部:实时速度(大字体)
- 中部:本次里程(小字体)
- 底部:总里程和运行时间
为了在强光下也能看清,我调整了对比度值为0xCF,并启用了反色显示模式。字体选用8x16像素的等宽字体,数字显示特别清晰。
4. 机械结构与安装要点
4.1 传感器安装方案
经过多次尝试,我发现最佳安装位置是在车轮支架内侧,距离轮辐约5mm。太近容易碰擦,太远则信号弱。固定方式用3M双面胶+扎带,既牢固又方便调整。
测试发现,轮辐数量会影响测量精度。我建议在轮子上等距贴3-5条反光条(可以用白色电工胶带),这样无论轮子转到什么位置,都能保证信号稳定。
4.2 外壳设计与防水
用3D打印了一个防水外壳(材料PLA),主要考虑:
- 顶部开孔让OLED露出
- 底部留出传感器线槽
- 侧面用硅胶塞住接口
- 整体尺寸控制在60x40x20mm
实际使用中发现,长时间暴晒会导致PLA变形。后来改用ABS材料打印,并用黑色喷漆处理,既防晒又美观。
5. 校准与精度优化
5.1 车轮周长测量
这是影响精度的最关键参数。我的方法是:
- 在地上画条直线
- 让车轮滚动完整一圈
- 测量起点到终点的距离
重复测量5次取平均值。对于不同路面(如地毯、水泥地),周长会有微小差异,建议在实际使用环境下测量。
5.2 软件校准方法
程序中预留了校准系数K:
实际速度 = 测量速度 × K
初始K=1.0,可以通过以下步骤校准:
- 用手机GPS测速作为基准
- 同时记录设备显示速度
- 计算两者比值调整K值
我测试发现,校准后误差可以控制在±2%以内。
6. 常见问题排查
6.1 速度显示不稳定
可能原因及解决方法:
- 传感器距离不当 - 重新调整间隙
- 电源噪声 - 检查退耦电容
- 环境光干扰 - 加装遮光罩
- 轮辐反射率低 - 贴反光条
6.2 OLED显示异常
典型现象及处理:
- 屏幕全白 - 检查3.3V电源
- 显示乱码 - 重插排线或降低SPI时钟
- 局部缺画 - 可能是屏幕损坏
- 闪烁严重 - 调整刷新间隔
6.3 里程数据丢失
预防措施:
- 确保EEPROM写入完成再断电
- 定期备份数据到手机(可通过蓝牙模块)
- 采用铁电存储器(FRAM)替代EEPROM
7. 功能扩展思路
这个基础版本完成后,还可以考虑以下升级:
- 增加蓝牙模块,把数据实时传到手机
- 加入GPS模块做双重校验
- 设计可充电锂电池供电
- 开发上位机软件分析历史数据
- 添加超速报警功能
我在实际使用中发现,最实用的还是蓝牙传输功能。用HC-05模块成本不到10元,就能在手机上查看实时曲线。特别是做小车调速实验时,可以直观看到PID控制效果。