Arduinoタイムクロックの精度


10

現在、PJRCタイムライブラリ(http://www.pjrc.com/teensy/td_libs_Time.html)を使用してArduinoタイムクロックを作成しようとしています。ほとんどのArduinoボードは16MHzクロックと単一の共振器で動作しているため、一定の時間が経過すると時刻が「非同期」になる可能性があることを知っています。

ただし、84 MHzクロックのArduino DUEで使用した場合、Timeライブラリの精度について誰かが知っているかどうか疑問に思いました。私はそれをテストしてきました、そして今のところ、時計は数時間同期されています。ありがとう!


ライブラリの精度の制限は、クリスタルの精度に依存します。たとえば、1時間ごとに.5秒ずれている水晶があるとします。短期的には優れていますが、1年以上拡大すると、その時間までに1時間以上ずれます。長期間にわたって正確な時間を維持したい場合は、リアルタイムクロック(誤差がまだある)、GPSモジュール、または同期するインターネット接続をお勧めします。
Jesse Laning 2014

@jamolnngご回答ありがとうございます。Arduino DUEの水晶振動子の精度を知っていますか、それともどこで見つけられますか?
KK6FSL 2014

あなたが得ようとしている最高の精度は84MHzです、彼らが作るか、または調理するとき、彼らがある程度正確にしか作ることができない水晶、また水晶の環境(温度、湿度など)も役割を果たしますそれの正確さ。
Jesse Laning 2014

@jamolnng他のほとんどのArduinoでは、16MHzクリスタルではなく84MHzクリスタルの方が高い精度を期待できますか?
KK6FSL 2014

5
「取得する最高の精度は84MHzです」-それは私にはあまり意味がありません!
Cyber​​gibbons 2014

回答:


10

ライブラリの精度の制限は、クリスタルの精度に依存します。彼らが作る、または調理するとき、結晶をある程度正確にしか作ることができません。また、結晶の環境(温度、湿度など)も結晶の精度に影響を与えます。たとえば、1時間ごとに.5秒ずれている水晶があるとします。短期的には優れていますが、1年以上拡大すると、その時間までに1時間以上ずれます。長期間にわたって正確な時間を維持したい場合は、リアルタイムクロック(誤差がまだある)、GPSモジュール、または同期するインターネット接続をお勧めします。

詳細については、水晶に関するウィキペディアの記事をご覧ください。

水晶の周波数は精度よりもプロセッサ速度の指標となるため、84MHz水晶と16MHz水晶を使用しても、Arduinoクロックの精度は必ずしも向上しません。Arduinoクロックの精度は、主に水晶発振器の精度に依存します。

編集:私は水晶発振器の専門家ではないので、ここで何か問題があったら教えてください


5

古い質問に再度アクセスします...新しい光を当てる非常に有益なブログ投稿を見つけたので。ただし、リンクを提供する前に、まずコンテキストを提供します。

タイムベースの品質を評価する場合、それが水晶、セラミック共振器、または実験室グレードの周波数標準のいずれであっても、区別すべき2つの概念があります。

  • 精度:タイムベースの周波数がその公称値にどれだけ近いか
  • 安定性:その周波数は時間とともにどれだけドリフトするか

時計に「箱から出して」正確な時間を与えたい場合は、精度が重要です。ただし、時計の調整にある程度の時間を費やすことをいとわない場合は、測定した不正確さを調整するため、実際には気にしません。jfpoilpretの回答は、「手動の」校正プロトコルの例を示しています。1PPS出力のGPSモジュールを借りることができれば、数秒でキャリブレーションを実行できます。

安定性はより深刻な問題です。タイムベースの周波数がランダムにドリフトする場合、これはキャリブレーション作業を無効にします。基本的に、キャリブレーションは現在のクロックの実行 速度を示しますが、将来の実行速度を予測することはできません。

ここに約束されたリンクがあります:Joris van RantwijkによるArduinoクロック周波数精度

Jorisが行ったのは、Arduino Pro Mini(セラミック共振器からクロックされた)と古いDuemilianove(水晶)の精度と安定性を測定することです。私の観点から、主なポイントは次のとおりです。

  • どちらの時計も著しく不正確であるため、時計として使用するには両方ともユーザーによる調整が必要です。
  • Duemilianoveの水晶はまともな安定性を持ち、6時間の平均化時間で1.5e-8より優れています
  • Pro Miniのセラミック共振器の安定性は悲惨で、水晶より2桁以上低いため、時計としては本質的に役に立たない

これは、観測時間の関数としてクロックの不安定性を測定する彼のアラン偏差プロットです。

Arduinoクロック周波数のアラン偏差
(ソース:jorisvr.nl

この研究にはいくつかの制限があります(2つのボードのみがテストされ、観測時間が短すぎる)、それはよく考えられており、非常に有益です。全体を読むことをお勧めします。


1
水晶の周波数は温度によってわずかに変化します。温度を制御できれば、周波数を安定させることができます。
Duncan C

3

ボードの共振器の精度を知る最良の方法は、自分で測定することです。

そのためにmillis()は、ボードのArduino 関数を使用して、次のような小さなスケッチを書くことができます。

  1. 時間ドリフトを測定するための開始時間を設定できるようにします(たとえば、単純なプッシュボタンを使用)。正確なタイムベースに基づいてボタンをトリガーします。
  2. 次に、少なくとも120時間( "arduino時間"、つまり約5日)が経過するまで、millis()を繰り返し呼び出します。
  3. それらの120時間が経過したときに信号を表示します(正確な時間に達する前にスケッチがおそらく「警告」して、測定の準備ができているはずです)。
  4. 120hが経過したら、基準時間(ステップ1で使用)を確認し、経過時間を確認します(120h +/-イプシロンにする必要があります)
  5. クロックのドリフトがわかっていて、ボードがメジャーと同じ環境条件(主に温度)で動作する場合は、それをスケッチで使用してmillis()1時間ごとに値を調整できます。

もちろん、このアプローチは人間の介入が必要であり、測定中に追加の時間ドリフトを作成するため、完全とはほど遠いです。そのため、長期間にわたってクロック時間ドリフトを測定する必要があります。

改善されたアプローチは、高精度RTCクロック(精度はアプリケーションに必要な精度に基づいて選択する必要があります)をボードに接続し、スケッチを調整してドリフトを自動的に計算することです。時間ドリフトを取得したら、スケッチで上記のステップ5と同じことを実行し、RTCクロックをボードから切り離します。

重要なポイント

  • 後でクロック調整が必要になるボードの時間ドリフトを測定します(複数のボードがある場合は、ボードごとに1つのドリフトを測定する必要があります)
  • ボードが使用される環境の安定性を確保する

最後に、本当に高い精度が必要な場合は、外部クロックソース(RTCクロック、GPS、NTPなど)を確実にボードに接続し、PJRCライブラリのSyncProviderとして使用してください。


2

平均的なシステムクロッククリスタルは、数十ppm(100万分の1)だけずれます。これらは、信号の安定した正確なタイミングには最適ですが、正確な時間を維持するには劇的です。特別な対策を講じないと、システムクリスタルは1日あたり数秒ずれることがあります。

解決策は、32768Hzの時計クリスタルとして一般に知られているものによって駆動される適切なリアルタイムクロックを使用することです。これらの水晶は精度が10倍も優れています。メインプロセッサに割り込む独自の発振器をセットアップしてArduinoスケッチでカウントを維持するか、RTCブレークアウトボードを見つけることができます。

検索語「RTCブレークアウト」でGoogleにポップアップ表示される2つのランダムな例:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.