GPS学习(二)使用树莓派5和GPS PPS 实现微秒级精度的时间同步

树莓派如果使用默认的互联网NTP服务同步时间,系统时间与实际时间之间通常有10~20毫秒的误差。不同操作系统默认的时间服务器也不一样:Windows连的是 time.windows.com,macOS连 time.apple.com,而Linux设备一般会去连 [entity].pool.ntp.org,比如Debian用的就是 debian.pool.ntp.org。如果改用PPS时间信号,树莓派的时间同步精度可以在不需要联网的情况下从毫秒级直接提升到微秒级,精度提高了整整1000倍。以下为使用树莓派5和GPS PPS 实现微秒级精度的时间同步步骤。

1.软件工具安装

在树莓派5中安装以下工具:用pps-tools来检查树莓派到底有没有收到GPS模块发出的PPS信号,gpsd用来解析GPS 传回的时间和位置信息,最后使用chrony完成系统和PPS的时间同步。

bash 复制代码
sudo apt install pps-tools gpsd gpsd-clients chrony

2.启用树莓派的UART串口

执行以下指令扩展设备树(Device Tree)的硬件配置,其作用是启用系统中的串口接口UART1,配置GPS波特率为9600,并将GPIO18配置为PPS 信号输入端口:

bash 复制代码
sudo bash -c "echo '# the next 3 lines are for GPS PPS signals' >> \ /boot/firmware/config.txt"
sudo bash -c "echo 'dtoverlay=pps-gpio,gpiopin=18' >> /boot/firmware/config.txt"
sudo bash -c "echo 'enable_uart=1' >> /boot/firmware/config.txt"
sudo bash -c "echo 'init_uart_baud=9600' >> /boot/firmware/config.txt"
sudo bash -c "echo 'pps-gpio' >> /etc/modules"

运行指令sudo raspi-config打开配置页面,选择3.Interface Options>I5.Serial Port>[Would you like a login shell to be accessible over serial?]->no[Would you like the serial port hardware to be enabled?]->yes 完成操作后重启。

3.配置gpsd

修改 /etc/default/gpsd文件内容为:

注意看接入的引脚是不是/dev/ttyAMA0 ,可以使用[cat /dev/ttyAMA0 ]看看有没有GPS报文。

bash 复制代码
DEVICES="/dev/ttyAMA0 /dev/pps0"
GPSD_OPTIONS="-n"
START_DAEMON="true"
USBAUTO="true"

修改服务文件/lib/systemd/system/gpsd.service ,After=chronyd.service改为Before=chronyd.service

重新加载服务并重启

bash 复制代码
sudo systemctl daemon-reload 
sudo systemctl restart gpsd.service
sudo reboot

4.配置chrony

修改/etc/chrony/chrony.conf文件,在结尾处添加:

bash 复制代码
refclock SHM 0 refid NMEA offset 0.000 precision 1e-3 poll 0 filter 3
refclock PPS /dev/pps0 refid PPS lock NMEA offset 0.0 poll 3 trust

重新加载服务并根据自身需求设置开机自启动:

bash 复制代码
sudo systemctl daemon-reload 
sudo systemctl restart chrony.service
#设置开机自启动
sudo systemctl enable gpsd.service chrony.service

5.接线调试

参考树莓派5的40Pin引脚示意图:

GPS.PPS 连接到树莓派引脚12(GPIO 18);

GPS.GND 连接到树莓派的6号引脚;

GPS.RXD连接到树莓派8号引脚;

GPS.TXD连接到树莓派的10号引脚。

天线放置在室外测试,在成功接收到GPS信号后,树莓派端运行指令:

bash 复制代码
sudo ppstest /dev/pps0

终端输出下图所示的脉冲序列,表示PPS串口连接正常。

输入【cgps -s】或者gpsmon测试gps定位,gpsmon 和 cgps 都会传输从 GPS 模块接收到的语句,终端输出以下内容:

使用【chronyc sources】指令可以看到终端输出以下内容,PPS前面的星号 (*) 表示它是当前选定的数据源。前面如果是问号 (?) 表示 Chrony 尚未确定是否已选择该数据源。现在Chrony已选择PPS作为当前首选源(前面带有 *)。NMEA 源已被标记为"无效源"(前面带有 x)。通常不建议使用两个源来运行通用的互联网NTP服务器,因为如果两个源不一致,Chrony无法判断哪个源是正确的,因此建议使用两个以上的源。

相关推荐
lightqjx18 小时前
【前端】前端学习二之CSS
前端·css·学习·html
charlie11451419119 小时前
通用GUI编程技术——Win32 原生编程实战(二十二)——GDI 位图操作:BitBlt、StretchBlt 与图像处理
c++·windows·学习·c·win32
2501_920627611 天前
Flutter 框架跨平台鸿蒙开发 - 古文学习应用
学习·flutter·harmonyos
arron88991 天前
RK3588 Ubuntu 22.04 静态 IP 真实配置文件位置 + 最稳修改方法
tcp/ip·ubuntu·php
江苏世纪龙科技1 天前
【世纪龙科技】当智能网联汽车教学遇上“数字孪生”
学习
杰尼龟3681 天前
Convince Develop 学习笔记
笔记·学习
不早睡不改名@1 天前
Netty源码分析---Reactor线程模型深度解析(二)
java·网络·笔记·学习·netty
婷婷_1721 天前
【PCIe验证每日学习·Day25】PCIe 电源管理机制(L0s/L1/L2/L3)全解析
网络·学习·程序人生·芯片·电源管理·pcie 验证·低功耗状态
東雪木1 天前
Java学习——一访问修饰符(public/protected/default/private)的权限控制本质
java·开发语言·学习·java面试
HABuo1 天前
【linux线程(三)】生产者消费者模型(条件变量阻塞队列版本、信号量环形队列版本)详细剖析
linux·运维·服务器·c语言·c++·ubuntu·centos