优秀网页翻译:高精度 10MHz GPS 驯服钟 (GPSDO) - Part 4

原文链接:
https://www.paulvdiyblogs.net/2020/10/monitoring-measuring-logging-gpsdo.html
2020 年 10 月 16 日,星期五

这实际上是另一个项目的延续,高精度 10MHz GPS 纪律振荡器 (GPSDO),也在我的博客中进行了描述。

我在这里讨论的所有内容最终都将发布在一个专门的 Github 项目中,可在此处获得。

监控、测量和记录

在我的 GPSDO 的开发过程中,我实际上构建了三个完整的单元,我想监控、测量和记录结果,以便以后以不同的方式分析数据。大多数更改会在很长一段时间内发生,通常是几天,因此当您可以绘制数据时更容易查看更改。我已经这样做了好几个月了,但我想要更多。

我的额外设计目标

  1. 我想远离目前位于 GPSDO 顶部的 RPi,并由额外的 5V 壁式电源供电。

  2. 当我想用 u-center 查看 NEO 性能或对其进行重新编程时,我需要打开外壳并添加一个串行到 USB 连接器和电缆。或者让该电缆通过外壳中的狭缝连接。这很麻烦,所以我还希望 RPi 能够访问 NEO 串行数据,至少只是监听,但也可以选择通过 RPi 对其进行编程,尽管实现起来要复杂得多。

  3. 目前还比较麻烦的是,我必须打开外壳对 Arduino 复位引脚上的 10uF 电容器进行拆焊/焊接,以避免在插入 USB 电缆时进行一般复位,只是为了重新编程固件。即使我添加了一个我应该做的跳线,我也不想打开外壳。它确实扰乱了 GPSDO 的性能。前面或后面板上的一个简单的开关就可以完成这项工作。

  4. 我找到了一个 10MHz 的高精度计数器项目,我想把它集成到 GPSDO 中。

  5. 有了 10MHz 计数器和 NMEA 数据的附加信息,我还想在前面板上添加一个非常小的 OLED 显示屏,这样我就可以显示 10MHz 计数、视野中的卫星数量,也许还有 DAC 或温度,随便…

  6. 我还在考虑为 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 连接器增加了空间。
在这里插入图片描述

下面是如何查看板相对于前面板的位置。载板将滑入机柜顶盖的导轨中。
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言: 今天的主角其实是好多朋友都应该已经熟悉的8位米字VFD显示屏,由YLEEE老板一年前“隆重”推出,期间很多朋友都做过,各种各样的实现和驱动方法都有,这里我就不做评价。我的主要思路是:简单、可靠,有专门驱动就用专门驱动,当然最重要的是要时间精准:1、和我之前的同步母同步(推荐)2、使用GPS模块校时。 八位米字VFD显示屏实物截图: 这个屏从图片上可以看出,做时屏是非常合适的,唯一的缺点就是稍微小点,不过瑕不掩瑜,量多价优呀! 尺寸图: 先说说规划的功能和特点: 1、从上面数据手册可以知道,这个屏是8位16段,使用PT6311可以了,专用芯片稳定、可靠、驱动效果好,这是我的一贯的原则,大家也可以使用几十个三极管做动态扫描驱动,反正是折腾,咋么搞亮都行; 2、还是使用绕制的高频变压器做灯丝、负压、隔离电源,优点:简单、稳定、可靠,灯丝交流、负压一次产生,不需要再利用系统其它资源。缺点:变压器虽然是EE13,可也不能能做的超薄; 3、3组硬件自动开关机,这个我之前的很多时上面都有。就是可以设置几组自动开 关时间,控制VFD 的灯丝、负压电源,做到节能,延长屏寿命; 4、3组闹,每组可单独设置开启、关闭,闹铃响铃长度1-99秒,周末闹铃是否开启; 5、星期是程序根据年月日自动计算的,不需要设置; 6、12小时/24小时时间显示模式选择;(遥控器上F1快捷功能有效) 7、温度显示;(遥控器上TEMP快捷功能有效) 8、日期 星期显示;(遥控器上DATE快捷功能有效) 9、固定显示时间/或者循序显示:时间1分-星期、日期显示5秒、温度显示5秒,2种显示模式可选。(遥控器上F2快捷功能有效) 10、光控自动调节或手动亮度调节,1-8级,设置00就是光控自动调节。自动开关机时段,也能手动或自动亮度控制; 11、红外遥控功能,也带红外学习功能,可以使用你自己的遥控器学习、控制; 12、有DS1302实时时芯片(正宗的能弄到只有拆机的了),外接正品日本KDS 5ppm晶振(这个好不容易找工厂朋友弄到,厂家仪表进行过筛选) 13、母的同步子/GPS同步时/普通时,大家可以根据自己的需要,选择不同的功能应用; 子母同步时,可以使用我之前介绍的2种,具体可参考之前的文章: https://www.yeyudo.cn/article.asp?id=254 https://www.yeyudo.cn/article.asp?id=259 https://www.yeyudo.cn/article.asp?id=260 8位米字VFD屏制作的同步子/GPS电路设计包括MCU控制板+驱动板2部分。 见PCB实物截图: 实物购买链接:https://item.taobao.com/item.htm?spm=2013.1.0.0.lJN4W6&id=15071361340
在这些引用中,都提到了"bind error: Permission denied"的错误。这个错误通常表示程序在尝试绑定到指定的网络地址和端口时被拒绝了权限。这可能是因为操作系统限制了程序对某些端口或网络地址的访问权限。 在这些引用中的例子中,出现了类似的错误信息。第一个引用提到了使用C语言编写的程序遇到了"bind error: Permission denied"错误。第二个引用中的Haskell程序也遇到了相同的错误。第三个引用中的示例是关于Hadoop的安装过程中出现了"Permission denied"的问题。 对于这个错误,一种可能的解决方法是以管理员身份运行程序,以获得足够的权限来绑定到所需的网络地址和端口。另外,还可以检查操作系统的防火墙设置,确保允许程序访问所需的端口。 总结起来,"bind error: Permission denied"错误表示程序在绑定网络地址和端口时被拒绝了权限。可以尝试以管理员身份运行程序,并检查操作系统的防火墙设置,以解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Linux系统编程】普通用户绑定(bind)特权端口](https://blog.csdn.net/weixin_33994444/article/details/88600055)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [超级马里亚java源码-HadoopCourse:终极实践Hadoop-驯服您的大数据!:https://www.udemy.com/the-](https://download.csdn.net/download/weixin_38588394/19416862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值