回路と制御方法はだいたい決めたのでそのへんを書いておく
VFC をどうコントロールするか
OCXO がいくら安定しているといっても、それはVFC(Voltage Frequency Control)次第で、短期的にはこれが十分に安定していなければいけない。
手元の OCXO (MORION MV102) は Uref と呼ばれる端子から 5V の基準電圧 (OCXO 内で安定化された電圧源) が出ており、これを使って VFC へ入力する電圧を生成するようになっている。VFC は 0〜5Vの範囲で ±5Hz ぐらいの調整ができ、約2.5V付近で10MHzになる。
PWM + ローパスフィルタ
最初は MCU 内蔵の 16bit PWM をローパスフィルタにかける方法を試していた。やることは簡単で、PWM の出力でFETを駆動してレベルシフトしつつ一定の範囲に調整して、その結果をサレンキー型のアクティブローパスフィルタ(1倍)に通すというもの。
これでいいはずなんだけど、部品点数が増え、誤差の扱いがよくわからなくなるのでかえって難しく、やめてしまった。ちゃんとシミュレーションすれば、これで十分な結果は出せるはずだとは思う。特にレベルシフトに使う FET のオン抵抗温度特性がよくわからなかった。
現在の回路
(この回路図に出力フィルタは含んでいない)
12bit DAC
DAC だとスペックが決まっているので、誤差に対する考えかたはいくぶん簡単になる。ただ、抵抗ラダー型のDACは性質上リニアリティに劣るのと、12bit ぐらいまでしか気軽に手に入らないので出力可変範囲が狭くなる。
2.5V±0.25V (0.5V範囲) ぐらいを可変するように抵抗分圧回路を設計して、この範囲を12bitで調整する。つまり 0.12mV/count。手元のOCXOは2Hz/Vなので、結果として0.24mHz 単位で調整できるようになる。
今回使うのは、MCP4725。温度特性は Offset Error Drift が ±1ppm/℃、Gain Error Drift が -3ppm/℃。出力は 0〜5Vの範囲で、これを0.5Vの範囲に圧縮しているので、Offset Error Drift は ±0.00000024mHz/℃ Gain Error Drift は -0.00000072mHz/℃ となり、ほぼ無視できる。
1PPS の精度と確度
GNSSモジュールの 1PPS の UTC に対する精度はスペック上、99% で ±60ns (60e-9) と書いてあった。これは1秒あたりのジッタなので、10秒なら 6e-9 100秒で6e-10(0.6ppb)になる。
10MHz をカウントする場合は100秒で±6mHz、1000秒で±0.6mHzの確度があることになる。
以下で書くように周波数カウントの確度のほうが低いので、こちらは無視できる (はず)。
周波数カウントの確度
ゲート時間1秒だと、周波数測定確度が1Hz単位しかない。ゲート時間を徐々に長くしていき、ゲート時間1000秒で1mHzの確度(1e-10 = 0.1ppb)が得られる。
±1カウント誤差(量子化誤差)があるため、±1のカウント誤差は無視し、±2以上の誤差が発生したら補正をかけるようにする。この積分時間には特に上限を設けず時間に応じて補正値を計算する。
OCXOの温度安定性
スペック上、使っているOCXOの温度安定性は最大±2e-10 (-55〜80℃) (0.2ppb)。温度変化で最大2mHzは変化する可能性がある。この温度範囲でこの変化量なのでかなり変動は少ない。
↑のスペックは一番良いモデルの場合のようで、一番下のモデルだと(手元のがどのモデルか不明なので)、±5e-9 (0〜55℃) のようだ。つまりこの範囲で50mHzほど変動する可能性があり、雑に計算しても1℃で約1mHzほど変化するかもしれない。
抵抗分圧の温度安定性
抵抗の温度特性で気軽に手に入る±100ppm/℃の場合をLTSpice でシミュレーションしてみると、VFC は最悪 ±0.25mV/℃ 変動することがわかる。これは±0.5mHz/℃ に相当する。5℃変化すれば±2.5mHz動くことになる。最悪というのは全部の抵抗の温度特性が正負も含めてバラバラというケースなので実際はもっとマシだとは思うが、ちょっと大きすぎる。
±10ppm/℃であれば出力温度係数は1桁減って、約±0.025mV/℃、±0.050mHz/℃ になる。PPS によって制御されているとはいえ、1000秒(16分)ぐらいの頻度でしか調整できないので、ここはできるだけ温度安定性を上げておきたい。
温度安定性のまとめ
- OCXO ±50mHz (0〜55℃)
- DAC Offset Error Drift は ±0.00000024mHz/℃ Gain Error Drift は -0.00000072mHz/℃
- 抵抗分圧 (TCR=±10ppm) ±0.050mHz/℃
1PPS は 1000秒(約16分)で±0.6mHzの確度。あとは室温の安定性で調整する頻度などが変わる。
経過
温度は MCU 内蔵の精度の低いものを利用しているので、相対的な傾向ぐらいしかわからない。また、MCU と OCXO 自体は熱結合しているわけではない (基本的には室温を計測する意図)。error_mHz はn平均で何mHzの誤があるか。temp はMCUの温度、sum は誤差カウントの蓄積、dac は実際に DAC に与えている値、デバッグ用の無意味なグラフが含まれているので注意(drift)
アラン偏差も出しているが1000秒未満は見てもしかたなく (PPSの精度的に)、1000秒以上も意味がある値かどうかよくわからない。まぁさすがにGPSにロックしているので長期ドリフトがない(右上がりにならない)ぐらいは確認できていると思う。
備考: 精度
1e-10 の精度 (1mHzオーダー)であれば (1/1e-10) / (60*60*24*365) = 317年で1秒しか狂わない。