Computer & RF Technology

GPSのPPS信号でOCXOの周波数を制御してGPSDOの実験をしてみる

GPSDOの試作ですが、OCXOを触ってみて感触がわかったので、いよいよ周波数制御をしてみます。もちろん制御はMCUからソフトウェアで行います。実際に制御をしてみることで、いくつか課題が明確になりました。

image

OCXO (Morion MV85)の周波数制御は、コントロールピンに0~5Vの電圧を与えることで行います。使用した個体は、0Vでおよそ9,999,996Hz、5Vで10,000,010Hzを発振出力するようです。ここに適切な電圧を与えれば10MHzちょうどに合わせ込むことができることになります。

この電圧をD/Aコンバータによって生成します。GPSのPPS信号を基準に、OCXOの周波数を測定をMCUで常時行い、10MHzとのずれを修正するようにフィードバック制御を行うわけです。

ここで問題になるのが電源電圧です。制御電圧は5V幅ですので、DACも5Vで動作させたいのです。もう一つの理由として、OCXOから温度制御された環境で生成された基準電圧(5V)が出ているので、これをDACにVrefとして供給します。Vrefに5Vを供給できるようにするには、DACも5Vで動作させる必要があります。一方、MCUの電源はGPSモジュールに合わせて3.3Vとしていました。

DACには、12bit I2C接続でSOT23-6パッケージで小型のMCP4726(Microchip)を使ってみました。秋月でも売っています。そして、間にI2CレベルコンバータPCA9306(TI)を挟んで5Vと3.3Vのインターフェースすることにしました。MCP4726はEEPROMを内蔵しているので、最後にセットした値が電源を切っても保存されるので、前回の設定値で制御電圧が出力されます。もしGPSによる制御ができなくとも、およそ正しく周波数を維持することが期待できます。

実装ですが、基板の設計時には、電圧の問題を見落としていた(MCUを5Vにするか3.3Vにするか未確定だった)ので、レベルコンバータ用のパターンがありません。またDAC用のパッケージサイズも間違ってレイアウトしていたので、基板上にチップを置き、既存のパターンを活用しながらウレタン線を使って配線しました。チップのピン間は0.8mmや0.65mm間隔なので余裕です。

image

肝心の周波数制御ですが、いくつか考慮すべきことがあります。

  • 平均化した観測値を使う必要があること
  • 1カウントの量子誤差があること
  • 制御電圧を短期的に揺らさないようにすること
  • 上記を満たした上で、できるだけ高速に収束すること

10MHz付近への制御が動作している場合、1秒毎に観測されるのは、ほとんどが10000000プラスマイナス1です。プラスマイナス1は量子誤差なのでどうしても消せません。10MHzに合わせるとは、プラス1とマイナス1の個数が短期的にも長期的にも安定してバランスさせるということが目標なります。このバランス状態を数百〜数千秒(30分から数時間)維持するよう制御するようにします。

収束の高速性と両立させるために、観測期間を2のベキ乗で変化させることとしました。まず1秒の観測期間でおおまかに周波数を合わせたら、続いて2秒、次は4秒8秒16秒と観測期間を倍々で延ばしながら周波数を合わせていきます。カウントは常時行っていますが、それを1PPSでサンプリングし、その差分値(すなわち周波数)の、10000000カウントからのずれ=周波数エラーを観測期間で累積(積分)していくようにします。この情報は周波数エラーの積分なので位相エラーです。

2のベキ乗の観測期間において、位相エラーがゼロになるよう、DACに与える設定値を増減します。観測期間が短い場合は、エラー値に係数を乗算、すなわちループゲインを上げて収束を早めます。さらに位相エラーの積分値もエラーに加えることで収束を早めています。観測期間が長くなれば係数を減らし、128秒以上の場合は設定値をプラスマイナス1に留めてゲインを下げ、じっくりと調整をするようにします。ループゲインはOCXOの制御電圧の感度(Hz/V)に依存するのと、挙動がちょっと複雑なのでループの安定性は明確に示すことができませんが、多分大丈夫です。とりあえず現物合わせで調整してみました。

カウント誤差についての配慮として、位相エラーがプラスマイナス1の場合は、DAC設定値を変更しません。位相エラーが2を越えたときにDACを変更するようにします。このように不感帯を設けることで、カウント誤差による振動を引き起こさないようにしています。

下のグラフが動作の様子です。横軸は秒、上の青線はDACの制御値、下の緑の三角波は制御期間のデクリメントカウンタです。デクリメント中は制御値を変更していません。およそ200秒くらいでおおよそ収束し、その後は分単位で微調整動作に入っています。収束した後は制御期間が倍々で伸びていくのが判ります。 image

このままずっと二日程動作させてみました。デクリメントカウンタの挙動はこんな感じになりました。最低でも1024秒(=16分位)、長い時は4096〜8192秒すなわち1~2.5時間程度の間、DACを修正せずに動作していることがわかります。途中で間隔が短くなっているいるのは周波数誤差の修正を行おうとした際に過修正で振動が生じ安定性が損なわれたことによります。 image

同期間におけるDAC設定値の変化です。 image

DAC設定値がプラマイ1で揺れているのがわかります。この時の周波数の観測値です(600秒の移動平均を2重に施している)。

image

プラマイ1のDAC設定値修正で、周波数がおよそ3mHzの幅で変動しており、これが過修正になって、その次の修正タイミングで戻るということを繰り返し、振動になっています。OCXOもしくはPPS信号のドリフトで周波数がわずかに揺れ動いており、これが位相エラーの不感帯を越えてしまうとフィードバックが掛かるのですが、修正所要量は1LSBに満たないので過修正になっています。DACの解像度による制約です。

酷いグラフに見えますが、振動の周期は最短でも16分、二日間全体で7mHzすなわち1ppb以下の幅ですので、そう酷いわけではありません。しかしもう少しじっと我慢させて落ち着いた動作をさせたいところで、もう一工夫必要なようです。

予想できていたいことではあるのですが、12bitのDACで可変幅全体を制御しようとすると解像度(レゾリューション)が足りていません。このOCXOは14Hz程度の可変幅を持っているので、12bitだと4096で割って1lsb当たりおよそ3mHz弱になります。DACの品種を代えてビット数を上げてもせいぜい16bitで高価でになります。それよりも、粗調整を別のDACもしくは手動調整のVRで行い、精密制御は1/10~1/50の感度でフィードバックするようにしたほうが良いかもしれません。

別途DOCXOについても試してみたのですが、ドリフトが大きく制御が追いつかない(感度が下がりすぎる)という状態です。やはり小さいOCXOよりも安定性が良くないようです。別なOCXOも入手して試してみたいと考えていますが、しばらくは結果の良好なこの小さいOCXOで試していこうと思います。

制御部分のソフトウェア実装についてですが、このような動作を小さなMCUで実現するのは正直厳しいです。本当なら制御電圧感度のキャリブレーション等も実現したいのですが、現時点でもメモリがキツいので記憶出来る容量が足りず、制御の方法が制約されています。現状は、10バイト程度のSRAM使用の割には、なかなか良い動作ができているとは思っています。参考に制御部分の抜粋を示します。(あくまで現行のセッティング向けの試行錯誤の結果です)

こんな感じでGPSによるOCXOの調律は、なんとか動作させることができました。課題として、

  • DACの解像度不足
  • 10MHz出力バッファ

がありますが、次回は、もうちょっとリッチなMCUを使って、改良を目指したいと考えています。できればOCXOの各品種に対応できるよう、制御電圧感度のキャリブレーションもやりたいと思っています。

それから現状ではカウンタ値を使用しているので、制御の仕方としてはFLL(Frequency Lock Loop)となっています。できれば位相も制御してPLLとしてみたいのです。ただ、PPS信号と10MHzでは周波数比が大きいのと、PPS信号のジッタもあるので難しいかもしれません。実はあるものを位相比較器として使えないかアイデアがあり試してみたいと思っています。次回の試作時に盛り込みたいと考えています。10MHz同士の比較であればDMTD(Dual Mixer Time Difference)法など精密な方法が工夫されているところを興味深く見ています。

リファレンス

comments powered by Disqus