0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >技术信息 > 简单的GPS规范10MHz参考使用双PWM

简单的GPS规范10MHz参考使用双PWM

来源: edn
2022-07-26
类别:技术信息
eye 2
文章创建人 拍明芯城

原标题:简单的GPS规范10MHz参考使用双PWM

  我最近正在为一项新设计进行实验,并且正在使用函数发生器。尽管新的函数发生器具有相当好的频率容差规格,但我需要更准确和精确的东西。在频率发生器、任意波形发生器和频率计数器中获得更高精度的方法是使用许多这些测试仪器上提供的 10 MHz 参考输入。没有这样的参考,并且最近一直在玩 Arduino Nano,我决定看看是否可以围绕 Nano 构建一个可能会很有趣。

  图 1显示了这种简单且廉价的“无需校准”设计的主要部分。频率由 10 MHz 压控晶体振荡器 (VCXO) 产生。该振荡器产生约 10 MHz 的频率,具有合理的容差,但也有一个频率调整引脚,允许向上或向下调整。获得更精确和准确的 10 MHz 信号的诀窍是为 VCXO 找到正确的调整,并在 VCXO 由于各种因素而漂移时重新调整它。让我们来看看实现这一点的方法。

  

image.png


  图 1无需校准的简单频率发生器的主要部件。

  GPS模块可以提供非常准确的每秒 1 个脉冲 (1PPS) 的信号。该脉冲看起来像每秒约 100 毫秒的脉冲。即使在便宜的模块中,该信号通常在几十纳秒的范围内也是准确的。这是用于生成精确 10 MHz 信号的设计的外部参考。1PPS 信号通过能够产生中断的 I/O 线连接到 Arduino Nano。该设计还具有一个 32 位计数器,可由 Nano 读取和重置。32 位计数器连接到 VCXO 的输出,因此它计算自上次复位后的 VCXO 周期数。最后一个主要部分是我们如何调整 VCXO。

  Nano 没有 DAC,但事实证明,Nano 的一项简单功能是控制其脉冲宽度调制 (PWM) 线,这些线旨在用作可调节的直流输出电压(滤波后)。一组简单的调用将以固定频率输出 5V PWM 信号。PWM 具有 8 位调节范围,因此如果您想要 2.5V 输出,您可以将 PWM 设置为 128(50% 占空比)。(注意,对于这组调用,Nano 使用大约 500 Hz 的频率,尽管这仅对滤波器设计很重要。)所以,首先想到的是使用 Nano 的 PWM 输出,对其进行滤波以获得相对无纹波的直流电平,并将其应用于 VCXO 的调整引脚。这会起作用,但问题是我们只有 255 个离散级别可以设置,这可能还不够。

  我为该项目选择的 VCXO 是 Taitien TSEAACSANF-10.000000。它具有 2 ppm 的初始频率容差和称为“牵引范围”的最大调整范围,在调整引脚上使用 0.5 至 2.5 伏电压时约为 ±12 ppm。因此,如果我们使用完整的 255 步 PWM,我们将能够以大约 (2*12/255 ≈ 0.1 ppm) 的分辨率调整 VCXO。这似乎对 ppm 精度没有太大的改进,所以我想出了使用两个 PWM 的想法:一个用于粗调,一个用于微调。为了保持设计简单,我选择只使用电阻而不使用运算放大器。这部分电路可以在图 2中看到(还显示了 2 个过滤器帽,我们将在后面讨论)。

  

image.png


  图 2对旨在用作可调直流输出电压的 PWM 线路的粗调和微调。

  本质上,您所看到的是一个平均电路,电路粗略部分的电阻为 2 kΩ,精细部分的电阻为 270 kΩ。最后一个 2 kΩ 电阻器用于将电压分压为调节引脚,提醒一下,这需要 2.5V 最大值。VCXO 调整电压可以很容易地使用叠加来求解,并且大约等于公式 1。

  VCXO 调整电压 = 9.76×10 -3 x PWM COARSE + 144×10 -6 x PWM FINE (Eq. 1)

  其中 PWM COARSE和 PWM FINE的值范围为 0 到 255。此电路有时称为无源平均电路,如米尔曼定理所述。现在,使用两个 PWM 使 VCXO 调整引脚的输出电压单调是不切实际的,因为电阻器的精度需要非常高。这可以通过选择允许精细 PWM 调整的电阻值来解决,以在与以下粗略范围重叠的范围内进行调整。

  让我举个例子:图 2 中所示的电阻值允许粗略的 PWM 信号每一步移动大约 9.8 mV。精细 PWM 信号每步移动约 0.14 mV 或在其整个范围内移动大约 36 mV。因此,由于微调范围大于粗调步长,所以总是有很多重叠。

  图 3显示了几个粗略范围以及如何配置精细值重叠。在后面对调整算法的讨论中,我将解释如何使用这种重叠。(请注意,图 2 中的两个 100uF 电容选择了将 PWM 波形的纹波保持在 0.14 mV 精细步长以下的值。为了帮助滤波,代码将 PWM 频率提高到大约 31 kHz。)

  

image.png


  图 3说明微调范围和粗调步长重叠的图表。

  将所有这些放在一起,操作如下所示:上电后,Arduino Nano 将粗略和精细 PWM 设置为初始值(中间某处),然后等待直到它感应到来自控制器的 1PPS 信号全球定位系统模块。然后,在下一个 1PPS 信号中断时,Nano 将 32 位计数器复位。然后计数器开始计算来自 VCXO 的周期。在收到以下 1PPS 中断后,Nano 捕获并读取 32 位计数器,该计数器应为 10,000,000。如果计数小于 10,000,000,则向上调整精细 PWM 值。如果微调前的 PWM 微调值为 255,则将粗调 PWM 值递增,并将微调 PWM 值设置为 127(中间)。如果计数大于 10,000,000,则向下调整精细 PWM 值。如果微调前 PWM 微调值为 0,则粗调 PWM 值递减,微调 PWM 值设置为 127(中间)。您可以看到,精细调整与多个粗略值的重叠使得该算法可以安全地寻找合适的值,尽管在搜索速度方面有些低效。

  这实际上是调整的第一阶段。如果我们只测量一秒钟的计数,我们无法获得超过 0.1 ppm 的准确度。因此,代码的第二阶段允许 32 位计数器通过等待 10 次中断来累积 10 秒。现在计数可以上升到 100,000,000,我们可以调整到 0.01 ppm 范围(或 10 ppb)。前两个阶段用于更快地接近目标 10 MHz。第三个连续操作阶段计数 100 秒,等待 100 次中断,然后再读取计数器。这使我们达到了 1,000,000,000 的预期计数,允许调整到 1 ppb。但是PWM实际上可以调整到什么?如前所述,精细 PWM 每步移动大约 0.14 mV,VCXO 在 0.5 至 2.5 V 范围内调整大约 +/-12 ppm。因此,每个精细步骤将频率移动大约 (2*12 ppm*(0.14mv/2.0V) ) ≈ 0.0017 ppm 或 1.7 ppb。所以,看起来我们有足够的调整来获得大约±1 ppb。在代码中可以看到更多内容,但这是寻找精确和准确的 10 MHz 的本质。(此时应注意,Arduino Nano 实际上具有 16 位 PWM,但最大频率太低,以至于所需的滤波器的建立时间很长;对于此应用来说太长了。)Arduino Nano 实际上有一个 16 位 PWM,但最大频率太低,以至于所需的滤波器有很长的稳定时间;这个应用程序太长了。)Arduino Nano 实际上有一个 16 位 PWM,但最大频率太低,以至于所需的滤波器有很长的稳定时间;这个应用程序太长了。)

  至于性能,Nano 在 LCD 上输出各种统计数据,我的平均频率通常为 10,000,000.00,平均误差为 0.01 Hz,该平均值的标准偏差为 0.1 ppb。因此,它的频率接近十亿分之几。这比我的函数发生器通过外部参考可以实现的效果要好两个数量级。

  现在转向示意图。可以看到 PWM 平均电路将调节电压馈送到 VCXO(这是唯一由 Nano 的 3.3V 电源供电的设备)。VCXO 之后的电路用于对 VCXO 输出的削波正弦波进行平方。这个经过平方和缓冲的信号是 10 MHz 方波,不仅发送到计数器,还发送到外部 BNC 连接器。其中两个 BNC 连接器提供 TTL 信号。另一个配置有 2 个反相器门和一个 33Ω 电阻以产生大约 50Ω 的输出。第四个 BNC 连接器提供缓冲的 1PPS 信号供外部设备使用。

  Nano下方是GPS模块。这些可以在网上以大约 10 美元到 12 美元的价格购买模块和天线。PCB如图 4和图 5 所示。

  

image.png


  图 4 GPS 规范的 10 MHz 源的 PCB。

  

image.png


  图 5封装中连接的 GPS 规范振荡器 PCB 的图像。

  原理图中间是 32 位计数器(图 1)。这个 74LV8154(~1 美元)实际上有两个 16 位计数器,可以配置为一个 32 位计数器。计数器设计允许通过寻址字节来读取 4 个单独字节中的 32 位计数器。这需要 4 条地址线,而我在 Nano 上的 I/O 上运行不足,因此使用 74LS139 将 Nano 中的 2 条线转换为计数器所需的 4 条线。

  图 6所示的 LCD 是标准 I 2C、20 个字符,4 行 LCD。原理图底部是一个简单的线性电源,使用 12V AC/DC 适配器并调节至 8V 为 Nano 和 5V 供电,用于电路的各个部分。我使用线性电源来确保安静的 Vcc 平面。最后,有 2 个 LED。一个绿色 LED 显示 1PPS 信号。第二个双色 LED,当系统已紧密锁定到所需的 10 MHz 时为绿色,如果尚未锁定,则为红色,如果系统处于保持状态,则交替显示红色/绿色。保持是在 1PPS 信号丢失期间保持当前设置的状态。为了检测 1PPS 信号的丢失,我使用了看门狗定时器 (WDT)。我没有使用 WDT 来检测错误的执行代码问题,而是将 WDT 超时设置为 2 秒,并在 1PPS 中断例程中对其进行宠物(重置)。如果系统没有得到 1PPS 中断,

  


  图 6 已完成的 GPS 纪律振荡器封装,带 LCD。

  Nano 的代码是使用 Arduino IDE 用 C 语言编写的。该代码基本上由 1PPS 中断驱动,该中断通过锁定 32 位计数器值(74LV8154 的功能)、清除计数器和设置复位标志来快速响应。您可能已经发现我们错过了下一个计数的某些部分,因为我们正在捕获计数器寄存器然后将其清除,使其再次从 0 开始计数。(在捕获和清除之间有一些有限的时间。)这是真的,因此固件通过将偏移值添加到原始计数器值来补偿此延迟。事实证明有 16 个缺失计数。这已经通过两种方式得到验证:首先,通过在示波器上测量捕获寄存器信号和清除寄存器信号之间的时间。第二,我在没有调整 VCXO 的情况下运行了许多测试,使用了 1 秒和 100 秒的捕获,这些捕获通过延迟偏移值进行了调整。1 秒的捕获重复 100 次并加起来。如果延迟偏移正确,则 1 秒值的总和(现在包含 100 个延迟偏移)应该等于 100 秒捕获的读数(其中包含 1 个延迟偏移)。在操作代码中,每次读取计数器时都会重新添加丢失的 16 个计数。

  代码中的主循环(Arduino 开发系统始终将经典的 C“Main”作为循环运行)等待设置中断标志,并在设置时读取 74LV8154 的锁定寄存器的值。接下来,它会检查它是否是“合理的”读数并且没有损坏(与 10 MHz 的差异超过 12 ppm)。如果不好就扔了。如果它很好,它会在一个小型 boxcar 平均器中处理该值。然后使用该平均值来向上或向下调整 PWM,如上所述。然后它决定它处于哪个阶段。第一阶段运行 1 秒计数并调整 VCXO。这很快让我们了解 PWM 设置。此阶段运行 20 秒。第二阶段需要 10 秒的计数读数来微调 PWM 设置。这设置为运行 5 次或 50 秒。

  在最后阶段,根据需要设置 LED,并在每次读数后进行统计。这些统计数据可以在 LCD 上查看,并且可以使用在主循环中去抖动的电路按钮查看多个页面(图 7 )。统计数据包括瞬时频率、平均频率、当前 ppb 误差、ppb 平均误差、ppb 误差标准偏差、良好读数的数量、不良读数的数量、连续锁定时间、最大频率看到、最小频率看到以及 PWM 粗略和精细设置.

  image.png

  图 7每次读数后对 LCD 进行的统计。

  完整的项目信息可以在开源网站上找到: https:https: //www.thingiverse.com/thing:5188330(或者您可以在 thingiverse.com 中搜索“DamianB2”)。

  项目信息包括带有原理图、PCB 和 PCBA BOM 的完整 KiCad 项目。还包括完整的组装 BOM、Arduino 源代码、外壳的 3D 打印文件、GPS 模块外壳的 3D 打印文件的链接、铭牌的艺术品、各种注释等。

  最后一个想法:你们中的一些人可能已经注意到,在设计 GPS 纪律振荡器 (GPSDO) 时,我们无意中创造了一个非常好的频率计数器的本质。我们将在下一部分中对此进行调查。

  Damian Bonicatto 是一名咨询工程师,在嵌入式硬件、固件和系统设计方面拥有数十年的经验。他拥有30项专利。

  Phoenix Bonicatto 是一名自由作家。


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

上一篇: eMMC 反对 UFS

相关资讯