正確に31,891,269,116 µHzで動作する小さな発振器を取得するにはどうすればよいですか?


15

火星で実行されるArduino用のRTCモジュールを構築したいと考えています。換算係数は、1.0274912510地球秒から1火星秒です。

通常のRTCモジュールに接続されたArduino Unoで固定小数点演算を使用して、2秒未満の解像度でプログラムでこれを達成することができましたが(正確には理想的ではありませんが、300ミリ秒の精度が望ましいです)、私は正確に31,891,269,116 µHz(31.891269116 kHz)で動作する何らかの種類の低電圧発振器を使用することが可能かどうか疑問に思います。それらが法外に高価でない限り)

これがどのように可能性があるのでしょうか?あるいは、1.0274912510秒ごとに1回オフになるタイマーの種類も受け入れられます。


13
なぜ奇妙な単位(µHz?)は31.891 kHzです。したがって、おそらく32kHzの時計用クリスタルをお探しでしょう。
JRE

21
要件から始めます。並外れた精度を指定しました。どうして?他の場所では、Arduinoでやりたいことができると言っています。申し訳ありませんが、ルビジウムやセシウムの時計などを基準として使用しているのでない限り、あなたは冗談を言っています。そのため、何をしているか、パフォーマンス要件は何かを教えてください。これは機能的な要件であり、派生したパフォーマンスではありません。他のユーザーにロックされているクロックを作成しようとしている場合は、その旨を伝え、要件(および許容範囲)をお知らせください。
-WhatRoughBeast

46
プログラミングスキルの不足を非常に高価なカスタムハードウェアで解決しようとしています。Arduinoで256ビットの浮動小数点変換を簡単に実装できます。
パイプ

14
これは、より多くの情報を事前に含めることで、人々があなたを正しい方向に向けることができる理由の良い例だと思います。ブライアンドラモンドの答えは今では最高のものであり、少なくともアマチュアにとっては安くて実現可能です。また、精度と正確さを指定するときに注意する必要がある理由の良い例です-クロックに潜在的に関連する多くのパラメーターがあります。温度補償やジッタについてはまだ説明していません。
pjc50

11
「変換係数は、地球の秒から1火星の秒までの1.0274912510です。」-火星と地球の1日の長さの違いを1秒の長さと混同していますか?火星の1日長さは88 775秒、つまり1.02749地球日(86 400秒)です。もう1つは、セシウム原子から放出される放射によって定義され、時間の膨張を考慮しても、その2.7%の差を得るには約0.23 cの速度が必要です。
-ilkkachu

回答:


41

他の人と同じように32768kHzの水晶を使用しますが、代わりに33669で除算し、-5.08ppmの誤差を与えます。(必要に応じて、負荷容量を調整することで削除できます)。

正確ではありませんが、火星の時計の場合、地球のクォーツ時計と同じくらい良いでしょう。つまり、火星の周囲温度の温度補償の問題を無視すると、火星のサプライヤーを見つけることができない限り、ほとんどの時計の水晶は地球での使用にのみ利用できます...

MSP430のカウンタータイマー周辺機器を使用して除算を行い、(標準のクォーツ機械式時計ムーブメントを駆動していると仮定して)出力ピンに毎秒、双極30msパルスを生成します。オシロスコープで測定します。

Arduinoなどが仕事をしますが、MSPはパルス間でスリープ状態になり、LF発振器が動作して1uA未満を消費します。以下に、時計のソースコードとPCBを使用したサンプルデザイン示します。これまでは地球時間のみですが、おそらく定数を変更することで修正できます。


1
ありがとうございました!他のフィードバックに基づいて、これは原子時計の領域を掘り下げる必要がない最も実行可能なオプションのように見えるので、私の質問の解決策として選択しました。また、リンクされたデザインに特に感謝しています。
改宗者

あなたが与えた重要な数字は、標準のRTCクリスタルでは満たされないことに注意してください。計算による5ppmの誤差は、水晶の許容誤差よりも小さい可能性があります。
user2943160

6
@ user2943160優れたリファレンスがある場合、最初のトリミングで1ppm程度に達する可能性があります-数年間で数ppmのドリフトがあり、(奇妙なことにフォーククリスタルのチューニングのために)温度による放物線の変動があります。私の家にあるすべての安価なクォーツ時計は、異なるレートで使用されます。おそらく工場で調整されることはなく、温度補償された振り子時計よりもずっと良いものではありません。
ブライアンドラモンド

「火星の供給者」のためだけに+1。
オリンラスロップ

41

ブライアンドラモンドの提案よりも良い結果が得られます。オシレーターがシステムの最大のエラー源であることは事実かもしれませんが、それほど簡単ではない場合にシステムエラーを追加する理由はありません。

タイマー間隔を33668ティックに設定し、カウンターを0から開始し、タイマー割り込みごとにカウンターを6754ずつ増やします。

インクリメント後、カウンタが8105以上の場合、8105を減算し、次の秒のタイマー間隔を33669ティックに設定します。

それ以外の場合は、カウンタをそのままにして、次の秒のタイマー間隔を33668に設定します。

これにより、(完璧な32.768kHzの水晶を想定して)平均間隔が

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

1.0274963378906秒(ほぼ5百万分の1のエラー)の代わりに、秒(1.0274912510と比較して1兆分の1のエラー未満)。これは、クロックの長期的な精度が発振器の精度に本当に依存することを意味します。数学に起因するエラーは、1年に実質的に1ティック未満のエラーに寄与します。1秒の長さには最大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のルビジウムまたはその他の原子基準クロック、おそらく100MHzを与えるPLLなどで実行でき、その後、〜36ビットの位相アキュムレータでカウントして0.001Hzの分解能を得ることができます。後者は小さなFPGAで実行できます。

ダイレクトデジタル合成(DDS)の方法を読むことができます。DDSを実行するチップがありますが、ビット幅がそれほど広くない場合があります。

ルビジウム時計モジュールは、余剰市場で、またはMicrosemiなどのメーカーから入手できます。


7

あなたは「高価な」と定義しないので、これは暗闇でのショットのようなものです。

市販の(eBayを含む)10 MHzジェネレーターから始めます。選択のためのルビジウム、しかしあなたが得ることができるどんな精度でもあなたのパフォーマンスを設定します。

次に、28ビット長のプログラム可能な分周器を構築します。10 MHzでは74HC CMOSロジックを使用できますが、高速キャリー構成を使用する必要があります。出力は、ビット29を提供する2つのフリップフロップによる除算もトリガーします。

分周器は、ビット29の状態に応じて10,274,912または10,274,913の比率で実行できます。完全な10 MHz入力の場合、ビット28の有効出力期間は1.02749125秒になり、1 ppbまたは約30にほぼ正確です。ミリ秒/年 もちろん、入力の精度が低いと、出力の精度が低くなります。

湿地標準の74HC161を使用すると、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をざっと見てみると、20ドル未満で多数の10 MHz OCXOが表示されています。これらは通常1 ppb以上の安定性を持ち、0.2 ppbはかなり一般的な仕様です。これらのいずれかを取得し、あなたは良い状態である必要があります。実際の出力周波数を決定するためにかなり高い解像度の周波数/周期メーターを借りて、それから分周比を調整して一致させたいと思うでしょう。


同意し、OCXOがパワーバジェットに含まれていなくても、TCXOは時計の結晶を改善することができます。
ホッブズ

4

101110141011

106

「フラクションNシンセ」タイプのPLLを使用して、一部のGPSユニットから10Mhzなどの基準の比率を導き出します。

TCXOオシレーターの安定性が1ppmの場合、1ppsまたは1.0274912510 Hzから2.07%のオフセットではなく、これよりも少しだけ調整することができるため、フラクショナルNチップのPLLはこれを行う1つの方法ですVC-OCXOまたは機械式キャップ調整OCXO。

追加 -MAR時間で1ppsを生成するには、分周比は5桁の整数と5桁の剰余を使用して26,337.44856です。

  • Xtalを0.01 ppmに調整できる場合、Tempcoは通常MEMではない一部のXTALSの体温付近で通常は30°Cでマイクロオーブンを作成しない限り、通常1ppmにしか安定しません。Vccとtempが0.1℃以内で一定でない限り、0.01 ppmを超える残留誤差を補正しようとすることは不可能です。

  • したがって、理論的には、1ppmの地球時間を調整するためにGPSから較正された1ppmのク​​ロックがあった場合、残留を補正するより良い精度を期待することは不可能です。

  • 1秒あたりの分周器の残留誤差値。44856/100000(+26,337)

  • 44856をバイナリに変換= 1010111100111000
  • / 44856と45857を切り替えるには、残基カウンターが必要です。

  • この剰余除算を行うには、2進剰余数を8ビットに切り捨ててから、MSBがLSBになるようにビットを回転させます。

  • 10101111は11110101になります

  • 毎秒11110101からの剰余カウンター。各「n」ビット位置= 1は、バイナリn ^ 2のカウント値です。ここで、分周整数比は44856ではなく45857です。LSB= 1であるため、2番目のカウントごとにトグル101秒後、次の1ppsカウントで分周器の選択が切り替わります。これを繰り返して、次の秒に使用する分周器を選択し、ポインターが最後に到達して次の1pps地球時計を待つまでポインターをインクリメントします。

  • このプロセスは、この回転された2進剰余のカウント全体または10101111> 11110101 = 245秒繰り返され、1秒ごとに火星時間の分数Nシンセ分割器が作成され、245秒サイクルごとに修正されて時間どおりになります。長期。

-おそらく、クロックの浮動小数点分周比はより簡単です。


2

これは、ハードウェアをまったく変更せずに(より安定した基準周波数が必要な場合があります)、バイナリ分数を使用して、ソフトウェアでこれをかなり簡単に解決できます。原子時計など、参照可能なソースの基本的な正確さを確認できるほどの十分な累積変換エラー。

タイマー割り込みを修正して非常に幅の広いレジスタに蓄積し、割り込みごとに、地球のミリ秒と「火星のミリ秒」の比率を正確に表すかなり長い値を追加します。

引数のために、変換に32ビットの解像度が必要だとしましょう。64ビットアキュムレータを使用できます。下位32ビットは小数部を表し、変換係数を表す2 ^ 32よりわずかに小さい適切な値を計算します。地球のミリ秒割り込みが発生するたびに、この値をアキュムレーターに追加します。クロックを照会する場合は常に、上位32ビットを返します。これは経過したMarsミリ秒全体の数ですが、下位32ビットは丸めエラーを避けるために内部的にのみ保持されます。

このような長いバイナリ分数を使用すると、必要な精度で変換を実行できます。ほとんどの場合、32ビットは小数部では長すぎますが、ミリ秒全体では32ビットでは短すぎますが、必要に応じて調整できます。

ちなみに、長いレジスタに蓄積するが、いくつかの最上位ビットのみを報告するこの手法は、直接デジタル合成が非常に高い周波数分解能を生成する方法です。

また、分周器の比率を8または16 MHzシステムクロックからミリ秒割り込みに変更し、「火星ミリ秒」の間隔に近づけることにより、変換の一部を行うことも検討できます。特に、安価なクリスタルよりも正確なものが必要な場合は、GPSで制御された通常の10 MHz基準または原子時計で直接処理するため、通常のAVR 8/16 MHzクロックソースの代わりに使用して再計算できますそれに応じて分周比。


0

直接デジタル合成(DDS)または数値制御発振器のアプローチは、クロック周波数に依存せずに出力周波数の任意のレベルの分解能を得るための非常に簡単な方法です。

このアプローチでは、高分解能の位相アキュムレーターがあります。あなたの周りのすべてのループは、高精度の位相増分を追加します。出力はアキュムレータの最上位ビットです。

これを使用して方形波を生成する場合、エッジは入力クロック(またはソフトウェアループレート)によってのみ変化するため、エッジジッターは本来あるべきところからジッターしますが、時間の経過とともに累積エラーは発生しません。あなたが望むように高い。

ソフトウェアで簡単に実行でき(AVRなど)、一部のマイクロはNCOハードウェアを搭載しています。http://ww1.microchip.com/downloads/en/AppNotes/90003131A.pdf 小さなPICは、32ビットxtal、または正確な10 MHzオーブンから、20ビット(1 ppm)解像度のハードウェアでこれを行うことができます。


0

希望の周波数の整数倍で動作するオーブン付きのカスタム水晶振動子を取得してください。標準の周波数よりもはるかに高価ではありません。ウェブ検索「カスタムクオーツクリスタル」

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