1. GPS/北斗模块选型指南第一次接触GPS/北斗模块时我完全被市面上五花八门的型号搞晕了。经过多次踩坑后我发现选型主要看这几个关键点首先是定位系统支持。现在主流的模块分为三类纯GPS、纯北斗、以及GPS/北斗双模。我强烈建议选择双模模块比如正点原子的ATK-S1216F8-BD。实测下来双模定位的精度和稳定性明显更好特别是在城市峡谷环境中北斗系统的高轨卫星能提供更好的覆盖。其次是供电电压。常见模块有3.3V和5V两种最好选择像ATK-S1216F8-BD这种宽电压设计的3.3V-5V自适应。我在项目中就遇到过电压不匹配导致模块无法启动的问题这种设计能省去很多麻烦。天线接口也很关键。IPX接口现在算是标配了但要注意天线兼容性。我刚开始没注意买了个SMA接口的天线结果又得额外配转接线。模块自带IPX转SMA线的话会方便很多。其他实用功能包括内置Flash存储可以保存配置参数不用每次上电重新设置后备电池保持星历数据大幅缩短冷启动时间多波特率支持从4800到230400bps方便适配不同单片机2. 硬件连接实战拿到模块后第一步就是正确接线。以ATK-S1216F8-BD为例我们来看看具体操作2.1 引脚功能详解这个模块采用5pin排针设计引脚从右到左分别是VCC3.3V-5V供电GND接地TXD串口发送端RXD串口接收端PPS脉冲输出用于精确定时PPS引脚接了个LED指示灯这个设计很贴心常亮模块工作但未定位闪烁定位成功熄灭模块未工作2.2 最小系统连接实际项目中最简连接只需要4根线VCC接开发板3.3V/5VGND接开发板GNDTXD接单片机RXDRXD接单片机TXD注意串口线要交叉连接这是我犯过的低级错误之一。PPS引脚不是必须的除非你需要做高精度授时。2.3 电源注意事项模块功耗一般在50mA左右但峰值可能达到100mA。如果直接用开发板的3.3V输出可能会供电不足导致定位不稳定。我的经验是单独供电时加100uF电容稳压使用LDO稳压芯片确保电流充足避免长距离供电线损会影响稳定性3. 参数配置技巧模块到手后默认参数可能不适合你的项目需要根据实际情况调整。3.1 波特率设置ATK-S1216F8-BD支持从4800到230400多种波特率默认是38400。修改波特率要注意先用默认波特率连接发送配置指令后面会讲具体指令格式保存到Flash重启模块生效我推荐使用115200这个速率既能保证数据传输速度又不会给普通单片机带来太大负担。实测在STM32F103上38400和115200的CPU占用率差别不大。3.2 NMEA数据输出配置模块默认会输出多种NMEA语句GGA、RMC等但实际可能只需要其中一两种。过多的数据会占用串口资源我的优化建议是只开启GGA和RMC语句设置输出频率1Hz普通应用足够关闭GSV语句卫星信息很占带宽配置示例$PCAS03,1,0,0,1,0,0,0,0,0,0,,,0,0*02这条指令表示只开启GGA和RMC输出。3.3 定位模式选择双模模块可以设置三种工作模式GPS only北斗 onlyGPS北斗混合室内测试时我建议先用单模式比如北斗因为双模式会增加冷启动时间。室外使用时再切换混合模式能显著提高定位精度。4. 天线选型与部署天线对定位性能的影响超乎想象这里分享几个实战经验。4.1 天线类型选择常见的有源天线增益在28dB左右够一般使用。但在高楼林立的城区我建议选择35dB以上的高增益天线。有次做车载项目换了高增益天线后定位成功率从60%提升到了95%。天线接口方面虽然模块是IPX但市面上GPS天线多是SMA接口。买天线时要注意确认接口类型检查线缆长度3-5米最常用看是否支持1575.42MHzGPS和1561.098MHz北斗双频4.2 天线安装位置金属物体会严重干扰信号安装时要避开金属外壳锂电池大面积的PCB铺铜最佳位置是模块上方无遮挡处。车载应用可以放在车顶无人机应用建议放在机身顶部。我做过一个智能头盔项目把天线装在头盔顶部效果出奇的好。4.3 室内外天线部署利用IPX接口可以实现室内外天线分离模块放在室内天线通过IPX转SMA线引到室外室外天线要防水处理注意线缆不要太长超过5米信号衰减就很明显了。我在楼宇监控项目中用过这种方案天线放在楼顶模块放在室内定位精度能保持在5米内。5. 嵌入式系统集成把模块用起来后就要考虑如何与嵌入式系统深度集成了。5.1 数据解析实战NMEA数据格式看似复杂其实解析起来很简单。以GGA语句为例$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47各字段含义123519UTC时间12:35:194807.038,N纬度48度07.038分北纬01131.000,E经度11度31.000分东经1定位质量指示1有效定位08使用的卫星数0.9HDOP水平精度因子545.4,M海拔高度545.4米用C语言解析的代码片段void parseGGA(char *gga) { char *p strtok(gga, ,); int field 0; while(p ! NULL) { switch(field) { case 1: // UTC时间 printf(Time: %s\n, p); break; case 2: // 纬度 printf(Lat: %s\n, p); break; // 其他字段类似处理 } p strtok(NULL, ,); field; } }5.2 提高定位精度的技巧除了硬件优化软件上也能提升定位效果数据滤波连续取5次定位数据去掉明显异常值后取平均运动状态检测静止时可以提高数据更新间隔辅助信息结合气压计数据修正海拔高度我在无人机项目中就用了卡尔曼滤波算法将水平定位误差从10米降到了3米以内。5.3 低功耗设计对于电池供电设备功耗控制很重要设置模块进入休眠模式电流可降至5mA根据应用场景调整定位频率比如共享单车可以1分钟定位一次关闭不需要的NMEA语句输出一个实测数据将定位频率从1Hz降到0.1Hz模块平均功耗从45mA降到了15mA。6. 常见问题排查遇到问题时别着急按这个流程排查6.1 无数据输出先检查硬件供电是否正常测VCC-GND电压串口线是否接反TXD-RXD交叉波特率是否匹配先用38400尝试如果硬件没问题可能是模块未定位。这时候看PPS指示灯常亮等待定位首次可能需要几分钟熄灭检查供电和使能信号6.2 定位精度差先确认天线状态天线是否完全展开天线位置是否理想周围是否有干扰源软件方面可以检查HDOP值小于2最好查看卫星数量至少4颗才能定位尝试不同的定位模式6.3 数据跳动严重这是新手常见问题解决方法增加软件滤波检查天线连接是否松动避开强电磁干扰环境使用固定站差分修正高端应用我在工业现场就遇到过变频器干扰导致定位数据跳变的问题后来给模块加了金属屏蔽罩就解决了。