我希望有一个小型 NTP 服务器(Chrony)为通过以太网电缆连接的同一学生水下航行器上的不同计算机提供时间。我们主要关心的是在几天内使车辆的不同部分彼此同步到 <10 毫秒。
一些电子设备直接通过 1PPS 源进行同步,因此保持 NTP 服务器和 1PPS 源同步非常重要。
与现实世界同步的“系统时间”不是必需的,但如果它是免费的,那就太好了。
目前我们有:
- 1PPS频率源
- 具有在启动时读取的 RTC 的嵌入式计算机
- GPS 接收器,但理想情况下不能依赖此接收器,因为 GPS 在水下无法正常工作。
目前,我们将 1PPS 信号和 GPS 串行字符串输入 USB 串行转换器 (FTDI),然后由 gpsd 准备好,它会正确拾取 Chrony 的 1PPS 和 GPS 字符串。这有效并为我们提供了大约 2us 与 1PPS 和 GPS 的同步。
现有的设置对我们的应用程序有限制:
gpsd 需要有效的 GPS 时间字符串来初始化时间,但这并不总是可用,因为我们在水面上的 GPS 接收效果很差,而在水下则没有。
GPSD还需要连续的有效字符串来处理1pps中断。如果我们想在水下禁用 GPS 接收器以节省电量,但又想保持与 1PPS 同步,这主要是一个问题。
一旦 GPS 丢失或 GPS 装置关闭,系统时间就会开始偏离 1PPS 源。
我意识到“gpsd”严重依赖于 GPS,所以我使用了错误的工具。
问题:
是否可以将 1PPS 直接提供给 chrony?
1.1 chrony 是否可以单独使用此 1PPS 和系统时间,而无需获取除 RTC 之外的真实世界时间源?
它们是有关如何使用 FTDI USB 转串口转换器 RI 或 DCD 引脚添加 /dev/pps 源的示例吗?例如,gpsd 在幕后做了什么,但没有使用它。
答案1
通过我们自己的尝试和错误,部分回答了我自己的问题。
问题:1.是否可以将 1PPS 直接提供给 chrony?
答案:1Chrony config 使用 2 种方法来获取 PPS:
- 从 SHM1(共享内存)获取它,这是 gpsd 放置它的地方
- 直接从 /dev/pps 设备获取
配置行示例:
refclock SHM 1 refid PPS precision 1e-9
refclock PPS /dev/pps1 refid PPS2 precision 1e-9
有关延迟的一些潜在陷阱也包含在常问问题
问题:1.1chrony 是否可以单独使用这个 1PPS 和系统时间,而无需获得除 RTC 之外的真实世界时间源?
答案:1.1是的,如果您添加这一行:
local stratum 10
如果 chrony 丢失所有源,它将会回退到本地时钟。如果时间服务器只有 /dev/pps 源并且没有来自 GPS 的数据,这似乎也是时间服务器继续满意所需的行
问题:2。它们是有关如何使用 FTDI USB 转串口转换器 RI 或 DCD 引脚添加 /dev/pps 源的示例吗?例如,gpsd 在幕后做了什么,但没有使用它。
部分答案(解决方法)2:gpsd 将接受来自 RI 或 DCD 的 pps 并将定时数据传播到 SHM1。 gpsd 还会自动创建一个虚拟 /dev/pps1 设备并将其链接到 com 端口,这与 gpsd 内部使用的 1pps 不同!
在 /dev/pps1 上使用 ppstest 时,您可以看到 DCD 的 PPS 转换,但看不到 RI 的转换。在 com 端口上使用 ppscheck 显示使用 RI 或 DCD 时的 pps 转换。
我们相信 gpsd 正在推出自己的新 1PPS 检测方案,但虚拟 dev/pps1 端口正在使用旧的 ldattach(线路规则),该方案仅硬编码为我们的 DCD。看到这个帖子。