前回の更新から少し時間が経ってしまいましたが、皆さんがAliExpressに注文された部品達もそろそろ届く頃ではないでしょうか(笑)
ひょっとすると作って見たいと思われている方もいらっしゃるかも知れませんので、今回は、GPSDOの方式について簡単に説明したいと思います。なお、uHzと記載しているのは10-6Hz(1μHz)です。
まずは、GPSDOの実力をご紹介しておきましょう。動画を見るにはここをクリック
iPhoneで撮影し、アップしましたのでHEVCフォーマットになってしまっているようです。再生できない場合は、別の動画をYouTubeにもアップしましたのでそちらをご覧ください。
きちんと校正された基準信号を所有していないので、周波数の正確さは目安としてください。周波数カウンタHP(Agilent) 53132A にはダブルオーブンのOCXO(HP 10811)を使用しました。ルビジウム発振器も所有していますが、短期安定性はこのOCXOには劣るようです。安定性を評価するのであればAllan Deviation を示すべきでしょうが、それを評価できる基準信号を所有していないため、また実際の周波数変動のイメージを掴んでみていただくにも動画が良いかと考えました。長時間の動画をアップ出来なかったため約25秒間の動画になっています。長時間観察すると実際にはもう少し変動しています。
周波数カウンタ53132Aで統計処理した ゲート時間 2.0秒、n=100の結果です。
この時は、Max -Min = 60uHz, STD Dev = 26.5uHzでした。(モアレが出ていてすみません)
このGPSDOの基本ブロック図と基本回路図は以前ご紹介した通りです。
主要部品
以前の記事と重複する部分もありますが、主要部品について簡単に説明します。図を用意しようと思ったのですが時間がなく(いいえ怠慢です)文字ばかりの記事になってしまいました。
- マイコンは、STM32F411CEU6を搭載したマイコンボードを使用。主な選択理由は…以下の通りです。
- 外部からOCXOの10MHzを入力し、内蔵PLLにより10逓倍しシステムクロック100MHzとして使用でき、タイマーも100MHzで動作する。
これにより複雑な外部回路を使用せずに周波数計測の性能を10倍にする事が可能、そして内部計算も10倍にするだけなのでデバッグ時にわかりやすい。
マイコン基板に載っている25MHzのX’talを外し、代わりにOCXOの10MHzを波形整形して入力する。 - 32bitタイマーを内蔵している。
タイマーを100MHzクロックで使用した場合、16ビットタイマーだと頻繁にオーバーフローが発生し処理が追いつかない。
32bitであればオーバーフロー間隔を約42.9秒毎にまで改善できる。16bitタイマーをカスケードに接続しても行けそうだが、レジスタを2つ読み出さなければならないので面倒。 - I2S I/Fを内蔵している。
I2Cで制御できるDACは分解能12bit程度であり、若干性能が足りない。オーディオ用 DACであれば、16bit以上のハイビットDACが容易に入手できる。ただし、I2Sで制御する事が必要。
- 外部からOCXOの10MHzを入力し、内蔵PLLにより10逓倍しシステムクロック100MHzとして使用でき、タイマーも100MHzで動作する。
- OCXOは、Morion MV89Aを使用。
1mHz以下を制御するには1000秒間以上1mHz以下の変動で安定して動作する事が必要です。
MV89Aは比較的容易に入手できるOCXOの中では優れた性能を有しています。
このGPSDOではOCXOの選択が性能を左右する事になります。EFC電圧を上昇させると周波数が上昇するOCXOが使えます。 - GPSモジュールは、中国のIcofchina /杭州中科微电子有限公司 のATGM332Dまたは、ATGM336Hを使用。
他にもU-Blox M8N, MediaTek MT3333など9600bpsで一般的なNMEAを出力し、1PPS出力があるモジュールであれば使用可能です。1PPSは立ち上がりエッジ基準です。
秋月電子で販売されているMT3333を使ったモジュールは中にインバーターが入っていて立ち下がりエッジ基準になっていますので。インバーターで反転させます。
GPSDOにはATGM332D,ATGM336Hが適しているように思います。最新のモジュールでも試してみたいですね。
このGPSDOに使う場合、GPSDOのプログラムによりNMEAの出力が制限されます。また、GLONASを使うようにすると精度が落ちるという情報も見かけましたので、GLONASを無効にします。復帰させるには、バッテリーを抜いて放電させるか、リセットさせる必要がありますのでご注意ください。 - OCXOの電圧を制御するためのDACは、Bur-Brown PCM5102Aを使用。
16bitでは若干分解能が足りないため、19ビットで使用しています。(正確には20ビットの正側のみ使用)
OCXOの周波数制御端子(EFC)電圧が約2.8V以下で10MHzに調整できるのであればDAC直結で使用できます。その場合はL-chを使用します。
0Vから約2.8Vの範囲で10MHzに調整できないOCXOを使う場合は、R-chから1Vのオフセット電圧を出力していますので、回路図通りにOP-AMPを通してください。これにより、FECは約1Vから約3.8Vの範囲で制御できます。
周波数計測
- GPSDOの精度は周波数を如何に正確に計測するかが重要です。周波数計測が不安定だと正確な10MHzを得ることはできません。
- OCXOの発振周波数は、マイコン内部のPLLにより10倍の100MHzに逓倍され,、システムクロックと32ビットタイマーのカウントクロックになります。
つまり、タイマーの分解能は10nsです。タイマーはフリーランでカウントします。32ビットタイマーなので、約42.9秒毎にオーバーフローが発生しますが、オーバーフローの回数はカウントせず、カウント値の計算の時に補正します。 - GPSモジュールから出力される1PPS信号を正確な1秒と見做し「基準1Hz」とします。1PPSの立ち上がりエッジのタイミングでタイマーカウント値を保持します。タイマーのインプットキャプチャー機能を利用します。ブロック図のIC1です。
- 一方、タイマーのクロック100MHzを分周して1Hzのパルスを生成します。これはOCXOの10MHzを分周し1Hzにしたものと同等です。(厳密にはPLLでのジッターが付加されていますが)
この1Hzパルスを「比較1Hz」としてタイマーのインプットキャプチャーにより「基準1Hz」のIC1と同様に立ち上がりエッジのタイミングでタイマーカウント値を保持します。ブロック図のIC2です。
よく考えてみると「比較1Hz」をわざわざインプットキャプチャーに入れなくても良い事に気がつきましたが、もう作ってしまったのでこのまま行きます(笑)。 - インプットキャプチャーした結果はDMAによりバッファーに転送し、規定時間バッファリングした後に一括処理します。処理は簡単になりますがRAMを消費する作りとなってしまいました(笑)
- 周波数の計測方法は2種類を用意しました。
- FLL(Frequency Lock Loop) 「基準1Hz」のn番目、n+1番目のタイマーカウント値をCn, Cn+1とすると、
周波数fosc[Hz] = 100E6/(Cn+1 -Cn) になります。Cn+1 -Cn = 1E8となるようにEFCを可変します。
カウントによるサンプリングエラーを無視すれば、1秒間隔では1E-8の精度まで調整できた事になります。10MHzに換算すると0.1Hzまで合った事になります。
カウント間隔(ゲート期間)をm[秒]に伸ばすと、fosc[Hz] = m*100E6/(Cn+m – Cn) になり、周波数のカウント精度がm倍に向上する事がわかります。
10MHzに対し、1mHzを制御するには 最低でも100秒が必要になります。カウントのサンプリングエラーを考慮すると間隔を1000秒まで伸ばせば略1mHzの精度は確保できる事になります。直接10MHzをカウントするのに比べ、計算上は同じゲート期間で10倍の精度が得られます。
周波数を計測し周波数を目標値に合わせる事からFLL(Frequency Lock Loop)と呼ばれています。 - PLL(Phase Lock Loop) 「基準1Hz」と「比較1Hz」の周波数(周期)が完全に一致した場合は、「基準1Hz」のインプットキャプチャカウント値 Cref と「比較1Hz」Cf の差 Cdiff = Cref – Cf は時間が経過しても変化しない事になります。
Cdiffは「基準1Hz」と「比較1Hz」の位相です。つまり、「時間経過により位相が変化しない」=「位相(Phase)がロック(Lock)した状態」です。この状態になるように制御するのがPLLです。
一般的なPLLではロックすると基準信号と比較信号の位相差は位相比較器により決まった値に収束します。例えば、位相比較器に74HC86のようなXORを使用した場合は、位相が90度ずれた位置に収束します。(「基準1Hz」、「比較1Hz」のDutyが共に50%の場合) 余談ですが、XORを使用する場合は比較信号の周波数は基準信号の周波数に近づけておかないとうまくロックしません。周波数も引き込む必要がある場合は、4046に内蔵されているような周波数位相比較器を使う事になります。
74HC4046に内蔵されているような位相比較器ではエッジが一致するように制御されます。(74HC4046には2種類の位相比較器があります) 今回のGPSDOでは、位相をある値に収束させることはしていません。時間経過により位相が変化しないようにEFCを制御していますので、そういう意味ではH/W方式のPLLとは動作が異なります。
これは、位相制御すると計測に時間がかかり、また、位相差の分解能がタイマークロックにより制限されるため、マイコン方式では制御が難しいと考えたからです。実際には「基準1Hz」もジッターがあるためFECの制御が振られる恐れもあります。外部で回路を追加すればPPSとエッジを揃える事は可能ですが、そこまでの必要はないと考えています。時刻に同期したPPS信号が必要な場合を考え、GPSモジュールからのPPS信号はそのまま出力しています。 - 「基準1Hz」と「比較1Hz」のカウント値の差=位相差です。
これを1秒毎に計測して回帰分析により位相変化を検出します。
即ち、単(一次)回帰 y = ax +b に近似した場合の 傾き a (即ち位相変化率/秒)を求めます。
(OCXOが安定しており、計測期間中の周波数変動がないことを前提にしています)- 周波数が一致した場合
位相差は一定で、時間がたっても変化しません。つまり、a = 0です。
また、相関係数も小さくなります。 - 「基準1Hz」より「比較1Hz」の周波数が高い場合
位相差は時間とともにマイナス方向に変化します。 つまり、a < 0です。
また、相関係数は大きくなります。 - 「基準1Hz」より「比較1Hz」の周波数が低い場合
位相差は時間とともにプラス方向に変化します。つまり、a > 0です。
また、相関係数は大きくなります。 - 計測期間の途中で「比較1Hz」が変化した場合は、一次関数には回帰できないため相関係数が小さくなります。
- 位相変化の傾きaにより「基準1Hz」に対する「比較1Hz」の周波数誤差を求めることができます。これにより算出した周波数を「推定周波数」として表示しています。
単純にクロック数をカウントして周波数を計測する方式より少し周波数の分解能を上げることができます。これにより計算上10uHzまで表示しています。(保証値ではありません)
なお、この「推定周波数」は当然ながら一つ前の計測期間の周波数なので注意が必要です。 - 考えたときは「なかなか良いアイデア」と思ったのですが、実は先人達が既に考案されていて(当然ですな)、GPSDOとして有名なZ3801Aなども同じ方式が使われているようです。30年遅れでした。逆に考えると特許も切れている?
上記の説明は、旧HPの資料HP SmartClock Technology Application Note 1279を見ていただくとより理解できると思います。 - 位相変化のトレンドはシアンの線のような感じになりました。
この写真は「比較1Hz」(C3:シアン)の立ち下がりでトリガーをかけてGPSモジュールからの1PPS「基準1Hz」(C1:黄色)の立ち上がりとの時間をトレンドとして表示したものです。
C4:緑はOCXOの10MHz波形です。実際には、この10MHzがマイコン内部回路の基準となりますが、波形を見やすくするためにオシロスコープのトリガーはこの10MHzをマイコンのタイマーにより分周した「比較1Hz」で掛けています。
若干右上がりのトレンドになっています。この傾きは「比較1Hz」と「基準1Hz」との位相の時間変化、即ち周波数偏差を示しています。この傾きがゼロ、即ち水平になれば「比較1Hz」の周波数が「基準1Hz」と一致している状態、つまり正確な1Hzである事になります。そして「比較1Hz」はOCXOの10MHzを分周して作っているので、OCXOは正確な10.0MHzを出力している事になります。
線に幅があるのは1PPS信号のジッターによるものです。
途中ピーク(山、谷)があるのはGPS信号影響かGPS受信機の性能か、はたまた室温変化によるOCXOの周波数変化によるものでしょうか。実は、マウスカーソルがある辺りでエアコンをつけたのです。でも、その前(左側)にある山はエアコンをつける前ですので、原因がはっきりしていません。これはルビジウムなど、もう少し温度変化に強い発振を使って比較してみる必要がありそうです。これを見れば1PPS信号を短時間観測しただけでは正確な周波数に合わせるのは難しそうであることが分かります。もし、GPSからの伝搬やGPSモジュールに起因するものである場合、実際にはOCXOの周波数は動いていないのかも知れません。そのような状態で周波数を調整してしまうと正しい周波数からずらしてしまう事になります。
このデータから、少なくとも1000秒程度はトレンドを見て周波数の偏差を判断した方が良いだろうということが分かります。
「比較1Hz」(C3:シアン)は「OCXO 10MHz」(C4:緑)から生成されたものですが、マイコン内部のPLLにより一旦100MHzに逓倍し、それを1Hzまでに分周しているため内部回路によるジッタが付加されています。ジッタのほとんどはPLL回路によるものと考えられます。このジッタの分C4:緑のトレースが太く見えています。(実際にジッタが付加されているのは1Hz信号です) PLLによるジッタが性能に影響しないか心配しましたが、「基準1Hz」(C1:黄色)の変動に比べると十分に小さいため、時間軸方向での積分(≒平均化)を行えば性能への影響はほとんどないと考えれます。
- 周波数が一致した場合
- このGPSDOでは、FLLである程度周波数を合わせこみ、その後PLLに切り替えるハイブリッド方式としました。
GPSDOの自作例を見ると単一のFLL方式やPLL方式が多いようで、私のようなハイブリッド方式はあまり見かけません。また、PLL方式では外部に74HC4046のようなH/W位相比較器を用いたものが多いようで、このGPSDOのようにマイコンのインプットキャプチャーを利用したものは少数だと思います。(マイコンのインプットキャプチャもH/Wと言えばそうなんですが) また、この方式はアナログ的な要素が少ないため、比較的再現性は良いと思います。
- FLL(Frequency Lock Loop) 「基準1Hz」のn番目、n+1番目のタイマーカウント値をCn, Cn+1とすると、
- PPS信号のジッター影響
「基準1Hz」と書いていますが、前に書いたように実際にはGPSモジュールからのPPSには様々な要因により揺らぎ(ジッター)が発生しています。これは、実際にGPSDOを作って見ると分かりますが非常に厄介な課題です。これも回帰分析によりある程度吸収することができます。
(他の処理も併用しています)
この写真は、マイコンから出力している「比較1Hz」(CH3)の立ち下がりをトリガーにして、OCXO 10MHz(CH4)、GPSモジュールからのPPS出力「基準 1Hz」(CH1)をオシロスコープで10分間観測した波形です。輝線がズレたり太くなっているのはジッターによる位相の揺らぎを現しています。
「比較1Hz」は、OCXO 10MHzをマイコン内部のPLLで10逓倍したものを基準にしていますので、実際はOCXOの輝線の幅 約4nsはマイコン内部で付加されたジッターに相当すると考えられます。
一方、基準であるはずのGPSモジュールからのPPS出力は、約60nsのジッター(揺らぎ)がありました。観測していると、ほとんどは20ns程度の幅でランダムに数ns動いているのですが、時々10ns〜20nsぐらい位相がジャンプする場合があります。H/W方式のPLLではこのような「位相ジャンプ」にも追従してしまい結果的に周波数が変動することになります。10ns = 1E-8nsですので、10MHzに換算すると100mHzに相当します。PLLの応答を遅くすれば周波数変化をある程度穏やかにすることはできますが、やはり周波数変動は残ってしまうでしょう。S/W制御であれば、このノイズをうまく処理することにより大幅に改善することが可能です。また、マイコン内蔵のPLLにより付加されるジッターはPPS信号のジッターに比べて小さくランダムとみなせるので、長時間の積分(1秒毎の取り込み回数を増やす)により影響を抑えることができると考えられます。
写真のような大ジャンプは捕まえられませんでしたが、PPSのジッターを観察した動画をYouTubeにアップしました。
周波数補正制御
- 測定した周波数を目標の10.000000MHzに合わせるために、OCXOのEFC電圧を可変し、目標周波数と現在の周波数の差(周波数偏差)がゼロになるようにフィードバック制御します。一般的には、PID制御が使用されます。
しかし、周波数計測の項目で説明した通り、GPSモジュールからの1PPS信号にも揺らぎやジッターがあるため、正確な周波数偏差を求めるのはなかなか難しく、PID制御の場合周波数偏差によりフィードバック量を制御するため、この偏差の精度が周波数精度と安定度に影響します。もちろん、フィードバックゲインを下げて十分に時間をかければ目標値に収束しますが、この偏差の計測誤差は特に周波数変動の要因となると考えました。多分、数mHz程度の安定度で良いのであれば、PID制御が適切だろうとは思います。 - このGPSDOの周波数制御は、目標周波数との偏差をフィードバックするのではなく、現在の周波数が目標より高いか低いかだけを判断し、EFCの補正量を可変する制御を行う事にしました。また、位相検出による周波数測定だけではなく、パルスカウントによる周波数計測も行い、制御安定後の変動を抑えるようにしています。つまり、位相、パルス両方の周波数計測で周波数が同じ方向にずれていると判断した時のみ周波数補正を行います。PLLとFLLのハイブリッドです。
- 理想的には、周波数制御が安定した後は、周波数計測値が目標より高い、低いを交互に繰り返すことになります。
実際にはGPSのPPS出力、発振器のドリフトなどの要因があり、そう簡単には行きませんが…
十分に安定した場合(周波数計測値が目標より高い、低いを交互に繰り返す状態)は、GPSの1PPS信号が変動してもEFCはさほど変化しないのでPID制御よりは周波数の変動は少ないのではないかと思います。(実際に試したわけではありませんので、予想ですが)
ここまで読んでいただき、それでも作って見たいと思われている方のために、マイコンのオブジェクトをおいておきます。時刻表示はUTC+9でJSTとしています。
もし他のタイムゾーンのオブジェクトが必要でしたらコメント欄にコメントください。オブジェクトはST-LinkV2やV3を使ってSTM32CubeProgrammerで書き込むことができます。(elf,hexお好きな方でどうぞ)
製作に最低限必要な機材は、一般的な工具に加えて、PC(Macでも可)、STM32用の書き込みツールST-LINKV2(V3 set)、テスターです。
ユニバーサル基板を使用するので、配線間違いなどをチェックするのにできればオシロスコープ(10MHzの波形が見れれば十分)があると便利です。
12V電源はなるべくノイズが少ないものを使用してください。
基本回路図では内部電源に3端子レギュレータを使用していますが、こちらもなるべくノイズが少ないものに変更されるのをおすすめします。
使用するSTM32F411CEU6(Black Pill)は、基板上の25MHz発振子を取り外す必要があります。いったん取り外すと元に戻すのは難しいです。覚悟がある方のみチャレンジしてください(笑)
STM32F411CEU6_GPSDO_V2.elf
STM32F411CEU6_GPSDO_V2.hex
<利用の条件等>
- 本GPSDOの回路図、プログラム オブジェクト等は、無保証で提供します。全て使用者の自己責任で利用してください。本ブログに掲載している全てに関連して発生した(直接的、間接的を問わず)いかなるトラブル、損害、傷害等に対しても当方は一切の責任を負いません。
- 本ブログの記事、回路図およびプログラムオブジェクトは、正確性および、正常に動作する事を保証するものではありません。
- 本ブログの記事、回路図およびプログラムオブジェクト等に関連する一切の事項について誤りがあった場合でも修正する義務を負いません。また、予告なく仕様および設計を変更する事があります。
- 電子回路やSTM32マイコンに関するプログラムの書き込みなどの基本的な知識をお持ちの方を対象にしています。質問等は本ブログのコメント欄、またはhonkytonk.jp[at]gmail.com宛にお願いします。
- 有償、無償に関わらず、本プログラムオブジェクト、および本ブログ記事の転載/再配布/頒布を一切禁止します。現時点ではプログラムソースコード開示の予定はありません。また、著作権は放棄していません。リンクは自由です。
細かい事を書いていますが、ブログの内容は随時アップデートしていますので、情報やオブジェクトのバージョンを一つにしたいためです。
個人使用、個人以外でも実験目的であれば試していただくのは自由です。ぜひ、追試/評価をお願いします。
もし、このGPSDOを作られた方は、評価結果や感想などを教えていただければ嬉しいです。
解説ありがとうございました。
今日の夕方雷雨により停電し、一度落ちてしまい変な動作になっていましたが、電源の入れなおしで復活しました。
安定までまた一週間くらいかかるでしょう(笑)
コメントありがとうございます。本ブログでの初めてのコメントです!(SPAMはたくさん来るのですが)
春の嵐すごかったようですね。こちらも昨夜は雷がひどかったです。
ルビジウムでもGPSDOを作って見たくなりました。