本体がほぼ完成したので、時計の精度がどれだけ保たれるのか測定と調整を行いました。

 

今回の時計は、GPS信号時刻合わせをしますが、通常時はリアルタイムクロックというICが勝手に刻む時を表示しているだけです。

なので、放っておけば時刻はずれていきます

ただ、このICは高精度RTCとうたっているだけあって、精度は±2ppmです。

ppmは Parts Par Million の省略形で、±2ppm は 100万回1秒を出力したら100万秒ではなくて100万±2秒の可能性があるということです。

よい精度のような気もしますが、100万秒≒11.6日であり、1ヶ月で最大2.6秒ずれる可能性があるともいえます。

 

DS3234RTC は、これを調整するためのエージングレジスタがあり、-128~127、最小単位0.1ppmで値を入れます。大きな値ほど周期が大きくなり時計が遅れ、小さな値ほど時計が進むようになります。

 

で、ここからが本題。

 

GPSの1PPS信号(1秒信号:Pulse Par Second)と、時刻合わせした時計のSQW信号の差は数ミリ秒程度なので、オシロスコープを持っていないと測定できません。そこで測定装置の作成からスタートします。

 

最初は、PICの割り込みとタイマを駆使して時間差を出力すればよいと考えていましたが、割り込み差が小さくなってくると割り込みルーチン自体が測定の邪魔になりそうだとわかり始めました。

PIC16F1705のマニュアルをよく読むと、CCP(Capture/Compare/PWM)モジュールが2つ搭載されており、キャプチャ機能2系統を使えば2つの信号を同等に扱えることがわかりました。

 

キャプチャ機能は、外部からの信号をトリガにして、フリーラン状態にしたタイマ1の値を別レジスタに写し取る、という機能です。

最初に init_tmr1 関数を呼び、プリスケールを設定。次に start_tmr1 関数を呼んでフリーラン状態を作る↓

 

外部信号の取り方も指定がいろいろできて、今回はGPS信号がActiveLowなので、1つは信号のフォーリングエッジ(立ち下り)。

もう1つはRTCのSQW(方形波)がActiveHighなので、ライジングエッジ(立ち上がり)に指定します。

 

外部信号の取り方は CCP1CON と CCP2CON で設定↓

 

これらの瞬間値が取れれば、次の信号がやってくる1秒以内に表示を行えばよいだけです。1秒あれば8MHzで動かしているPICなら200万インストラクションは実行できます。取得した値を液晶表示器などに出力するのに数百インストラクションあればこと足ります。

 

問題は1秒ごとに出力される2つの大きな値を人間が記録できるかになりますが、これも通信ログにすれば可能です(最初、こうした)。ですが、ログは膨大になるのと、PC接続が必要なのでやめて、液晶表示をスマホカメラで撮影することにして解決しました。

 

メイン関数のループでは、信号取得ごとに、タイマ1から写し取られた値 CCPR1H/CCPR1L CCPR2H/CCPR2L を表示↓

 

ということで、ここまでが測定器の話で、分解能は2μsです。

 

 

次は時計本体のプログラムの話で、水晶発振器の周波数を調整するエージングレジスタを少しずつ変えて実験し最適値を探しました。

 

エージングレジスタの設定方法、0x90番地を読み込み新しい値(以下では0b00010000=16)を書き込む↓

 

測定装置を作ったおかげで、1時間置きの測定で

レジスタ値=12 のとき 3ms/h 進み

レジスタ値=20 のとき 1ms/h 遅れる 

ことがわかり、

レジスタ値=16 のとき 14μs/h 進む時計になりました(気温23℃)。

※温度によってエージングレジスタ感度は変わるので室温が1年を通して23℃の場合になります。

 

この精度は、一日で 0.336 ms 進むので、8年と53日で約1秒ずれる計算です。

 

タイムサーバとの通信では、設定される時刻に 0.3 ms 程度ゆらぎがあって、これ以上詰めるのは諦めました(1日分のずれですし)。

今回は運よく、GPSとのずれが、0.124ms遅れになりました。1日経てば 0.212ms進みの時計になります。

GPS:0xDB94C3、RTC:0xDB9501、差62単位(1単位=2μs)=0.124ms

 

時計の左下が空いているので、時報が鳴っている間、7色LEDが光る補助回路も付け足しました。ちなみに停電などがあってもRTCにはバッテリバックアップのコイン電池がつないであるので時刻は狂いません。

 

 

 

8年で1秒進むGPS時刻合わせ時計、これでいったん完成とします。