问题背景

在数据采集任务中,设备运行 Ubuntu 20.04 系统采集 ROS bag 数据。由于处于离线状态,仅依靠本地时钟赋予时间戳,导致时间不同步,影响数据融合。为此,配备 GPS 授时模块,利用 PPS 信号进行高精度授时,确保数据时间戳同步,保障数据融合的准确性。
硬件设备:

  • 树莓派4B, Ubuntu 20.04
  • GPS授时模块

硬件连接

硬件连接实物图如下图所示。
硬件连接实物图

树莓派做一个获取GPS时间的NTP服务器文章中采用uart0主串口连接GPS模块的TX和RX引脚,并且需要禁用蓝牙。然而经过试验对于安装ubuntu系统的树莓派来说并不适用。配置完成后开机总是卡在UBoot界面,无法正常开机。如下所示:

starting USB...
No working controllers found
Hit any key to stop autoboot: 0
U-Boot>

这是因为Ubuntu 引导过程由 U-Boot 控制,U-Boot 默认监听串口(GPIO14/15)并响应字符输入,GPS 模块在开机瞬间发出NMEA协议的串口信号,触发了 U-Boot 的命令行模式,导致无法正常引导。

查阅资料发现,相比树莓派零、1、2 以及 3 的双串口 UART0(PL011)和 UART1(mini UART),树莓派4 中新增了 4 个 PL011 串口共计有 6 个 UART(参考链接)。因此,我们可以使用uart2串口。参考链接中同时提到:

UART2 对应 TXD2 和 RXD2,对应树莓派针脚GPIO0 和 GPIO1,对应ubuntu系统内串口名称 /dev/ttyAMA1。

具体接线如下(加粗表示笔者实物采用的连接):

GPS 模块引脚 树莓派 GPIO 引脚编号(物理) 说明
RXD GPIO0 Pin 27 树莓派接收(UART TX)
TXD GPIO1 Pin 28 树莓派接收(UART RX)
PPS GPIO18 Pin 12 PPS 中断信号(可选)
GND GND Pin 6 / 9 / 14 接地
VCC 3.3V 或 5V Pin 1 或 PIN 2 根据模块规格供电(很重要)

树莓派4B引脚图
beitian

配置串口

我们知道,GPS模块通过串口输出NMEA消息和PPS脉冲两路信号来实现授时,因此在系统中也需要配置这两路串口:

编辑/boot/firmware/usercfg.txt

sudo gedit /boot/firmware/usercfg.txt
  • 添加如下内容,扩展设备树(Device Tree)的硬件配置,作用是启用系统中的串口接口uart2,将引脚GPIO 18 配置为 PPS 信号输入端口:
dtoverlay=uart2
dtoverlay=pps-gpio,gpiopin=18
  • 重启系统,使修改生效
sudo reboot

测试NMEA串口信息

  • 重启系统后,终端运行:
ls -l /dev/ttyAMA*

终端输出/dev/ttyAMA1。这就是前面所述uart2对应的系统内串口名称。

  • 运行:
cat /dev/ttyAMA1

终端输出NMEA数据流,表示NMEA串口连接正常。

测试PPS信号

  • 测试pps串口是否接通
ls -l /dev/pps*

终端输出/dev/pps0,表示该串口接收PPS脉冲信号。

  • 安装pps-tools,并测试PPS脉冲信号
sudo apt install pps-tools
sudo ppstest /dev/pps0

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

安装gpsdchrony工具

安装并配置gpsd

  • 安装
sudo apt-get install gpsd gpsd-clients python3-gps -y
  • 编辑配置文件
sudo gedit /etc/default/gpsd

配置内容如下:

# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
START_DAEMON="true"
GPSD_OPTIONS="-n"
DEVICES="/dev/ttyAMA1 /dev/pps0"
USBAUTO="false"
GPSD_SOCKET="/var/run/gpsd.sock"

# Other options you want to pass to gpsd
GPSD_OPTIONS=""
  • 编辑服务文件
sudo gedit /lib/systemd/system/gpsd.service

更改:将After=chronyd.servic改为Before=chronyd.servic

  • 重新加载服务
sudo systemctl daemon-reload 
sudo systemctl restart gpsd.service
  • 测试
cgps

正常情况下,终端输出下图所示内容:
cgps

安装并配置chrony

  • 安装
sudo apt-get install chrony
  • 编辑配置文件
sudo gedit /etc/chrony/chrony.conf

在配置文件末尾添加如下内容:

refclock SHM 0 poll 4 refid GPS precision 1e-1 offset 0.9999 delay 0.2
refclock PPS /dev/pps0 poll 4 refid PPS
  • 重新加载服务
sudo systemctl daemon-reload 
sudo systemctl restart chrony.service
  • 设置为开机启动
sudo systemctl enable gpsd.service chrony.service
  • 测试
watch -n1 chronyc sources -v
watch -n1 chronyc sourcestats -v

结果如下,#* PPS表示正在使用PPS授时:

chrony

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐