GPSモジュール AE-GYSFDMAXB の、1PPS出力を調査

2016.8.30 回路ソースなど追加>

 経過時間や時刻を、複数のスタンドアローン装置間(電池駆動)で高精度に合わせるには、精度の高い水晶発信器でマイコンを動作させ、有線接続で同期を取って、後は水晶の精度での誤差で動作させ、あとからあらかじめ測定しておいた固体差で補正するという方法が手ごろなのですが、使い始めに同期を取るという作業が必要になるので、離れた場所ではそもそも同期を取るという作業を行えないので、なんらかの時刻合わせが必要になってきます。電波時計という方法もありますが、こちらは1ms以内なんて精度は無理なようです。

 そこで、GPSモジュールを使うと、これがいとも簡単に行えるようになることが、最近になって気付き、早速確認してみることにしました。使用したGPSモジュールは、秋月電子通商から入手できる、AE-GYSFDMAXB です。ここで、1PPS出力付きというスペックが重要で、この1秒に1回のパルスは、GPSモジュールが衛星を補足して位置計測をしている状態になると、各モジュール間で、高精度に(カタログ値では、±0.01 ppm 。)同期がとれているのです。この精度は、1秒にたいして±10nsの誤差で、100秒たっても差は100倍にはならず、±10nsです。無論、±10nsは、電波状態が良い場合と思われ、鉄筋建造物の中ではもっと誤差が大きくなると思います。
 とりあえず、2台のPGSモジュールを窓際で動作させ、1PPS出力信号をオシロで観察すると以下のようになりました。1PPSの信号の差は、5nsとなっていますが、観察していると、20nsほど前後にずれるようです。図の左は、GPSモジュールの購入先にあった、MiniGPS です。秋月電子通称



2台のGPSモジュール、AE-GYSFDMAXB を動作させ、差を記録 

 2台のGPSモジュールの1PPS信号を正確な100MHzでインターバルを計測します。正確な100MHzのクロックは、FPGAの評価基板のものではなく、温度補償機能付きの水晶発信器(TCXO)のクロックとします。100MHzのものは入手できないので、10MHzの発信器の信号をFPGA内のクロックマネージャー、MMCMを使って100MHzとします。
 装置のブロック図は以下のようになります。FPGAは、Artix7 を使った、Digilent のARTYです。
こちらが→ 回路のソース、 bit, bin ファイルです。
ここには、ファームウエアのソース、コンパイル用 makefile を含みます。フォルダは、gpstest3.srcs\new\15artycmb です。

 1PPSの信号の周期を100MHzでカウントし、信号の立下りでラッチして同時にクリアします。このとき、ラッチしたカウント値のLSB8ビットを、8ビット個別に書けるメモリに記録して、あとからCPUで読み出します。記録数は、4096なので、1時間以上の記録ができます。カウント値はほとんど変化しない値になるので、LSB4ビットでも十分と思われます。実際記録すると、32ビットのレジスタに、0x05F5E0CCを中心として、±1以内にほとんど収まります。この値は、十進で、99999948 となり、GPSモジュールが出す1PPSが正確な1秒だとすると、TCXOの周波数は、9.9999948MHzと解釈できます。公称10MHzに対して、5.2Hzの誤差なので、0.52ppmの誤差です。使っているTCXOは、秋月電子通商から入手した、セイコーエプソンの、TG-5021CE-10N です。周波数温度特性は、±2.0 ppm ( −30℃ 〜 85℃ )で、他にも変動幅がありますが、±0.2ppmほどですから、仕様を十分満足していると言えます。ちなみに、100MHzのクロックを、FPGA評価基板内臓の水晶に変えると、カウント数は、0x05F5DD8Bとなり、99.999115MHzなので、8.85ppmの誤差でした。

 TCXOを実測した、5.2ppmの誤差は、1日では、0.045秒で、1日で45msという正確さです。無論これは、GPSモジュールが正確に±10nsで1秒を出力しているという前提です。
 以下は、24分間ほど記録を取り、2台の1PPSのインターバルの100MHzカウント値を、LSB 8ビットだけCSVで抜き出し、グラフにしたものです。204がほぼ中心値で、これは、0x05F5E0CCの、0xCCになります。ほとんどが、203〜205に収まっているのが判ります。たまに、202という値になっています。


 上のグラフでは、判りにくいので、2台の1PPSのインターバルを、100秒間の平均の値にし、さらに、LSB 8ビットではなく、全体の数値をグラフにすると、以下のようになりました。ここで、系列1、2が、2台のGPSモジュールの意味で、ほぼ同時に変化しているところから、変化そのものは、TCXOの周波数の変動であり、ほぼ同時に変化していることで、GPSモジュールの1PPSが正確に一致していると判断できます。グラフの縦軸の、99999948.0000は、10MHzの信号を10倍した周波数に換算しており、実際は、9.9999948MHzになります。このグラフでの最大、最小は、100MHzに対して0.3Hz変動していることになりますが、この変動が、TCXOの周囲温度によるものなのか、電源電圧によるものなのか、不明ですが、GPSモジュールの1PPS信号を用いると、微小な変動も観察できるようです。




2台のGPSモジュールの1PPS信号のインターバルを記録する回路 

 正確さは、GPSの精度には劣りますが、何らかのできるだけ正確な測定用クロックとして、温度補償された、水晶発信器を用いますが、秋月電子通商で入手できたものは、セイコーエプソンの、TG-5021CE-10N です。ただこの発信器の出力は、CMOSレベルではなく、P−Pで最低0.9Vというものなので、そのままFPGAの端子に入力しても使えそうにないので、東芝のワンゲートCMOS、LMOSで、波形整形します。以下がその回路です。


 TCXOの周波数が、10MHzなので、そのままでは、100nsの確度でしか測れないので、Artix7 FPGA内のクロックマネージャ、MMCMで10倍にして、100MHzでLow,Highをサンプリングします。Artix7 なら、200MHz〜250MHzでもカウントでき、さらに、クロックの立ち上がりと立下りでサンプリングしたものを合成すれば、実質的には、400MHz〜500MHzでの測定ができますが、とりあえず、100MHzで行います。GPSの1PPS信号を100MHzでサンプリングしても、結局、100MHzでのカウント値の変動は、100MHzの正確さがどれほどなのかを測定することになります。つまり、TCXOの方がGPSの1PPSによって逆測定されるということです。
 このことは、GPSモジュールをドライヤーであたためてもカウント値はほとんど変化しないが、TCXOを温めると、見る見る内に、カウント数が変化することで、確認できます。

以下は、2台のGPSモジュールが衛星を補足して位置計測をして、記録を残しているRAMを、CSVでダンプしたスクリーンショットです。

 上の図の例は、記録したRAMの先頭を、0xC002000として、0x20バイト(2台のカウンタ値のLSB8ビットが16ポイント)をCSVでダンプさせたものです。一番上の Custom MicroBlaze ARTY 2016.8.28-1 は、FPGA内に作成した、SoCの起動プロンプトです。
CBM-Bug>dgC002000,c002020 の、dg は、CSVでダンプする命令で、引数は、始まりアドレス、終りあドレスの2個で、 ',' で区切っています。CSVのデータの最初の数値は、先頭からの通し番号で、次が1台目、その次が2台目の、1PPSのインターバルを、100MHzでカウントした値のLSB8ビットのみを10進で表しています。

 FPGA内 マイクロブレーズSoCのファームウエアでの命令で、他に以下のものがあります。
ファームウエアの操作
機能
 命令 
 備考 
1PPSインターバルカウンタのクリア
 slfff0007c,0 
 2台のGPSからの1PPSのカウンタを同時にクリア 
SoCのメモリダンプ
 dc002000,c00207f 
 2台の1PPSのログデータをヘキサダンプ、128バイト 

 FPGA内 マイクロブレーズSoCのレジスタには、以下のものがあります
SoCのレジスタ
アドレス
 ビット幅 
 R/W 
 機能 
0xFFF0005C
 32(1ロングワード) 
 RO 
 CPUの100MHzで1台目の1PPSのインターバルをカウントした値 
0xFFF00060
 32(1ロングワード) 
 RO 
 CPUの100MHzで2台目の1PPSのインターバルをカウントした値 
0xFFF00064
 32(1ロングワード) 
 RO 
 上記2個の値の差 
0xFFF00068
 32(1ロングワード) 
 RO 
 TCXOの100MHzで1台目の1PPSのインターバルをカウントした値 
0xFFF0006C
 32(1ロングワード) 
 RO 
 TCXOの100MHzで2台目の1PPSのインターバルをカウントした値 
0xFFF00070
 32(1ロングワード) 
 RO 
 上記2個の値の差 
0xFFF00074
 16ビットの内、LSB12ビット 
 RO 
 1台目の記録用RAMの現在の値 
0xFFF00074
 16ビットの内、D12の位置 
 RO 
 1台目の記録用RAMアドレスが上限に達したとき1 
0xFFF00076
 16ビットの内、LSB12ビット 
 RO 
 2台目の記録用RAMの現在の値 
0xFFF00076
 16ビットの内、D12の位置 
 RO 
 2台目の記録用RAMアドレスが上限に達したとき1 



準備中


ホームに戻る

inserted by FC2 system