我目前正在尝试使用PJRC时间库(http://www.pjrc.com/teensy/td_libs_Time.html)创建一个Arduino时钟。我知道,由于大多数Arduino开发板都以16MHz时钟和单个谐振器运行,因此经过一定时间后,时间可能会变得“不同步”。
但是,我想知道是否有人对带有84MHz时钟的Arduino DUE使用时库的准确性有所了解。我已经对其进行了测试,到目前为止,时钟已经同步了几个小时。谢谢!
我目前正在尝试使用PJRC时间库(http://www.pjrc.com/teensy/td_libs_Time.html)创建一个Arduino时钟。我知道,由于大多数Arduino开发板都以16MHz时钟和单个谐振器运行,因此经过一定时间后,时间可能会变得“不同步”。
但是,我想知道是否有人对带有84MHz时钟的Arduino DUE使用时库的准确性有所了解。我已经对其进行了测试,到目前为止,时钟已经同步了几个小时。谢谢!
Answers:
库精度的限制取决于晶体的精度。当他们制作或烹饪晶体时,他们只能使晶体达到一定程度的精确度,而且晶体的环境(温度,湿度等)也会影响其准确性。假设您有一个每小时每小时0.5秒关闭的水晶,这对短期而言非常有用,但是如果您将其扩展一年以上,那么到那时候将关闭1个小时以上。如果您希望某些东西可以长时间保持准确的时间,我建议您使用一个实时时钟(它们仍然不准确),一个GPS模块或一个要与之同步的互联网连接。
有关更多信息,请参阅维基百科上有关石英晶体的文章
84MHz晶振与16MHz晶振的使用不一定会提高Arduino时钟的精度,因为晶振的频率比精度更能指示处理器速度。Arduino时钟的精度主要取决于晶体振荡器的精度。
编辑:我不是晶体振荡器方面的专家,所以如果您在这里看到任何错误,请告诉我
重新访问一个老问题...我发现了一个非常有用的博客文章,为它提供了新的启示。但是让我先提供一些上下文,然后再给出链接。
在评估时基的质量时,无论是晶体,陶瓷谐振器还是实验室级的频率标准,都应区分两个概念:
如果您想让时钟“开箱即用”地给出正确的时间,则精度至关重要。但是,如果您愿意花费一些时间来校准时钟,那么您就不会真正在意,因为您将要校准所测得的任何误差。jfpoilpret的答案提供了“手动”校准协议的示例,该协议一定很长。如果您可以借用具有1PPS输出的GPS模块,则可以在几秒钟内完成校准。
稳定性是一个更严重的问题。如果时基的频率随机漂移,这将使您无法进行校准。从本质上讲,校准将告诉你如何快或慢的时钟运行 ,现在,但它不会让你预测的快慢将运行在未来。
这是一个有保证的链接:Joris van Rantwijk的Arduino时钟频率精度。
Joris所做的是测量Arduino Pro Mini(由陶瓷谐振器计时)和旧的Duemilianove(石英晶体)的准确性和稳定性。在我看来,主要的收获是:
这是他的艾伦偏差图,用于测量时钟不稳定度与观察时间的关系:
(来源:jorisvr.nl)
尽管此研究有一些局限性(仅测试了两个板,并且观察时间太短),但它是经过深思熟虑且非常有用的内容。我鼓励您阅读全文。
知道电路板谐振器精度的最好方法是自己测量。
为此,您可以使用开发millis()
板的Arduino 功能并编写一个小草图,该草图将:
millis()
每小时左右调整一次该值。当然,这种方法远非完美,因为它需要人工干预,因此在测量过程中会产生额外的时间漂移,这就是为什么您需要长时间测量时钟时间漂移的原因。
一种改进的方法是将高精度RTC时钟(必须根据您的应用所需的精度来选择精度)连接到板上,并调整草图,以便它可以自动计算漂移。一旦出现时间漂移,您就可以执行上述草图中的第5步,并从板上断开RTC时钟。
重要事项:
最后,如果您确实需要高精度,那么可以肯定地将外部时钟源(例如RTC时钟,GPS,NTP)连接到板上,并将其用作PJRC库的SyncProvider。
您的平均系统时钟晶体将关闭几十ppm(百万分之几。它们对于稳定,准确地计时信号非常有用,但对于保持准确的时间却非常重要。如果没有特殊规定,则系统晶体每天可能会关闭几秒钟。
解决方案是使用适当的实时时钟,该时钟由通常称为32768Hz的手表晶体驱动。这些晶体的精度很容易提高十倍。您可以设置自己的振荡器来中断主处理器,并在Arduino草图中保留计数,也可以找到RTC中断板。
在Google中弹出带有搜索字词“ RTC突破”的两个随机示例: