Arduino时钟精度


10

我目前正在尝试使用PJRC时间库(http://www.pjrc.com/teensy/td_libs_Time.html)创建一个Arduino时钟。我知道,由于大多数Arduino开发板都以16MHz时钟和单个谐振器运行,因此经过一定时间后,时间可能会变得“不同步”。

但是,我想知道是否有人对带有84MHz时钟的Arduino DUE使用时库的准确性有所了解。我已经对其进行了测试,到目前为止,时钟已经同步了几个小时。谢谢!


库精度的限制取决于晶体的精度。假设您的水晶每小时时差为0.5秒,这对短期而言非常有用,但是如果将其扩展一年以上,那么到那时该钟点已超过1个小时。如果您希望某些东西可以长时间保持准确的时间,我建议您使用一个实时时钟(它们仍然不准确),一个GPS模块或一个要与之同步的互联网连接。
杰西·兰宁

@jamolnng感谢您的回答。您是否知道Arduino DUE上晶体的精度,或者我在哪里可以找到它?
KK6FSL 2014年

您要获得的最佳精度是84MHz,当他们制作或烹饪晶体时,它们只能使晶体达到一定程度的精度,而且晶体的环境(温度,湿度等)在它的准确性。
杰西·兰宁

@jamolnng因此,我可以期望84MHz晶振比其他大多数Arduino上的16MHz晶振具有更高的精度吗?
KK6FSL 2014年

5
“您将获得的最佳精度是84MHz”-对我来说这没有多大意义!
Cyber​​gibbons

Answers:


10

库精度的限制取决于晶体的精度。当他们制作或烹饪晶体时,他们只能使晶体达到一定程度的精确度,而且晶体的环境(温度,湿度等)也会影响其准确性。假设您有一个每小时每小时0.5秒关闭的水晶,这对短期而言非常有用,但是如果您将其扩展一年以上,那么到那时候将关闭1个小时以上。如果您希望某些东西可以长时间保持准确的时间,我建议您使用一个实时时钟(它们仍然不准确),一个GPS模块或一个要与之同步的互联网连接。

有关更多信息,请参阅维基百科上有关石英晶体的文章

84MHz晶振与16MHz晶振的使用不一定会提高Arduino时钟的精度,因为晶振的频率比精度更能指示处理器速度。Arduino时钟的精度主要取决于晶体振荡器的精度。

编辑:我不是晶体振荡器方面的专家,所以如果您在这里看到任何错误,请告诉我


5

重新访问一个老问题...我发现了一个非常有用的博客文章,为它提供了新的启示。但是让我先提供一些上下文,然后再给出链接。

在评估时基的质量时,无论是晶体,陶瓷谐振器还是实验室级的频率标准,都应区分两个概念:

  • 精度:时基的频率接近其标称值的频率
  • 稳定性:该频率随时间漂移多少

如果您想让时钟“开箱即用”地给出正确的时间,则精度至关重要。但是,如果您愿意花费一些时间来校准时钟,那么您就不会真正在意,因为您将要校准所测得的任何误差。jfpoilpret的答案提供了“手动”校准协议的示例,该协议一定很长。如果您可以借用具有1PPS输出的GPS模块,则可以在几秒钟内完成校准。

稳定性是一个更严重的问题。如果时基的频率随机漂移,这将使您无法进行校准。从本质上讲,校准将告诉你如何快或慢的时钟运行 ,现在,但它不会让你预测的快慢将运行在未来

这是一个有保证的链接:Joris van Rantwijk的Arduino时钟频率精度

Joris所做的是测量Arduino Pro Mini(由陶瓷谐振器计时)和旧的Duemilianove(石英晶体)的准确性和稳定性。在我看来,主要的收获是:

  • 两个时钟都非常不准确,因此都需要用户校准才能用作钟表
  • Duemilianove的石英晶体具有良好的稳定性,在平均6小时的时间中优于1.5e-8
  • Pro Mini陶瓷谐振器的稳定性可悲,比晶体差两个数量级,这使它基本上没有用

这是他的艾伦偏差图,用于测量时钟不稳定度与观察时间的关系:

Arduino时钟频率的Allan偏差
(来源:jorisvr.nl

尽管此研究有一些局限性(仅测试了两个板,并且观察时间太短),但它是经过深思熟虑且非常有用的内容。我鼓励您阅读全文。


1
石英晶体的频率随温度而略有变化。如果可以控制温度,则有助于保持频率稳定。
Duncan C

3

知道电路板谐振器精度的最好方法是自己测量。

为此,您可以使用开发millis()板的Arduino 功能并编写一个小草图,该草图将:

  1. 使您能够设置测量时间漂移的开始时间(例如,使用简单的按钮);您将根据准确的时基触发按钮。
  2. 然后重复调用millis(),直到至少经过120小时(“ arduino小时”,大约5天)
  3. 在经过120小时后显示一个信号(您的草图可能应该在到达确切时间之前“警告”您,以便您准备进行测量)
  4. 经过120小时后,请检查基于您的参考时间(在步骤1中使用),并检查经过了多少时间(应为120h +/- epsilon)
  5. 一旦您知道时钟的漂移,并且只要您的电路板可以在与测量相同的环境条件(主要是温度)下运行,就可以在草图中使用它millis()每小时左右调整一次该值。

当然,这种方法远非完美,因为它需要人工干预,因此在测量过程中会产生额外的时间漂移​​,这就是为什么您需要长时间测量时钟时间漂移的原因。

一种改进的方法是将高精度RTC时钟(必须根据您的应用所需的精度来选择精度)连接到板上,并调整草图,以便它可以自动计算漂移。一旦出现时间漂移,您就可以执行上述草图中的第5步,并从板上断开RTC时钟。

重要事项

  • 测量板上的时间漂移​​,以后需要调整时钟(如果您有多个板,则必须测量每个板一个漂移)
  • 确保您的电路板使用环境的稳定性

最后,如果您确实需要高精度,那么可以肯定地将外部时钟源(例如RTC时钟,GPS,NTP)连接到板上,并将其用作PJRC库的SyncProvider。


2

您的平均系统时钟晶体将关闭几十ppm(百万分之几。它们对于稳定,准确地计时信号非常有用,但对于保持准确的时间却非常重要。如果没有特殊规定,则系统晶体每天可能会关闭几秒钟。

解决方案是使用适当的实时时钟,该时钟由通常称为32768Hz的手表晶体驱动。这些晶体的精度很容易提高十倍。您可以设置自己的振荡器来中断主处理器,并在Arduino草图中保留计数,也可以找到RTC中断板。

在Google中弹出带有搜索字词“ RTC突破”的两个随机示例:

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.