リアルタイムクロック DS3231 のエージングレジスタを調整して精度アップ
リアルタイムクロックの DS3231 を Arduino から動かせるようにして約20日経ちました。ブレッドボードはそのまま残っているので、久しぶりに電源を入れて動かしてみました。
▼DS3231の動作テスト

動かした目的は、どの程度の精度で時計が動いているか確認したかったからです。ちなみにバッテリーバックアップされているので、外部から電源を供給しなくても、基板単体で動き続けています。
DS3231 のモジュールは3枚ありますが、その誤差(時刻のずれ)は、A基板: -2秒、B:基板: -13秒、C基板: -6秒でした。なお、マイナスの誤差は遅れを表しています。これは約20日間経過後のずれ量なので、A基板についてはまずまずの結果だと思います。
ちなみに、 B と C の基板に載っているチップは偽物で、仕様書通りにすら動かない物なので、精度を語ってもあまり意味が無いです。まあ、そうは言ってもそこそこの精度では動いているようです。
20日で2秒の誤差なので、その精度は約 1.1ppm で、流石は TCXO です。こうなると欲が出て、もう少し精度を上げてみたくなります。そんなことで調べてみると、ありました。エージングレジスタを調整することで、オシレーターの周波数の微調整が出来るようです。
▼エージングレジスタの効果(DS3231のデーターシートより抜粋)

このレジスタは、水晶の経時変化 (Aging) を補正するために用意されているようですが、周波数の微調整のために使うことも出来ます。ということで、エージングレジスタの値を OLED の画面を見ながら操作する機能をプログラムに追加しました。
プログラムはこちら。20190731DS3231_OLED_Clock.txt (shift-JISエンコードです)
なお、エージングレジスタなどを設定する機能が、使用したライブラリでサポートされていなかったので、別途作り込んでいいます。また、設定変更がすぐに反映されるようにControl Redgister の CONVビットの操作も行っています。

使い方は、Inc.(+)ボタンを押しながら起動(リセット)すると、上の写真のようなエージング値の調整画面に入るので、+/-ボタンで値を調整。最後に Ent .ボタンを押すことで、エージング値がセットされます。なお、エージング値はバッテリーバックアップされるので、電源を切っても消えません。
ちなみに、エージングレジスタの値を変更しても、実際に反映されるのは、64 秒毎に行われる温度補正のタイミングになります。これでは調整がやりづらいので、強制的に値を反映させるように CONV ビットを操作しています。
▼調整の様子(32.768kHzの測定)

周波数カウンタで水晶の周波数をモニタすると簡単に調整することが出来ます。この写真はぴったり 32.768000kHz に合わせた状態です。
▼エージングオフセットと周波数の測定結果

▼エージングオフセットと周波数誤差のグラフ

オフセット値は±120 の範囲で入力可能で、水晶の周波数は±4ppm の範囲で変化しました。ちなみに、オフセットの 1LSB で周波数は -0.035ppm 変化することになります。(あくまでもこの個体の値です)
これまでのオフセットはゼロだったので、約0.46pm の誤差があったことになります。なお、この記事の初めの方で誤差の実績は1.1ppm だったので、少し値が違っています。これはたぶん、温度の違いなどが原因では無いかと思います。まあ、目視で1秒以下のタイミングの違いをきちっと測定するには、何か工夫しないと難しいです。
◆エージングオフセットの調整
エージングオフセットに -12 を設定してとりあえず周波数をぴったり合わせました。なお、真夏で気温が高いのでたぶん年間を通した最適値は少し違ってくる気がします。
▼感度の高い測定方法

周波数を測定する以外に、ユニバーサルカウンタのタイムインタバル測定機能を使った測定方法も使えます。
正確な 1PPS 信号と、DS3231 から出ている1秒信号との位相差(位相変化)をユニバサルカウンタで測定することで、両者の周波数の差を高感度で検出することが出来ます。上の写真は位相差が 584.4543ms ですが、時間を置いて位相の変化を測定すると、極めて高感度な周波数の比較が可能になります。
ちなみに、BとCの基板の1秒信号には大きなジッタがあって、パルスの周波数測定では精密な測定は難しかったのですが、位相差測定を使うと、ジッタが平均化されるので、測定し易くなりました。
◆まとめ
リアルタイムクロックの DS3231 の精度は高いですが、エージングレジスタを調整することで、更に高い精度まで追い込むことが出来ました。
ここで問題は、こういう調整を行うためには絶対精度の高い測定器、あるいは信号源が必要になる点です。GPSの1PPS信号を使うことが出来れば、それが一番確実だと思います。それ以外にいろいろ方法があるので、考えてやって実際にやってみると面白いと思います。
◆おまけ
以前の記事に、挙動から偽物らしい DS3231 があると書きました。そのチップの拡大写真は以下の通りです。
▼Aの基板のDS3231

これはデーターシート通りの挙動だったチップです。ただ本物かどうかは判りません。鑑定できる人いませんか?
▼Bの基板のDS3231

これはおかしな挙動だったチップで、明らかに偽物だと思います。マーキングも違っています。
▼DS3231の動作テスト

動かした目的は、どの程度の精度で時計が動いているか確認したかったからです。ちなみにバッテリーバックアップされているので、外部から電源を供給しなくても、基板単体で動き続けています。
DS3231 のモジュールは3枚ありますが、その誤差(時刻のずれ)は、A基板: -2秒、B:基板: -13秒、C基板: -6秒でした。なお、マイナスの誤差は遅れを表しています。これは約20日間経過後のずれ量なので、A基板についてはまずまずの結果だと思います。
ちなみに、 B と C の基板に載っているチップは偽物で、仕様書通りにすら動かない物なので、精度を語ってもあまり意味が無いです。まあ、そうは言ってもそこそこの精度では動いているようです。
20日で2秒の誤差なので、その精度は約 1.1ppm で、流石は TCXO です。こうなると欲が出て、もう少し精度を上げてみたくなります。そんなことで調べてみると、ありました。エージングレジスタを調整することで、オシレーターの周波数の微調整が出来るようです。
▼エージングレジスタの効果(DS3231のデーターシートより抜粋)

このレジスタは、水晶の経時変化 (Aging) を補正するために用意されているようですが、周波数の微調整のために使うことも出来ます。ということで、エージングレジスタの値を OLED の画面を見ながら操作する機能をプログラムに追加しました。
プログラムはこちら。20190731DS3231_OLED_Clock.txt (shift-JISエンコードです)
なお、エージングレジスタなどを設定する機能が、使用したライブラリでサポートされていなかったので、別途作り込んでいいます。また、設定変更がすぐに反映されるようにControl Redgister の CONVビットの操作も行っています。

使い方は、Inc.(+)ボタンを押しながら起動(リセット)すると、上の写真のようなエージング値の調整画面に入るので、+/-ボタンで値を調整。最後に Ent .ボタンを押すことで、エージング値がセットされます。なお、エージング値はバッテリーバックアップされるので、電源を切っても消えません。
ちなみに、エージングレジスタの値を変更しても、実際に反映されるのは、64 秒毎に行われる温度補正のタイミングになります。これでは調整がやりづらいので、強制的に値を反映させるように CONV ビットを操作しています。
▼調整の様子(32.768kHzの測定)

周波数カウンタで水晶の周波数をモニタすると簡単に調整することが出来ます。この写真はぴったり 32.768000kHz に合わせた状態です。
▼エージングオフセットと周波数の測定結果

▼エージングオフセットと周波数誤差のグラフ

オフセット値は±120 の範囲で入力可能で、水晶の周波数は±4ppm の範囲で変化しました。ちなみに、オフセットの 1LSB で周波数は -0.035ppm 変化することになります。(あくまでもこの個体の値です)
これまでのオフセットはゼロだったので、約0.46pm の誤差があったことになります。なお、この記事の初めの方で誤差の実績は1.1ppm だったので、少し値が違っています。これはたぶん、温度の違いなどが原因では無いかと思います。まあ、目視で1秒以下のタイミングの違いをきちっと測定するには、何か工夫しないと難しいです。
◆エージングオフセットの調整
エージングオフセットに -12 を設定してとりあえず周波数をぴったり合わせました。なお、真夏で気温が高いのでたぶん年間を通した最適値は少し違ってくる気がします。
▼感度の高い測定方法

周波数を測定する以外に、ユニバーサルカウンタのタイムインタバル測定機能を使った測定方法も使えます。
正確な 1PPS 信号と、DS3231 から出ている1秒信号との位相差(位相変化)をユニバサルカウンタで測定することで、両者の周波数の差を高感度で検出することが出来ます。上の写真は位相差が 584.4543ms ですが、時間を置いて位相の変化を測定すると、極めて高感度な周波数の比較が可能になります。
ちなみに、BとCの基板の1秒信号には大きなジッタがあって、パルスの周波数測定では精密な測定は難しかったのですが、位相差測定を使うと、ジッタが平均化されるので、測定し易くなりました。
◆まとめ
リアルタイムクロックの DS3231 の精度は高いですが、エージングレジスタを調整することで、更に高い精度まで追い込むことが出来ました。
ここで問題は、こういう調整を行うためには絶対精度の高い測定器、あるいは信号源が必要になる点です。GPSの1PPS信号を使うことが出来れば、それが一番確実だと思います。それ以外にいろいろ方法があるので、考えてやって実際にやってみると面白いと思います。
◆おまけ
以前の記事に、挙動から偽物らしい DS3231 があると書きました。そのチップの拡大写真は以下の通りです。
▼Aの基板のDS3231

これはデーターシート通りの挙動だったチップです。ただ本物かどうかは判りません。鑑定できる人いませんか?
▼Bの基板のDS3231

これはおかしな挙動だったチップで、明らかに偽物だと思います。マーキングも違っています。