google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

リアルタイムクロック(RTC) の DS3231 と DS3231M は別物

リアルタイムクロックのDS3231の使い方や精度についていろいろ調べてきました。
 関連記事→RTC3231のカテゴリはこちら

流石にTCXOだけあって、本物(?)のDS3231なら、エージングレジスタを調整することで月差1秒以内の精度まで追い込むことが出来ました。しかし、世の中で手に入るDS3231には精度の悪いもの(偽物?)が混ざっていて、そういうデバイスでは月差10秒くらいまでしか追い込めないようです。

ここまでがこれまでの私の認識だったのですが、今回新たな情報を入手しました。どうも名前が同じ、つまりDS3231でも仕様の違うものが売られているようです。この記事ではその内容を説明していきたいと思います。

▼DS3231を使ったRTCモジュール
DS3231を使ったRTCモジュール(ZS-042)
左のモジュール(A)は月差1秒以内に調整出来ました。しかし、中央(B)と右(C)のモジュールはそんな高精度に調整することは出来ませんでした。

こんなに精度の悪い物が出回っていたら、誰かが問題にしても良さそうなものです。そんなことを思いながら調べてみると、そのものずばりの記事がありました。

それは、HeyPete.com Blog さんの、Major differences between the DS3231 and DS3231M RTC chipsという記事です。

詳しくはその記事を読んでいただくのが一番ですが、ポイントを整理すると、

1) DS3231 と DS3231M では内部の部品や回路構成が全く異なっている。データーシートも別で、DS3231 の精度は 2ppm だが、DS3231M の精度は 5ppm。DS3231 は水晶振動子を使っているが、DS3231M はMEMS振動子。但し I2C インターフェイスからは同じに見える。

【データーシートへのリンク】
DS3231のデーターシート :https://datasheets.maximintegrated.com/en/ds/DS3231.pdf
DS3231Mのデーターシート:https://datasheets.maximintegrated.com/en/ds/DS3231M.pdf

2) DS3231 は水晶振動子の負荷容量を調整することで周波数を調整している(TCXO)。したがって、出力されている32.768kHzの周波数の精度はRTCの時計の精度と同じ。

3) DS3231M はMEMS振動子の出力を回路(+ソフト?)で補正して時間基準の1秒パルスを生成。この時、同時に温度補正も実施。なお、32K信号が出力されているが、これはMEMSオシレータ出力を分周しただけのものなので、精度は±2.5%とかなり悪い。また1秒パルスとの位相差は不定。

4) DS3231 は64秒間隔で温度補正を実施。DS3231Mは、電源供給時は1秒間隔、バッテリーバックアップ時は10秒間隔で温度補正。

これほど仕様に違いがあるのなら、型番の番号を変えれば良いと思うのですが、なぜか同じになっているのが話をややこしくしています。DS3231はベストセラーなので、その名前を踏襲して売り易くしたい、というビジネス側の判断があったような気がします。

ともかく、こんなふうに仕様に大きな違いがあるのにもかかわらず、AliExpressから購入すると、どちらが届くか判らないのは困ったものです。もちろん国内の信頼のおけるサプライヤーから買えば大丈夫なんでしょうが、貧乏なアマチュアにはお付き合いは無理です。

私の持っているチップのマーキングをよく見ると、

▼モジュールAは、DS3231N
A DS3231N
これ、精度が高かったものです。

▼モジュールBは、DS3231M
B DS3231M

▼モジュールCは、DS3231M
C DS3231M
モジュールBとCは DS3231M のようです。どうりで精度が悪かった訳です。書くのが後になりましたが、型番末尾のMはMEMSのMを表しているのではないかと思います。

◆まとめ
冒頭に書いたように、DS3231 を使ったRTCモジュールには精度の悪いものがあるので、中華マーケットでよくある偽物だと思っていました。実際に過去の記事の中にそういうことを書いたことがあります。

ところが、精度の悪い物はDS3231M だったようで、仕様書を見ると精度が悪くても当然だなーと思える方式になっていました。なお、精度が良くても悪くてもそのデバイスが本物だとは限らない、つまり両方偽物の可能性もあるので闇は深いです。

ちなみに、上の写真のモジュールAのマーキングは DS3231N となっていますが、正規のマーキングなら DS3231S# (0~70℃) あるいは DS3231SN# (-10~85℃) となっているはずです。ということで、これは偽物である可能性が高いです。

Amazon でもこのRTCを使ったモジュールが売られていますが、そのユーザーの評価はばらついています。「すばらしい精度」と高く評価をする人がいる一方で、「機械式の時計の精度のほうがマシ」とまで言う人がいたりします。たぶん本物/偽物、水晶/MEMSバージョンなどが玉石混交で売られているような気がします。

DS3231Mのパッケージには300ミルの16ピンSOP以外に 8ピンSOPの物もあります。DS3231Mの本来の使われ方は8ピンパッケージの方のような気がします。これならフットプリントが小さく、MEMS振動子なのでショックにも強くて使い易いと思います。

RTC (DS3231) の誤差変動の測定

このところPCの入れ替え作業をやっているので電子工作の方は進展がありません。そんな中で、あまり手間を掛けずに出来ること、ということで、RTC(DS3231)の誤差の時間変化を測定してみました。

以前の記事で DS3231 の偽物は時間精度が悪く、短時間でもふらふらとタイミングが変化しているという話を書きました。これが実際にどれくらいの変化なのか、定量的に比較してみましょう、というのが今回の記事の目的です。

▼測定方法
RTCの誤差変化を記録

左のArduino UNO で作った DS3231を使ったデジタル時計から出ている1秒パルスと、窓際に置いたGPSモジュール (neo-8m) から引っ張ってきた1PPSパルスとの位相差を中央の Arduino UNOで測定し、右側のタブレットで記録しました。
RCTモジュールはコネクタで差し替えが可能なので、簡単にモジュールの違いによる特性の差を比較することが出来ます。

以下は測定結果で、1200秒(20分間)の位相の変化と、位相の変化率です。

位相の変化率は1秒値当たりの位相の変化量で求めていて、これはRTCの絶対誤差と考えることが出来ます。なお、この変化率は、60回(60秒)の位相データーを使って最小二乗法で求めた近似直線の傾きの値です。なお、この値は Arduino で計算してシリアルに出力しています。

◆モジュールA (本物、と思われるもの)
・位相変化
モジュールAの位相変化
位相差は4μsステップの値でしか出力されないので、階段状のグラフになっています。

・誤差変化
モジュールAの誤差変化
位相の測定結果は4μsステップの離散値しか得られません。でも最小二乗法で求めた直線近似直線の傾きには、見えなかったた傾向が見えてきているようです。

時々大きな揺らぎがありますが、それを除くと変動は±0.02ppm 程度に収まっているようです。あと、少し右上がり傾向なのは温度変化の影響なのかも知れません。

◆モジュールB(偽物と思われるもの)
・位相変化
モジュールBの位相変化
エージングレジスタの値が十分調整出来ていないようで、右上がりの位相変化があります。ちなみに、位相差が増えているので、RTCのオシレーターの周波数が低いことになります。

・誤差変化
モジュールBの誤差変化
右上がりの位相変化があるので、グラフの中心が 0.3ppm くらいゼロから上にシフトしています。変動幅は、±0.2ppm くらいあって、Aのモジュールの約10倍もあります。こういうデーターを取ると、偽物の化けの皮が剥がれてきます。

◆モジュールC(偽物と思われるもの)

・位相変化
モジュールCの位相変化
4μs の階段状に値が変化していますが、Aのモジュールより振れ幅が大きくなっています。エージングレジスタが適切に調整されていたようで、中心値はほぼ一定になっています。

・誤差変化
モジュールCの誤差変化
変動は±0.4ppm くらいはありそうです。やはりこれも偽物です。

◆まとめ
本物(と思える物)と偽物の DS3231 の誤差変動を詳しく測定してみました。偽物の変動範囲は本物の10倍程度あることが判りました。そうは言っても 1ppm 以下の話なので、細かいこと言わなければOKなレベルではあります。

こういう測定を簡単に出来るのは、GPSモジュールから出ている正確な1PPSパルスのおかげです。これが7ドルちょっとで手に入るのだから、良い時代になったものです。残念なのは、このモジュール(u-block neo-8)が日本製では無いことです。

最小二乗法による傾向の抽出は思ってたよりうまくいっている感じです。Arduino UNO のCPU (ATmega328P) で計算した場合の1回の処理時間は50ms程度でした。これ以外に過去データーを蓄積しないといけないのでレスポンスが悪化します。そんなことで、タイミング的に厳しい場合は無理ですが、そうでなければこのテクニックはけっこう使えると思います。なお、計算精度が32ビット浮動小数点なので、桁落ちには注意が必要です。

今回調べたのは20分程度の短期変動です。もっと長時間では傾向が変わってくるかも知れません。多分それ以上に、温度変化の影響の方がずっと大きいと思います。

GPSとArduinoでRTC (DS3231) の誤差の原因を徹底調査

◆まえがき
前回の記事で、周波数カウンタ(ユニバーサルカウンタ)を使わないでも、GPSとArduinoを使ってRTCの位相変化を高感度に測定出来るようになりました。つまり手軽にRTCの誤差を評価できるようになった訳です。

そこで早速、これまでやりたかった測定をやってみました。

◆RTCの誤差要因の確認
まずは電源電圧変化に対する精度の変化です。

▼電源電圧 v s誤差特性
電源電圧vs誤差

電源電圧が増えると誤差はマイナス方向に変化することが判ります。位相差が小さくなるので、時計としては追い付いている、つまり進む方向に変化することになります。(なお、誤差の絶対値としては遅れ)

5Vと3.3Vでは0.4ppmも違っています。このRTCの精度は2ppmなので仕様内の変化ではありますが、かなり大きな差だと思います。5V電源としてUSBのACアダプタを使うことが多いですが、その電圧精度は悪くて0.2Vくらいの違いは平気であるので、要注意です。

このRTCはTCXOですが、そういう高級なことをやる以前に、電源電圧変化に対する対策をきちんとやっておいて欲しかったです。なお、この測定はエージングレジスタの値をゼロで行っています。

◆バッテリーバックアップの時は
電源を切ったバッテリーバックアップ状態では、1秒パルスが出なくなるので位相差の測定は出来ません。しかし、再度電源を入れた時の位相の値から、バッテリーバックアップ中の変化を知ることが出来ます。そうやって測定した誤差の量は+0.57ppmでした。この値を上のグラフに赤い点線で書き込んでおきました。

ちょっと乱暴な言い方ですが、バッテリーバックアップ中は電源電圧が 3.4V くらいの状態に相当しているようです。まあ、バックアップ電池(CR2032)の電圧から考えると当然の傾向なんでしょう。そんなことでこの値は、バッテリーのへたり具合で徐々に変わってくると思います。

以上が電源電圧の違いによる時間誤差への影響でした。こうなると、電源電圧が変わった時のエージングレジスタの感度も気になるので、これも測定してみました。

▼エージングレジスタの感度
エージングレジスタの値に対する誤差の変化

電源電圧が3.3Vと5Vの時のエージングレジスタの値に対する誤差の変化をグラフにしたものです。

グラフが平行移動したようになっているのは、前項の測定結果と同じ傾向です。よく見ると、傾きが少し違っていて、5Vの場合は 0.0339ppm/LSB なのに対して、3.3Vでは0.0306ppm/LSB になっています。この値はエージングレジスタを調整して時計の誤差を補正する時に使うので重要です。

ちなみに、以前の記事に掲載したエージングレジスタの感度特性は次のグラフです。

エージングオフセット値と周波数変化グラフ

このグラフはルビジウムを基準オシレーターに使った周波数カウンタで測定したもので、電源電圧は5Vの状態です。この組み合わせの測定器を持っている人はめったにいないと思うので、誰にでも出来る測定ではありません。(このグラフはRTCの32.768kHzのオシレーターの周波数変化を見ているのでグラフの傾きが逆になっています)

これと同じことが7ドルちょっとのGPSモジュール(u-blox M8N) とArduinoを使うと出来ちゃうんだから、技術の進歩ってすごいです。

さて、これでRTCのDS3231の誤差要因は調べつくしました。というか、実は温度特性が残っているのですが、これは測定が難しいのでとりあえずパス。

ともかくここまでで判ったことを整理します。RTC の精度を上げるためには、
1) 電源電圧が変わると時計の歩度に影響がある。
2) 電源を切ることがある(バッテリーバックアップを使う)なら電源電圧は3.3Vで使う。
3) 姿勢差があるので、鉛直方向に対して同じ角度で使う

なお、電源を入れっ放しで使うなら2) 項は無視してもOKです。

さて、ここまでの話の集大成です。判った知見を反映してRTCのエージングレジスタの値を調整し、少し長い時間動かして、RTC の誤差を測定したのが次のグラフです。

◆RTC(DS3231)の精度確認結果
合わせ込み後の誤差
これは約3日間の1秒パルスの位相変化で、基準はもちろんGPSの1PPSです。

赤と黒の線の色分けは、黒い線がRTCの電源ON、赤い線が電源OFFで動かしています。どちらもほぼ一本の線に乗っているので両者の誤差(歩度)はほとんど同じになっています。

傾きはRTCの誤差を現わしていますが、その量は約4ms/Day です。つまり、1日当たり0.004秒しか狂わないという素晴らしい精度に調整出来ていることになります。誤差で言うと0.0463ppm、月差では0.12秒、年差で1.46秒のズレになります。こういう精度が1ドルくらいで手に入るRTCで出るのだから嬉しい限りです。

なお、この測定は温度の影響を無視しています。同じことを冬にやれば結果は変わってくるでしょう。

あと、同等の測定はルビジウムオシレーターの1PPSパルスを使っても出来ます。但しこの場合、ルビジウムオシレーターの電源は入れっ放しにしておかないといけないのでちょっと不便です(電源を入れ直すと位相は保存されません)。

◆まとめ
ふとしたことから買ってみたRTC(DS3231) ですが、突き詰めていくといろいろ知らなかった現象が見えて来て面白いです。

GPSモジュールは安くなったので、基準信号の1PPSを使うためだけに買うのも有りだと思います。最新の neo-9 はまだとんでもなく高いので neo-8 あたりがお勧めです。

ところで、ここまでさんざん遊び相手になってくれたRTC(DS3231)は、3個買った中に入っていた、「当たり」の1個で、この記事に出てくるモジュールのAです。もしこれも外れだったら、ここまでの一連の記事は生まれなかった訳で、偶然とは怖いものです。
ちなみに、モジュールのBとCの誤差を同じようにして測定してみると値が安定しなくて全然ダメ、見てはいけないものを見てしまった感じでした。
カレンダー
10 | 2019/11 | 12
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード