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

出处:维库电子市场网 发布于:2023-02-07 16:02:44

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

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

    图 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。该电路有时称为无源平均电路,如 Millman 定理所述。现在,使用两个 PWM 使 VCXO 调整引脚的输出电压单调是不切实际的,因为电阻器的精度需要非常高。这可以通过选择允许精细 PWM 调整的电阻值来解决,以便在与以下粗略范围重叠的范围内进行调整。
    让我举个例子:图 2 中所示的电阻器值允许粗调 PWM 信号每一步移动约 9.8 mV。精细 PWM 信号每步移动约 0.14 mV,或在其整个范围内移动约 36 mV。因此,由于微调范围大于粗调步长,总是有很多重叠。

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

    图 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。因此,它的频率接近十亿分之几。这比我的函数发生器使用外部参考所能达到的效果要好大约两个数量级。

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

    图 4 GPS 规范的 10 MHz 源示意图。

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

    图 5 GPS 规范的 10 MHz 信号源的 PCB。

    图 6封装中连接的 GPS 规范振荡器 PCB 图像。
    原理图的中间是 32 位计数器(图 1)。这个 74LV8154(~$1)实际上有两个 16 位计数器,可以配置为 32 位计数器。计数器设计允许通过寻址字节读取 4 个单独字节中的 32 位计数器。这需要 4 条地址线,而我在 Nano 上的 I/O 不足,因此使用 74LS139 将 2 条线从 Nano 转换为计数器所需的 4 条线。

    如图 7所示的 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 中断,

    图 7 完整的 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 上查看,并且可以使用在主循环中去抖动的电路按钮查看多个页面(图 8 )。统计包括瞬时频率、平均频率、当前 ppb 误差、ppb 平均误差、ppb 误差标准偏差、良好读数的数量、不良读数的数量、连续锁定的时间、看到的频率、看到的频率以及 PWM 粗调和精细设置.

    图 8每次读数后 LCD 上的统计数据。
    
  

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!