1. 项目背景与需求分析
作为一名骑行爱好者,我经常遇到市面上码表功能不全或价格过高的问题。要么是基础款只能显示速度、里程等简单数据,要么是高端产品动辄上千元却包含大量我用不上的功能。这促使我决定自己开发一款高精度、功能齐全且成本可控的自行车码表。
核心需求可以归纳为三点:
- 精准定位与导航:需要同时支持GPS定位和地磁方向检测
- 完整数据记录:能够存储骑行轨迹并支持离线地图
- 低功耗设计:确保长时间骑行的续航能力
硬件选型上,我选择了AT32F435CGU7作为主控芯片,这款基于ARM Cortex-M4内核的MCU性能足够强大,同时功耗控制出色。传感器方面采用Lsm6ds3陀螺仪芯片和LIS3MDLTR地磁芯片的组合,配合GPS模块实现高精度定位。
2. 硬件设计与关键细节
2.1 主控电路设计
AT32F435CGU7的主频高达240MHz,内置FPU浮点运算单元,非常适合处理传感器数据融合算法。电路设计时特别注意了以下几点:
- 电源部分采用两级滤波:第一级使用10μF钽电容滤除低频噪声,第二级使用0.1μF陶瓷电容滤除高频干扰
- 复位电路设计:除了常规的RC复位电路外,还增加了手动复位按钮,方便调试
- SWD调试接口:保留标准的10pin调试接口,便于程序下载和在线调试
2.2 传感器模块实现
传感器部分采用了三合一方案:
- Lsm6ds3:负责加速度和角速度测量
- LIS3MDLTR:提供三轴磁力计数据
- GPS模块:实现绝对定位和时间基准
特别要注意的是地磁传感器的安装位置,必须远离电机、电池等可能产生磁干扰的部件。实测发现,安装在车把正中位置,距离其他电子元件至少5cm时,数据最为准确。
2.3 电源管理系统
低功耗设计是本项目的重点之一,电源系统采用以下方案:
- 主电源:3.7V锂电池,容量2000mAh
- 充电管理:BQ24092芯片,支持最大1A充电电流
- 电压转换:TPS62740降压转换器,效率高达95%
- 功耗统计:通过INA219电流传感器实时监测各模块功耗
实测数据显示,在GPS每秒更新一次、屏幕常亮的模式下,系统平均工作电流约80mA,理论续航时间可达25小时。
3. 软件架构与算法实现
3.1 系统软件架构
基于Keil MDK开发环境,软件架构分为四层:
- 硬件抽象层(HAL):封装各外设驱动
- 实时操作系统(RTOS):使用FreeRTOS进行任务调度
- 算法处理层:实现传感器融合和定位算法
- 应用层:处理用户界面和业务逻辑
任务划分如下:
- 高优先级任务:传感器数据采集(10ms周期)
- 中优先级任务:定位算法处理(50ms周期)
- 低优先级任务:用户界面更新(200ms周期)
3.2 传感器数据融合算法
采用改进的卡尔曼滤波算法进行多传感器数据融合:
- 加速度计数据用于短时位移估计
- 陀螺仪数据用于角度变化计算
- 地磁数据提供绝对方向参考
- GPS数据作为位置校准基准
算法实现时特别注意了以下几点:
- 采用四元数表示姿态,避免万向节锁问题
- 动态调整卡尔曼滤波参数,适应不同运动状态
- 设置合理的异常数据剔除阈值
3.3 离线地图实现
离线地图功能通过以下方式实现:
- 地图数据存储:使用16GB TF卡存储地图数据,采用自定义的瓦片存储格式
- 地图渲染:基于LVGL图形库实现地图绘制,支持多级缩放
- 路径记录:以GPX格式存储骑行轨迹,兼容主流地图软件
地图数据更新可以通过以下两种方式:
- 通过USB接口连接电脑更新
- 通过手机APP无线传输(需蓝牙模块支持)
4. 制作过程与调试技巧
4.1 PCB设计与制作
PCB设计采用四层板结构:
- 顶层:主要信号走线和元件布局
- 内层1:3.3V电源平面
- 内层2:GND平面
- 底层:次要信号走线
特别注意以下几点:
- GPS模块周围保留足够的净空区
- 晶振走线尽量短,并做包地处理
- 电源部分采用星型拓扑,避免共地干扰
打样参数:
- 板厚:1.2mm
- 板材:FR4
- 铜厚:1oz
- 表面处理:沉金
4.2 焊接注意事项
几个关键元件的焊接技巧:
GPS模块的26MHz温补晶振:
- 使用热风枪焊接,温度控制在280℃左右
- 先给焊盘上少量焊锡,再放置元件
- 避免长时间加热,防止晶振频率偏移
声表滤波器(SAW):
- 使用尖头烙铁,温度控制在300℃
- 先在一个焊盘上锡,固定元件一端
- 再焊接另一端,最后补焊固定端
0402封装的阻容元件:
- 使用焊台,温度控制在320℃
- 先在焊盘一端上锡
- 用镊子夹住元件,先焊固定端,再焊另一端
4.3 系统调试方法
调试时建议按照以下顺序进行:
电源测试:
- 检查各电压点是否正常
- 测量静态功耗是否符合预期
传感器测试:
- 通过I2C调试工具读取各传感器ID
- 检查原始数据是否合理
GPS测试:
- 使用串口助手查看NMEA数据
- 测量首次定位时间(TTFF)
显示测试:
- 检查屏幕各区域显示是否正常
- 测试触摸功能是否灵敏
5. 常见问题与解决方案
5.1 GPS定位问题
问题现象:搜星速度慢,定位不准确
可能原因及解决方案:
天线问题:
- 检查天线连接是否良好
- 确保天线安装位置远离金属部件
晶振问题:
- 测量26MHz晶振频率是否准确
- 检查晶振负载电容是否匹配
软件配置:
- 确认NMEA输出频率设置正确
- 检查辅助定位数据是否有效
5.2 传感器数据异常
问题现象:姿态解算结果不稳定
排查步骤:
- 检查各传感器原始数据
- 验证I2C通信是否正常
- 检查传感器安装方向是否正确
- 测试各传感器单独工作情况
常见解决方法:
- 重新校准传感器
- 调整滤波算法参数
- 检查PCB布局是否存在干扰
5.3 功耗过高问题
问题现象:电池续航明显短于预期
功耗优化方法:
测量各模块工作电流
优化外设工作模式:
- GPS模块采用间隔定位
- 屏幕设置自动亮度调节
- 关闭不必要的外设时钟
软件优化:
- 合理使用MCU低功耗模式
- 优化任务调度策略
- 减少不必要的计算
6. 使用体验与改进方向
经过三个月的实际使用测试,这款自制码表表现出色:
- 定位精度:在城市环境中可达5米以内
- 续航时间:中等使用强度下约20小时
- 数据记录:完整记录每次骑行轨迹
发现的几个可以改进的地方:
- 增加蓝牙连接功能,方便与手机同步数据
- 优化地图渲染算法,提高缩放流畅度
- 添加心率监测等更多运动数据
制作过程中最大的收获是深入理解了多传感器数据融合的原理和实现方法。特别是在处理GPS信号丢失时的航位推算算法,经过多次调整才达到满意的效果。