Maximの高精度リアルタイムクロックIC、DS3231は、正規ルートから買うと1個千円弱もするICです。ところが、Amazonのセラーを含む中華系の入手手段を使うと(たぶん中古品が)安い場合は1個100円以下で手に入り、デジタル時計を自作するときの定番になっています。
このDS3231、データシート上では±2ppmというすごい高精度で計時することになっていますが、きちんと扱わないとデータシート通りの計時精度が出ないこともあるようです。実際、Maximの正規代理店であるMouserからDS3231Sを50個購入し、ニキシー管の時計を数十台製作したところ、個体によって計時精度が低いものがみられました。
いろいろ調べて対策を行うことですべての個体でデータシート通りの高い精度を出すことができたのですが、これらの対策はデータシートやアプリケーションノートには記載がありません。ということは、本来の精度を出せないまま使われているDS3231も多いのでは?と思ったので、私が実際に行った対策をまとめてみます。
計時の精度を出すためのポイント、裏を返すと精度を損なうポイントは、以下の4つです:
- ノイズのない電源をレギュレーターから供給する
- 外来ノイズを遮断する
- I2C通信の頻度を下げる
- ちゃんとケースに入れる
以下でそれぞれ解説します。なお、計時の精度については、数日間複数個の時計を起動しっぱなしにしてそれぞれの間のズレをみたり、NTP同期したPCの時計とのズレをみたりして判定しました。 正確な計測器を用いたわけではない点をご承知おきください。
ポイント1: ノイズのない電源を供給する
DS3231は2.3V〜5.5Vの範囲の電源で動作するので、これ幸いとシステムの電源に直結しがちです。USBで動かすガジェットなどはUSBのVBUSに直接つないでしまっても動きます。しかしこれがまずダメです。電源はきちんとレギュレーターを使って、できるだけDS3231専用のものを用意しましょう。
システムの電源は、他にもマイコン等がたくさんつながっている場合がほとんどです。それらが動くと当然電源を使うので、電源ラインの電圧が上下します。特にLEDなどの大電流を喰うデバイスがあると、この上下幅は大きくなります。USBガジェットの場合は、同じUSBハブにHDDを接続したりしても電源電圧は大きく変動します。この電源変動がDS3231の計時精度に影響するようです。
レギュレーターは高級なものでなくても、三端子レギュレーターやSOT-23のポイントレギュレーターのようなもので充分でした。とにかく回路中の他のデバイスの影響を受けないようにすることが重要です。Arduinoなどは3.3Vのレギュレーターが載っていますので、他に3.3Vを使うデバイスがなければ、ここから供給すればOKです。
今回の4つの対策の中では、この電源供給改善がいちばん精度向上の効果がありました。DS3231を使う上では、まず電源回路に重点をおいて設計しましょう。
電源を変えたらI2Cの信号レベルに注意
DS3231の電源をレギュレーターから供給することにより、DS3231と通信するマイコンと電源の電圧が食い違う場合は、I2Cバスの信号レベルに注意してください。
DS3231のI2Cピンは5Vトレラントなので、マイコンが5VでI2Cも5Vの場合は問題ないでしょう。マイコンが5Vで動いていてDS3231が3V未満で動き、I2Cも3V未満のような場合は、マイコンによっては信号のHレベルを正しく受け取れないかもしれません。データシートを参照して正しく設定しましょう。
ちなみにArduinoの場合は、DS3231の電源とI2Cバスを3.3Vにしても、AVRマイコンが3.0V以上をHレベルと認識するので大丈夫です。
ポイント2: 外来ノイズを遮断する
電源から入ってくるノイズだけではなく、電磁波として周囲から入ってくるノイズも精度に影響するようです。対策としては、DS3231本体をシールドしてしまうのが効果的でした。
まず、データシートにも書いてある点として、DS3231の直下には配線パターンを引かず、ベタグラウンドにします。私のニキシー管時計の例では、これだけで足りる個体と足りない個体があるようでした。DS3231の直上にニキシー管が乗った基板を配置しているので、ここから来るノイズが問題になったのだと思います。
対策として、DS3231に銅箔テープを貼り、銅箔テープをグラウンドに接続するという方法を採ったところ、時計精度が向上しました。
この写真の方法だと銅箔テープ自体がアンテナになってしまう可能性があるので、もっときちんと対策する場合は、基板と複数箇所で接続できるようにするとか、もうひと工夫が必要だと思います。さすがに金属のシールドケースをつくったりするのはオーバーキルだと思います。
興味深い点として、(銅箔テープを貼る前、)特定のノイズパターンが計時精度に特に大きく影響するような挙動が見られました。通常は問題ないのに特定の期間だけ時計がズレる、という場合は、この対策を行うとよさそうです。
ポイント3: I2C通信の頻度を下げる
頻繁に時刻を読み出すなど、DS3231に対してI2C通信を頻発すると時計が遅れる個体がありました。これはどういうメカニズムなのかよくわかりません。可能性としては、I2Cの通信で発生するノイズが計時機構に影響する、くらいしか考えられないです。ともあれI2C通信の頻度を下げ、通常時はDS3231のクロック出力で時刻を更新するほうが、計時精度は高くなりました。
この問題は海外のフォーラムでも散見されます:
- DS3231 slow down (arduino.cc)
- Does frequent reading slows down DS3231 RTC??? (avrfreaks.net)
実際のところ、毎秒256回時刻を読み出しても問題ない個体もあれば、1秒に1回読み出しただけでも時刻がずれていく個体もありました。上記のポイント1, 2 もあわせて実験中だったので、もしかしたらそちらの影響もあったのかもしれませんが、問い合わせ回数を減らしたほうが時計の精度を保てるのは間違いないようでした。
私のニキシー管時計では、2時間に1回だけDS3231から時刻を複数回読み出して、マイコン側の時刻を保持する変数を同期するようにしました。それ以外の間は、DS3231の出力する32.768kHzのクロックでマイコンに割り込みをかけ、この割り込みを32768回カウントしたら前述の変数に1秒を加算するようにしました。ニキシー管に表示するのはこの変数の内容で、DS3231とはできるだけ通信しないようにしました。
なお、同じバスの別のI2Cデバイスに通信を頻発しても影響があるのかどうか、については未調査です。I2C通信によるノイズが原因なのであれば、別のI2Cデバイスに通信しても影響があるはずですので、注意が必要です。
ポイント4: ちゃんとケースに入れる
これは影響の度合いがまだよくわからないのですが、ケースに入れた個体と剥き出しになっている個体を比較すると、ケースに入っているほうが計時精度が良いように思います。
DS3231は特段の指示をしない限り64秒に1回しか温度補正をしないので、エアコンの風なんかが当たって周囲温度が頻繁に変わると、温度補正が間に合わない間に内蔵の水晶の周波数が微妙に変わり、時刻が狂ってしまうのでは?と考えています。
基本的にケースに入れて使うものだと思うのであまり大きなポイントにはならないとは思いますが、また何かわかれば追記します。
オシロスコープで見てみると
対策のポイントは以上です。時間経過での時計の正確さをみるのに加えて、以上の4つの対策をする前とした後それぞれ、DS3231の32kHz出力の波形をオシロスコープで見てみました。対策前はジッタが激しく、これは時計も狂うよなぁ、という印象です。
下のスクリーンショットが対策前です。電源はUSBのVBUS直結です。波形の立ち上がりでトリガをかけ、オシロスコープの残像表示を1秒間に設定しています。波形の左右位置がズレたものが多数描画されていて、波形の周期が一定していないのがよくわかります。この波形をもとに計時しているので、まあ精度が出ないのも納得です。
対策をしたあとが以下のスクリーンショットです。電源は3.3Vのレギュレーターから供給し、銅箔テープのシールドもつけました。オシロスコープの設定は同じです。1秒間の残像表示があっても、波形が全くブレておらず、正確な発振ができているのがわかります。
DS3231Mは別物です
DS3231には内蔵している発振子の種類によって2つバリエーションがあります。この記事で対象しているのは水晶発振子を内蔵したタイプです。MEMS発振子を内蔵したものはおそらく全く違う挙動になると思うのでご注意ください。
DS3231は型番末尾の記号によって内蔵している発振子のタイプが違います。以下の通りです:
- 水晶発振子:DS3231S#, DS3231SN#
- MEMS発振子:DS3231M+
どれもパッケージが一緒でピン配置も同じ、I2Cの通信プロトコルも同じなのですが、データシートによると、MEMS発振子を使ったものは水晶発振子のものと比べて精度が劣ります。挙動も少し違う点があるので、この記事で紹介しているテクニックがそのまま使えるかどうかもわかりません。Amazonで「DS3231」とだけ表示されているモジュールを買うとDS3231Mが混ざって届くこともあるようですので注意してください。
(DS3231MがリマークされてDS3231SNとかになっているようなものは(存在するのかどうかわかりませんが)もうどうしようもありません。きちんとしたものを買いたいときは高くても正規代理店から買いましょう。)
なお、秋月電子で売っているDS3234は同じ水晶発振子を内蔵したタイプですので、この記事の対策が同様に有効かもしれません。
まとめ
DS3231は水晶発振子が内蔵されていて外付け回路が要らず、消費電力も低く、非常に使いやすいICです。しかし消費電力が低いというのはよくよく考えると同時にノイズに弱いという側面もあるようにとらえられるので、そう考えると今回の対策はある意味当たり前という感じもします。
要するに、DS3231にとって「正確に時計を管理できる静かな良い環境」を提供できているかどうか、が精度を左右するカギなのかなと思います。
個体によっては今回の対策の有無で驚くほど精度が違います。中華系ルートでDS3231を買って精度が出なくてニセモノを疑う前に、システムがDS3231に対して「良い環境」を提供できているか、もういちど確認してみてください。