先日、電子部品の整理をしていたところPIC12F683という8ピンの小さいPICを発見しました。
いつ購入したのか覚えてませんが、データシートをダウンロードしてよく読むと、6つのI/Oピンそれぞれに多彩な機能が割り当てられている面白いPICでした。

2.0-5.5Vの広い動作電圧
31.5kHz~20MHzのオペレーティングスピード
アナログコンパレータ(電圧リファレンス設定可能)
10ビット4チャネルのA/Dコンバータ
3つのタイマー(TMR0,TMR1,TMR2)
CCPモジュール(Capture/Compare/PWMモジュール)
256バイトのEEPROM(100万回書き換え可能/40年以上保持)

そして表題にあるGPSから出力されている1pps信号の幅をこのPICを使って測ってみることにしました(まあGoldWaveなどでもできるのでしょうけど、趣味なので^^;)。

使うのはCapture機能とEEPROMです。

キャプチャー(Capture)機能は、GP2ピンの電圧のライジング(立ち上がり)エッジやフォーリング(立ち下がり)の瞬間を割り込みで拾ってタイマーカウント(16ビット)を専用レジスタにコピーできるものです。

EEPROMは内蔵の不揮発性メモリです。ソフトウェアからここに記録すれば電源が切れても残っているのでいつでも読み出せます。ただし、1バイト書くのに数msかかります。

1ppsのパルス幅は100ms疑惑がありますので、それが測れるようにPICの動作クロックやタイマーの分周比(プリスケール)を決めます。

5V、1MHzクロック動作
キャプチャ用のタイマー1はプリスケール1/8

この設定にすると1インストラクションは4μsになり、タイマー1カウントは8x4=32μsになります(時間分解能は32μsということ)。電圧の立ち下がりから立ち上がりまでの時間は、各々キャプチャした値の引き算で求められます。

32回測定し終わるとキャプチャを停止させて、EEPROMへの書き込み(64バイト)を開始します。

書き込みが終わるとLEDを点滅させて終了したことを知らせるようにプログラムしました。

計測だけのために既存の機器は変更したくなかったので手持ちのフォトトランジスタを使ってみました。本当はフォトカプラがあるとよかったのですが、買ったこともありませんので仕方なく。


GPSを起動させて1pps信号が出るようにしてから部屋に戻ります。
1ppsのLEDに筒(モデルハウスの広告で作成^^;)をかぶせて、フォトトランジスタに余計な光が入らないようにして、PICの電源を入れると32回の発光のあと、1秒程度でEEPROMの書き込みが終わりGP0に接続したインジケータLEDが点滅しました。


PICkit2につないでReadボタンを押すと、以下のようになりました。下の方のEEPROM窓に注目



0C50(16進数)=3152(十進数)、0C4F=3151ですので、加算して平均すると3151.6875。

1カウントは32μsなので
3151.6875 x 32 = 100854 μs = 100.854 ms
となりました。

フォトトランジスタはデータシートによると負荷抵抗が2kΩのとき、立ち下がりが0.7ms遅れ、立ち上がりは1.0ms遅れるようなので、本当の幅は100.554ms程度と考えます。

また、PICは今回水晶発振子を使っていないので1パーセント以内のクロック誤差がありますので、結論としてGPS(GE-315)から出ている1ppsパルスの幅は、

99.545~101.563 ms
 

となりました。
幅1μsってマニュアルには書いてあるのですがね(10万倍も長いとは・・・(-_-;)

あー今気が付いた!1ppsの立ち上がり間が正確な1秒のはずなので、それでデータを校正すればいいんだ。ちょっとプログラム書き直して再チャレンジします。(´д`lll)

---------------追記------------------------
キャプチャエッジの切り替え部分を2箇所コメントアウトしただけでプログラム書き換えが終了したので、すぐに試験完了です。

結果がこれ。



7A15(16進数)=31253(10進数)

平均値は 31252.6875 カウント。
31252.6875 x 32μs = 1000086μs = 1000.086ms
PICのオシレータは0.086%ほど速くカウントが進むようです。ですが、かなり正確です。
先の結果に比例で適用すると、

100.554ms x 1000 / 1000.086 = 100.535ms

1ppsのパルス幅は 100.535ms 程度、+1%以内ですがちょっと誤差が大きい気がします。
PICの時間分解能よりフォトトランジスタの応答性能のオーダーが10倍くらいよくないので、直接つないで計測してみたほうがいいかも知れません。

--------------再追記------------------------
回路はそのままに、検出エッジを逆にして追試を行いました。

これらの値を全部合計すると、1PPS発光終了から次の発光開始までの時間の平均がでます。(ちょうど32個分の測定が入っているので)

合計は、 899318μs = 899.318msでした。
校正する前の1PPSパルス幅は、100.854msでしたから、
合計 1000.172msとなり、追記で計測した1PPS立ち上がりどうしの間隔1000.086msより0.086ms大きくなってしまいました。

少し難しいことになってきたような気がします。気温など試験条件も合わせて一度に測ったほうがいいのかも知れません。考察はまたあとで行います^^;

--------------再再追記----------------------
GPS1PPS出力の外部接続端子を作りました。

GPSもPICも電源は双方5Vなので共有してダイレクトに信号を受けました。
2つの機器の接続はジャンパーピンです。接続するタイミングでノイズが多いせいか、最初の数回はおかしな値が出ています。

これをみると 0C35=3125が多いことがわかると思います。
パルス幅は、3125 x 32μs = 100000μs = 100.000ms です (^_^)v

では逆のフォーリングからライジングエッジへの間隔はどうなったかというと

ぴったり900msというわけではありませんでした。
起動して安定する後半の値を取れば 6DDE=28126。28126 x 32 = 900.032ms

もう少し時間分解能を上げるとか、一度に全体を測るとか工夫しないとデータのばらつき具合の解消ができないかも知れません。