1. 项目概述
这个基于单片机的里程速度测试表是我去年为一个自行车改装俱乐部设计的实用小工具。当时俱乐部成员经常抱怨市面上商业码表要么功能过剩价格昂贵,要么精度不足影响训练效果。于是我们决定自己动手做一个成本控制在50元以内、精度达到专业级、同时能自由定制功能的骑行数据记录器。
核心功能说起来很简单:实时显示当前速度、累计里程和单次骑行时间。但要让这个小装置在颠簸骑行环境下稳定工作,需要考虑磁铁传感器选型、信号防抖算法、低功耗显示方案等一系列技术细节。经过三个周末的原型迭代,最终成品不仅满足了基础需求,还通过串口实现了骑行数据导出功能,让车友们能后期分析训练效果。
2. 硬件设计解析
2.1 核心器件选型
主控选用STC89C52RC这款经典51单片机,主要看中其内置EEPROM可存储累计里程,且价格仅6.8元。实测发现其运行速度完全能满足每秒20次的速度采样需求(对应40km/h时速下的精度要求)。
传感器方面对比了霍尔元件和干簧管后,最终选用A3144霍尔传感器。虽然比干簧管贵2元,但其百万次以上的使用寿命和IP67防护等级更适合户外环境。安装时需要注意传感器与磁铁的间隙控制在5-8mm,这个距离既能可靠触发又不会因车轮偏摆导致误判。
2.2 电源管理设计
采用两节7号电池供电时遇到个棘手问题:普通LDO在电池电压降至2.4V时就无法维持3.3V输出。后来改用HT7333低压差稳压芯片,实测能在2.1V输入时仍保持稳定输出,使电池利用率提升30%。配合软件实现的显示背光自动关闭功能,整套系统待机电流仅0.8mA。
重要提示:焊接HT7333时务必注意引脚顺序与普通LDO不同,我的第一版PCB就因这个错误导致芯片烧毁。
3. 软件实现细节
3.1 速度计算算法
基本思路是通过检测磁铁经过传感器的间隔时间来计算速度。但直接使用两次触发的时间差会遇到严重抖动问题。我的解决方案是:
- 采用移动平均滤波,记录最近5次触发时间
- 剔除明显偏离平均值的数据点(如因颠簸导致的误触发)
- 通过圆周公式换算:速度(km/h)= (2πr×3.6)/Δt
(r为车轮半径,Δt为平均间隔时间)
在代码实现时特别注意了32位整数的运算溢出问题。最初使用16位变量存储毫秒数,结果当车速低于8km/h时就会因数值过大导致计算错误。
3.2 里程累计策略
里程数据需要断电保存,但频繁写入EEPROM会缩短器件寿命。我的折中方案是:
- 每增加0.1公里才写入一次EEPROM
- 采用异或校验防止数据错误
- 在内存中维护精确到米的临时值
实测表明,这种策略下EEPROM可支持超过10万次写入,按日均骑行30公里计算足够使用9年以上。
4. 机械结构与安装
4.1 3D打印外壳设计
使用FreeCAD设计了分体式外壳,重点考虑:
- 前壳厚度1.2mm保证LCD可视性
- 后壳设置1.5mm加强筋防止变形
- 防水胶圈槽深度设计为线径的1.3倍
- 按键采用斜面设计方便戴手套操作
打印时发现PLA材料在夏日暴晒下会软化变形,后来改用PETG材料并添加5%的碳纤维填充,彻底解决了这个问题。
4.2 现场安装要点
经过多次路试总结出最佳安装位置:
- 传感器固定在前叉内侧,距轴心10cm处
- 磁铁安装在辐条上对应位置
- 主机安装在把立正中,倾斜15度便于观察
特别注意传感器线缆要走蛇形弯并预留5mm余量,避免转向时拉扯断线。我第一次安装时就因线缆绷得太紧,两周后出现了间歇性接触不良。
5. 实测数据对比
使用汽车GPS设备作为基准进行对比测试:
| 速度段(km/h) | 本设计误差 | 市售码表误差 |
|---|---|---|
| 10-15 | ±0.3 | ±1.2 |
| 20-25 | ±0.2 | ±0.8 |
| 30-35 | ±0.4 | ±1.5 |
异常情况处理方面,当遇到连续5秒无信号时会自动进入暂停模式,避免因磁铁脱落导致里程误累计。这个功能在越野骑行时特别实用,有次磁铁被树枝刮掉后,系统正确识别并保持了原有里程数据。
6. 功能扩展实践
后来应车友要求增加了蓝牙传输模块(HC-05),通过手机APP实现:
- 实时显示速度曲线
- 自动记录骑行路线
- 生成训练报告
在代码优化时发现,直接传输原始数据会占用过多带宽。改为在单片机端先进行10:1的数据压缩(保留最大值/最小值/平均值),既保证了曲线特征又降低了传输负荷。这个改进使蓝牙模块的续航时间从4小时延长到12小时。
整套系统目前已在本地骑行圈装机超过60台,最让我自豪的是有位车友用它记录到了连续骑行318国道全程的详细数据。这种真实场景下的长期稳定运行,才是对设计最好的验证。
