我将如何获得一个运行在31,891,269,116 µHz的小型振荡器?


15

我正在寻找为Mars时间运行的Arduino构建RTC模块。转换因子是1.0274912510地球秒至1火星秒。

虽然我设法通过<2秒的分辨率(不是很理想,我更喜欢300 ms的精度)以编程方式完成此任务,但在连接到常规RTC模块的Arduino Uno上使用定点数学想知道是否有可能在正好31,891,269,116 µHz(31.891269116 kHz)下运行某种低压振荡器,该振荡器或多或少可以与标准的32 kHz时钟晶体互换(但是,我会接受其他想法)只要它们不算贵的话。)

任何想法这怎么可能?或者,也可以接受某种计时器,该计时器每1.0274912510秒关闭一次。


13
为什么使用奇怪的单位(µHz?),那就是31.891 kHz。因此,您可能正在寻找32kHz的手表晶体。
JRE

21
从您的要求开始。您指定了非凡的精度。为什么?在其他地方,您说可以用Arduino做您想做的事情。不好意思告诉您,但是您在开玩笑,除非您使用like或铯钟之类的东西作为参考。因此,请告诉我们您在做什么以及您对性能的要求是什么。那是功能要求,而不是您的衍生性能。如果您要制作一个可以锁定另一个时钟的时钟,请这样说,并让我们知道您的要求(和公差)是什么。
WhatRoughBeast

46
您正在尝试使用非常昂贵的自定义硬件来解决缺乏编程技能的问题。您可以轻松地在Arduino中实现256位浮点转换,或您想要的任何精度。

14
我认为这是一个很好的例子,说明了为什么预先包含更多信息可以使人们为您指明正确的方向。Brian Drummond的答案现在是最好的答案,或者至少对于业余爱好者而言便宜且可行。这也是一个很好的例子,说明了为什么在指定精度和准确性时必须要小心-许多参数可能与时钟相关。我们甚至还没有讨论温度补偿或抖动。
pjc50

11
“转换因子是1.0274912510地球秒至1火星秒。” -您是否将火星与地球之间的日长差异与秒长相混淆?火星上太阳日长度为88 775 s,即1.02749地球日(86 400 s)。另一方面,第二个元素是由铯原子发出的辐射定义的,即使考虑时间膨胀,您也需要约0.23 c的速度才能获得2.7%的差异。
ilkkachu

Answers:


41

像其他所有人一样,使用32768kHz晶体,但除以33669即可得到-5.08ppm的误差。(如果需要,您可以通过调整负载电容来消除它)。

这并不精确,但是对于火星时钟来说,它会与任何地球石英时钟一样好。也就是说,忽略火星环境温度的温度补偿问题,除非您找到火星供应商,否则大多数手表晶体只能用于地球切割。

我将使用MSP430中的计数器外设来进行除法,并且(假设您正在驱动标准的石英机械时钟运动)每秒在其输出引脚上生成双极性30ms脉冲,大致遵循原始时序即可在示波器上测量。

可以使用Arduino或类似产品,但是MSP可以在脉冲之间进入睡眠状态,并且在LF振荡器运行时的功耗不到1uA。这是一个带有源代码和手表PCB 的示例设计 -到目前为止只有地球时间,尽管可以通过更改常量来解决。


1
谢谢!根据其他反馈,我认为这似乎是最可行的选择,而无需深入研究原子钟领域,因此我选择了它作为我的问题的解决方案。我也特别感谢您链接的设计。
叛逆者

请注意,使用标准RTC晶体无法满足您提供的重要数字。数学上的5ppm误差可能会小于晶体容差。
2016年

6
@ user2943160,如果您有很好的参考资料,则可以在初次修整时达到1ppm左右-几年内会有几ppm的漂移,并且(对于音叉晶体来说这很奇怪)温度会出现抛物线变化。我家中所有便宜的石英钟都以不同的速率运转,它们可能从未在工厂进行修整,也没有比温度补偿摆钟好得多。
布赖恩·德拉蒙德

为“火星供应商” +1。
奥林·拉斯洛普

41

您可以做得比Brian Drummond的建议要好。尽管您的振荡器可能是系统中最大的错误源,这确实是正确的,但没有足够的理由却没有理由添加其他系统错误。

将您的计时器间隔设置为33668滴答,在0处启动计数器,并在每次计时器中断时,将计数器增加6754。

如果在递增之后,计数器> = 8105,则减去8105,并将下一秒的计时器间隔设置为33669滴答。

否则,请不要理会计数器,并将下一秒的计时器间隔设置为33668。

这将使您(假设一个完美的32.768kHz晶体)的平均间隔为

(33668 + 6754 / 8105) / 32768 ~= 1.0274912510006

秒(相对于1.0274912510小于百万分之一的误差),而不是1.0274963378906秒(几乎百万分之五的误差)。这意味着时钟的长期精度将真正取决于振荡器的精度。由于数学造成的错误,每年造成的错误将大大少于一滴答。虽然任何的长度第二将具有相对误差高达25ppm的,在更长的和更长的平均时间间隔的误差消失。

这是布雷森纳姆(Bresenham)应用于计时的算法,发现分数6754/8105如下:

32768 * 1.027491251 = 33668.833312768

33668.833312768的确切连续分数为[33668; 1,4,1,1349,1,7]。

删除最后一项,得出的近似值为33668 + 6754/8105,它的所有部分都整齐地适合16位。


16

10101014


我希望尽可能避免使用昂贵的硬件。现在,我可以通过常规的RTC模块和Arduino来实现这一目标,并且能够进行1000ms到1027.4912510ms的转换,但是我只有大约1-2秒的分辨率,这意味着它可以自我校正,但并不十分精确。
叛逆者

12
@renegadeds,那么您应该在问题中明确指出可以接受的精度。并且请提供一些背景信息:单个[arduino]标签将很好地暗示您没有在构建高精度的实验室支架。
德米特里·格里戈里耶夫

1
注意,我已经更新了问题并添加了Arduino标签。
叛逆者

15

可以用10MHz的a或其他原子参考时钟来完成,也许用一个PLL来提供(例如)100MHz,然后用一个〜36位的相位累加器进行计数以给出0.001Hz的分辨率。后者可以通过小型FPGA完成。

您可以阅读直接数字合成(DDS)方法。有些芯片可以执行DDS,但可能没有这么宽的位宽。

the时钟模块可以在剩余市场上购买,也可以从Microsemi等制造商那里购买。


7

您没有定义“昂贵”,因此这是黑暗中的镜头。

从商用(包括eBay)10 MHz发生器开始。id可供选择,但是无论您能获得多高的精度,它都可以决定性能。

现在建立一个28位长度的可分频器。在10 MHz时,您可以摆脱74HC CMOS逻辑,但是您需要使用快速进位配置。输出还触发一个二分频触发器,该触发器提供位29。

分频器的运行比例为10,274,912或10,274,913,具体取决于位29的状态。对于完美的10 MHz输入,位28的有效输出周期为1.02749125秒,大约精确至1 ppb,或大约30毫秒/年。当然,输入精度较低会产生输出精度较低。

使用沼泽标准的74HC161s,您可以使用8个IC进行此操作,并且如果您要小心谨慎以加强接地系统,则可以小心地使用标准的原型带状板。Perfboard会更便宜,更紧凑且更耐用,但是接线会不太方便,因为您需要焊接连接。然后,您可以将其装入电子级RTV(不是从五金店购买的RTV)中,最终模块的大小在2 x 2 x 1/2英寸范围内,不包括振荡器。

编辑

请注意,与“常规” RTC链接的性能标准实际上在1秒/天的精度范围内,比这种方法差30倍。因此,首先,您可以取消第29位级,或者将10 MHz划分为5 MHz,并使用5,137,456的比率。计数器的较低时钟速率将允许较简单的进位结构,从而避免了10 MHz时所需的快速进位。现在,精确时钟的精度约为60毫秒/年。

进一步编辑

快速浏览eBay可以看到大量的10 MHz OCXO,价格不到20美元。它们通常具有1 ppb或更高的稳定性,而0.2 ppb是相当普遍的规格。获取其中之一,您应该处于良好状态。您想借用一个相当高分辨率的频率/周期表来确定实际的输出频率,然后调整分频比以匹配。


商定的,即使OCXO不在功耗预算之内,TCXO仍可以并且仍可以在手表晶体上进行改进。
hobbs

4

101110141011

106

“分数N合成器”类型的PLL用于从某些GPS单元中得出参考的任何比率,例如10Mhz。

如果TCXO振荡器的稳定性为1ppm,则只能对其进行调谐,并且不能从1 pps或1.0274912510 Hz偏移2.07%,因此采用分数N芯片的PLL是实现此目的的一种方法VC-OCXO或机械调整的OCXO。

添加 -要在MARs时间上生成1pps,则分频比为26,337.44856,使用5个整数和5个残数。

  • 如果您可以将Xtal调整为0.01 ppm,除非将微波炉设置在〜30'C左右,否则通常只能稳定在1ppm,因为对于某些XTAL(不一定是MEM),Tempco在体温附近通常为零。除非Vcc和温度在0.1摄氏度内保持恒定,否则任何试图将残留物误差校正到0.01 ppm以上的事情都是不可能的,即使0.1ppm也是很难的,长期老化每年至少会达到1ppm。

  • 因此,从理论上讲,如果您有一个来自GPS的经过校准的1ppm时钟来调整1ppm的地球时间,则不可能期望有更高的精度来校正残差。

  • 分频器每秒的残留误差值。是44856/100000(+26,337)

  • 将44856转换为二进制= 1010111100111000
  • 这需要一个残差计数器在/ 44856和45857之间切换

  • 我们通过将二进制残差数截断为8位然后旋转这些位使MSB变为LSB来进行此残差划分。

  • 10101111变成11110101

  • 每秒从11110101开始的残差计数器,其中每个“ n”位位置= 1是二进制n ^ 2中的计数值,其中除整数比是45857而不是44856。由于LSB = 1,这意味着每2个计数切换一次,直到101秒,然后切换下一个1pps计数的分频器选择。重复此操作以选择下一秒使用哪个分频器,然后递增指针,直到指针到达末尾并等待下一个1pps地球时钟。

  • 对该旋转的二进制残差的整个计数重复此过程,或者10101111> 11110101 = 245秒,以便每秒创建1pps火星时间的小数N合成除法器,并每245秒循环进行一次校正以保持时间。长期而言。

-也许时钟的浮点分频比更容易。


2

通过使用二进制分数,您可以用软件轻松地解决此问题,而不用完全改变硬件(尽管您可能需要更稳定的参考频率),并且可以以毫秒级的分辨率来实现,并且可以轻松地免费获得。足够的累积转换错误,使您可以看到可以引用的任何来源的基本准确性,包括原子钟。

您要做的就是修改计时器中断,以将其累加到非常宽的寄存器中,并在每个中断上添加一个相当长的值,该值可以精确表示所需的地球毫秒与“火星毫秒”之比。

假设出于争论的目的,您希望转换使用32位分辨率。您可以使用64位累加器,低32位代表小数。您要做的就是找出适当的值,该值略小于2 ^ 32,代表转换因子。每当您的地球毫秒中断触发时,便将此值添加到累加器中。任何时候您要查询时钟时,都将返回高32位,即经过整个火星的毫秒数,而低32位仅在内部保留以避免舍入错误。

使用这样的长二进制分数,可以使您执行所需精度的转换。对于小数部分,几乎可以肯定32位太长,而整个毫秒的32位可能太短,但是您可以根据需要进行调整。

顺便说一句,这种在长寄存器中累加但仅报告一些最高有效位的技术是直接数字合成如何产生极高的频率分辨率。

您也可以考虑通过将分频器的比例从8或16 MHz系统时钟更改为毫秒中断,将其移近“火星毫秒”的间隔来进行转换。尤其是如果您想要比廉价晶体更精确的东西,则可能要处理由GPS或更常规地由原子钟约束的10 MHz惯用参考,因此您可以用它代替普通的AVR 8/16 MHz时钟源并重新计算分频比。


0

直接数字合成(DDS)或数控振荡器方法是一种非常简单的方法,可以在不依赖于时钟频率的情况下获得任何所需的输出频率分辨率。

在这种方法中,您具有高分辨率的相位累加器。您周围的每个循环都会添加一个相位分辨率,该分辨率也具有较高的分辨率。输出是累加器的最高位。

使用它提供方波时,边缘只能随输入时钟(或软件循环速率)而变化,因此边缘应从其应有的位置抖动,但是随着时间的流逝,不会出现累积误差-您可以将分辨率设为你想要的高。

您可以非常轻松地在软件中完成此操作(例如在AVR上),并且某些微型计算机现在具有NCO硬件。http://ww1.microchip.com/downloads/zh-CN/AppNotes/90003131A.pdf 小型PIC可以在分辨率为20bit(1ppm)的硬件中,从32kHz xtal或精确的10MHz烤箱中完成此操作。


0

研究如何使定制的石英晶体以所需频率的整数倍运行。它们的成本不超过标准频率。网页搜索“定制石英晶体”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.