高精度 10MHz GPS 驯服钟 GPSDO - Part 4
原文链接:
https://www.paulvdiyblogs.net/2020/10/monitoring-measuring-logging-gpsdo.html
2020 年 10 月 16 日,星期五
这实际上是另一个项目的延续,高精度 10MHz GPS 纪律振荡器 (GPSDO),也在我的博客中进行了描述。
我在这里讨论的所有内容最终都将发布在一个专门的 Github 项目中,可在此处获得。
监控、测量和记录
在我的 GPSDO 的开发过程中,我实际上构建了三个完整的单元,我想监控、测量和记录结果,以便以后以不同的方式分析数据。大多数更改会在很长一段时间内发生,通常是几天,因此当您可以绘制数据时更容易查看更改。我已经这样做了好几个月了,但我想要更多。
我的额外设计目标
-
我想远离目前位于 GPSDO 顶部的 RPi,并由额外的 5V 壁式电源供电。
-
当我想用 u-center 查看 NEO 性能或对其进行重新编程时,我需要打开外壳并添加一个串行到 USB 连接器和电缆。或者让该电缆通过外壳中的狭缝连接。这很麻烦,所以我还希望 RPi 能够访问 NEO 串行数据,至少只是监听,但也可以选择通过 RPi 对其进行编程,尽管实现起来要复杂得多。
-
目前还比较麻烦的是,我必须打开外壳对 Arduino 复位引脚上的 10uF 电容器进行拆焊/焊接,以避免在插入 USB 电缆时进行一般复位,只是为了重新编程固件。即使我添加了一个我应该做的跳线,我也不想打开外壳。它确实扰乱了 GPSDO 的性能。前面或后面板上的一个简单的开关就可以完成这项工作。
-
我找到了一个 10MHz 的高精度计数器项目,我想把它集成到 GPSDO 中。
-
有了 10MHz 计数器和 NMEA 数据的附加信息,我还想在前面板上添加一个非常小的 OLED 显示屏,这样我就可以显示 10MHz 计数、视野中的卫星数量,也许还有 DAC 或温度,随便…
-
我还在考虑为 1PPS 和 10MHz 输出再添加两个 SMA 连接器,然后用变压器隔离。当我摆弄连接到电流输出的 BNC 电缆时,我注意到失锁。这些输出直流耦合到电路,整个 GPSDO 从大地浮动。为了应对目前发生的这种情况,我总是在 GPSDO 和我的示波器的外部触发输入之间有一根 BNC 电缆,这是接地的。
要将所有东西都放在 GPSDO 外壳内,我需要为 RPi 本身提供更小的占地面积,因此我选择使用 Zero-W 型号。“W”代表无线,这是我访问互联网和添加电子邮件功能所需要的。我还想用 GPSDO 内已经可用的 5V 电源为零电源供电。我希望铝制外壳有足够的开口让 WiFi 工作。
为了将所有东西都放在外壳内,我正在设计一个小的附加 PCB,它将容纳计数器硬件、一个适合 RPi Zero 的连接器以及用于额外 1PPS 和 10MHz 输出的隔离电路。
摆脱困境
因为我想监控 Lars 的报告、来自 NEO 的 NMEA 消息和 Yannick 的 10MHz 计数器,所以我需要两个额外的串行端口,这是 RPi 系列所没有的。幸运的是,通过对 RPi 的 GPIO 引脚进行 bit-banging,Arduino 具有等效的 SoftSerial。那个库(pigpio)花了我很长时间才弄明白,因为 bit-banging 函数不支持“readline”等价物。它实际上是读取字节数组块中的串行数据,因此您需要将这些块拼凑在一起才能构成一个完整的句子。
这对计数器来说相当容易,因为它以固定长度格式发送串行数据。然而,当我尝试从 NEO 收集 NMEA 数据时,情况发生了巨大变化。经过一些额外的编程和测试,我也设法弄清楚了。接下来是在 Lars 的报告中使用 bit-banging 软件,现在我知道如何使用 bit-banging 应该会容易得多。之后,我将开始将它们全部组合起来,然后很快就会显示结果。
当一切都被编程并工作时,我将决定哪些串行输入将进入“真正的”UART。这可能取决于处理器负载,但更重要的是,可能的错误的严重程度,目前将投票支持计数器报告。
下面我将描述各个项目部分。
监控 GPSDO 状态报告
从一开始,我就使用 Raspberry Pi Model 2B(“经典”的第一个模型,因为我有几个)从 GPSDO 的固件中捕获状态报告的输出,并在每行前面添加一个时间戳。将这些数据捕获到文件中后,电子邮件程序会在一天结束前将其发送到我的电脑,以便在 Excel 中进一步处理。
我使用了两个单独的 Python 脚本来做到这一点。他们在 Github 网站上。
因为我很可能需要将这个串行监控从“真正的”UART 移开并使用 bit-banging,所以串行监控代码需要经过一些认真的处理。我还没有开始。
测量 GPSDO 10MHz 输出的精度
要真正测量 10Mhz 的精度,您需要一个精度可以显示 10MHz 频率的至少 5-6 位十进制数字的计数器。普通计数器需要以周为单位测量的门时间,因此测量此频率的唯一可行方法是使用良好的倒数计数器。这些工具通常远远超出大多数 DIY 爱好者可以节省的零用钱。我知道我不能。
所以对我来说唯一便宜的方法是使用一个可以测量到 3-4 个十进制数字的计数器。
当我在寻找可用于 GPSDO 的计数器时,我遇到了一个有趣的 GPSDO 项目,它使用集成计数器来测量输出。
该项目在这里描述:https 😕/www.instructables.com/GPSDO-YT-10-Mhz-Lcd-2x16-With-LED/
我觉得这很有趣,所以我订购了零件来建造这个柜台。不幸的是,最大门“只有” 1,000 秒,只给你 3 位数或 1pps。我想要更多,所以我联系了作者 Yannick Turcotte,并描述了我的问题。他很快就为我提供了一个测试版本,它可以达到 10,000 秒,给我们带来了另一个数字的精度。
这是我第一次尝试我们所说的 10K 版本。我用我的 Bliley GPSDO 的 1PPS 喂它,还使用 10MHz 输出作为 Arduino 的时钟。您在顶部看到的连接器是编程接口的一部分。
即使有 10,000 秒的选通时间,分辨率也“仅”为 100 微赫兹。(10,000s * 10MHz = 10,000,000.0000 +/- .0001)我的 Bliley 更好,正如您在 TimeLab 频差视图中看到的那样(请注意,这是 TC 为 500,这不是最佳设置):
Timelab 在 10,000 秒时报告的频率为 9,999,999.999 991 948,因此 Bliley 精确到 5 位十进制数字,比计数器可以测量的多一位。如果您意识到 1,000 秒是 2.77 小时,那么很明显,分辨率的另一个数字将意味着 100,000 秒或将近 28 小时。不是很实用。解决方案当然是使用一个好的倒数计数器,但正如我之前提到的,这远远超出了我的零用钱,甚至超出了我构建一个的技能。
在如此长的门控时间内使用这种计数器技术的警告是,您只能测量此门控期间的平均频率。然而,在这种特殊情况下,对于这个应用程序,这并不是什么大不了的事,因为这就是 GPSDO 无论如何都应该提供的。长期稳定性和精度。
在任何情况下,仅显示此结果,即每 2.7 小时刷新一次,虽然很好,但不是很有用。特别是当您的 GPSDO 具有更高的精度时。但是,如果您可以记录结果并绘制图表,您可以看到随时间的漂移,或者 GPSDO 变得“超出规范”。也许这只是一个小玩意儿,反正我要加进去,看看它会带来什么好处或见解。
经过我这边的大量测试和摆弄(由于 bit-banging 的要求),Yannick 现在已经制作了一个专为这个项目制作的计数器版本,它具有 1,000 秒的远程可编程门时间,可以用 3 个十进制数字进行测量,或 10,000 秒得到 4 位小数。 它还将结果发送到 Arduino 的串行输出,以便它可以被 RPi 捕获和操作。 Yannick 还制作了一个特殊的 10 秒门限时间版本,这对于测试至关重要。
此特殊版本的来源可在此处获得:https 😕/github.com/YannickTurcotte/Lars-DIY-GPSDO
树莓派串口注意事项
我测试计数器的大部分时间是通过在 Arduino 和 RPi Model Zero-W 之间建立可靠的串行连接。这是通过使用连接器上的标准 TxD 和 RxD 引脚实现的。经过几天的挣扎,我发现我收到的偶尔丢失的数据和垃圾是由我正在使用的 Model 3、4 和 Zero-W 的固件中的一个不太为人所知的变化引起的。
Raspberry Pi 型号只有一个“真正的”UART。Raspberry Pi 基金会不久前决定将可靠的 UART 替换为他们所谓的“迷你 UART”,以使用“真正的”提供蓝牙支持,但忽略了足够好的通信。请注意,我已经用于监控 GPSDO 的 Model 2B 没有此交换,因此当我将应用程序移至零 W 时,我完全没有意识到此更改并落入了这个讨厌的陷阱。基金会对此更改的理由是串行 UART 主要用于控制台,因此不太重要。是的,对。
因此,使用“mini-UART”偶尔会产生不可靠的结果(数据丢失或垃圾)。这很可能是由 Linux 的非确定性造成的,因此当它进行一些繁重的内务处理时,迷你 UART 会丢失数据。当您每 2.7 小时等待一条消息时,您必须可靠地捕获它,或者等待下一条消息。我花了几天的时间来寻找问题,然后找到可用的解决方案,也就是说,如果你知道要寻找什么。Grrr… 这绝不是基金会第一次引发这样的问题。
如何从默认的“mini-UART”切换回“真正的”UART。
首先,使用 sudo raspi-config 启用串口。
对于 RPi 3、4 和 Zero-W,您需要将 mini-UART 与真正的 TL011 交换。
编辑引导配置:
须藤纳米/boot/config.txt
在文件末尾添加:
dtoverlay=disable-bt
保存文件并关闭编辑器。
您现在需要禁用调制解调器软件:
sudo systemctl disable hciuart
重新启动 RPi。
这允许您再次使用以下串行设备:/dev/ttyAMA0
从 GPS 模块记录 NMEA 语句
由于 RPi 系列上可用的串行 UART 数量有限,我需要找到一种可以让我使用 RPi 的任何可用 GPIO 端口的 SoftwareSerial。我知道有三个可用的库,但我选择使用 Joan 的 pigpio 库,她从一开始就在 RPi 前沿非常活跃。他或她非常熟练、积极和乐于助人,所以这个图书馆是我开始冒险的地方。该库支持对 GPIO 引脚进行 bit-banging 以充当串行 TxD 和 RxD 端口。
正如我之前提到的,pigpio bit-banging 软件以 Python 字节数组的形式以不规则块的形式读取串行数据,您需要将它们再次拼凑起来。听起来微不足道,但要让它与来自不同来源的不同数据一起工作并不容易。
经过一些启发和大量测试,我想出了一个可靠的方法,脚本现在可以毫无问题地读取计数器的数据和 NMEA 语句超过一天。对我来说已经足够好了。
代码在 Github 上。
如果您能找到更可靠或更聪明的方法,请加入并发布您的解决方案。
OLED显示器
对角线 0.9 英寸的小显示屏很容易在前面板上找到位置。我已经研究了如何对其进行编程。脚本在 Github 上。
硬件电路
原理图和设计仍在进行中,但它显示了我打算做什么并且已经建立在 perf 之上。板作为原型。
这部分电路很大程度上基于 Yannick 的版本,我只是去掉了非必要部分。只剩下一个 LED,这是我将放在 PCB 上的计数 LED,用于查看计数器是否在计数。
计数器的输入是来自 GPSDO 的 10MHz 和 1PPS。12V 电源来自为 GPSDO 供电的同一电源。
以上是电路的 RPi 部分。微型 0.91" 显示器是 i2c 版本,因此它只需要最少的连接量。有一个易于使用的库。
RPi 将从计数器、NEO 和 GPSDO 的 Arduino Nano 读取串行数据。此刻,只有聆听。NEO 产生 3V3 电平信号,但 Nano 和计数器处于 5V 电平,所以我使用 1K 串联电阻或电平转换器来保持 3V3 电平的 RPi 安全。这些电阻器可以检查进入 GPIO 端口的最大电流。(5V-3.3V / 1,000 欧姆 = 1.7mA)
GPSDO 的前面板上已经有一个 USB 连接器可以访问 Arduino Nano,因此它不需要 TxD 连接。与 NEO 相同,尽管这些连接仍在 GPSDO 外壳内。如果您需要重新编程 NEO,您仍然需要打开外壳。但是,如果您在第一次测试中做对了,这种情况很少见。
RPi 可以为计数器选择 1,000 或 10,000 秒的门控时间,使其处于程序控制之下。它还可以对计数器控制按钮进行编程,甚至重置计数器,以便知道长计数周期何时开始。这使我可以在屏幕上放置下一次更新之前的剩余分钟数。
perf 上的原型。板子已经完成,并且已经测试了几个星期,效果很好。
我还决定将风扇驱动电路放在这块板的最终版本上,这样你就不需要单独的 PCB。
笔记:
请注意,ATMEGA 将由 1PPS 和 10MHz 信号电平“反向供电”,因此您需要使用 0xFD 对 2.7V 的扩展保险丝进行编程, 设置较低的掉电电平,否则 ATMEGA 可能无法正确复位。
把它们放在一起
我首先要在性能板上制作一个原型,该原型将进入 Bliley 外壳。使用 PuTTY,我可以访问 RPi 并在不干扰 GPSDO 的情况下处理程序。一旦这令我满意,我将着手进行 PCB 布局,并确定我将其放置在外壳内的位置和方式,以及安装 OLED 屏幕的方式和位置。
对于原型设计阶段,我已经在前面板上安装了 0.9" 显示器,并为隔离的 1PPS 和 10MHz SMA 连接器创建了孔。Arduino 复位引脚上的电容器拨动开关将其放置在其中一个通风孔。我为 Bliley 设置了至少一个太多的通风孔,因为它不像 Trimble 那样热,这意味着当夜间室温变低时,风扇以最低 RPM 运行。我想要始终保持风扇调节。由于计数器/RPi 板会产生额外的热量,无论如何我都需要重新访问它。
下面是带有计数器电路和隔离变压器的载板的图片。这只是我快速组装的一个原型,看看它是否能正常工作,是否合适。载板将在机柜顶盖上的插槽中上下滑动。RPi 将安装在连接器的顶部,也可以倒挂。您在右下角看到的计数器的绿色“计数”LED 将通过其中一个通风孔显示。
我不需要访问 Zero 的所有 GPIO 引脚,所以我只使用了一个我有很多的 2x12 连接器。
我为隔离输出添加了两个 SMA 连接器,并添加了一个可在编程 Nano 时使用的开关。我还添加了 0.9" OLED 显示屏。最终,当一切都真正完成时,我也会制作一个新的前面板。在处理风扇调节时,我已经砍掉了一个前面板,并在这里钻了一些 6mm 的孔,那里。其中一个现在用于编程开关。对于这个额外的要求,我为显示器和另外两个 SMA 连接器增加了空间。
下面是如何查看板相对于前面板的位置。载板将滑入机柜顶盖的导轨中。