HP Z3816A GPS レシーバを活用した NTP サーバー
Z3816A locked to GPS
自宅に Hewlette Packard (以下 hp) の基準周波数発生用 GPS レシーバ HP Z3816A を設置した。 ドメイン名が finetune.jp っていう割にはうちには周波数基準が無かったので、 ちょっと嬉しい。 ここのところのマイブームが ntpd だったので、これを利用して finetune.jp 用 Stratum 1 NTP サーバーの運用を開始した。 [Jun.14, 2005]
ntpd から見た offset の変動も ±4μs 以内 (>5σ) に収まっているようである。 [Jul. 10, 2005]

  1. 概要
  2. アンテナ設置
  3. 装置概観
  4. PPS インターフェース
  5. シリアルインターフェース
  6. PPS 割り込み応答遅延
  7. HP Z3816A の設定
  8. kernel のリビルド (FreeBSD 4.11-STABLE)
  9. ntp のビルドと設定 (ntp-4.2.0)
  10. ntpd の動作
  11. ヒントと気になる点
  12. システムクロック交換(SPXO→VC-TCXO)
  13. アンテナ交換(58504A→58532A)
  14. PPS インターフェースを変更してみる
  15. 後書き
  16. サーバー更新
  17. 参考文献

§1 概要

今回利用した HP Z3816A は主にアメリカ合州国の CDMA 携帯電話の基地局の同期用に 使われた周波数標準器で、hp (現 Agilent) がこの部門を Symmetricom に売却 するのに伴ってか、一時期中古市場に沢山放出されたもののひとつである。 この標準器は内蔵のオーブン補償水晶発振器 (OCXO) の長期にわたる周波数を調整する ための正確なタイミングデータを GPS 衛星を追跡することにより得ている。 GPS に同期しているときには 1e-12 / day 程度、保持モードのときでも 内蔵 OCXO (MTI 260 シリーズ) の性能より 1e-10 / day 程度の周波数精度が期待出来る。 この装置から出力される 1 秒パルス (PPS) 信号は GPS に同期しているときには 協定世界時 (UTC) から 1μs 以内になっている(TFOM = 3 の時)。 またシリアルポートからは 時刻予告出力等が得られるので、このデータと PPS 信号をワークステーションに 入力してやることにより安価かつ簡単に Stratum 1 NTP サーバーを構築することが出来る。 ワークステーションには、コストパフォーマンスとそのマザーボードの作りの良さから hp のデスクトップ PC MT d330 uT を オペレーティングシステムには、PPS-API で一日の長がある FreeBSD を採用した。


§2 アンテナ設置

[重要 : アンテナは後に交換した。 §13 参照のこと]

まずはアンテナを設置しなければ話は始まらない。近所で サン電子の(衛星放送受信パラボラアンテナ用)マスト SAB-500J を調達して、 hp の GPS Antenna Assembly HP 58504A をマウントした。

[fig.1 HP 58504A annterna and mount base]
 GPS antenna

マストの上端から 11mm のところに M5 のタップを 120°間隔で 2 箇所切って アンテナ本体には 3M の VEM313 を W20 x L100 を巻いてスペーサ兼ダンパーにし、 アンテナとマストトップ間には t1 x D42 のオレフィン系エラストマー(Olefin Plastic Elastomer)ゴムを入れた。

[fig.2 HP 58504A anntena]
 GPS antenna

§3 装置概観

HP Z3816A にアンテナを接続し、電源を入れて1時間程で GPS に同期したところ。 今までに学習していた内部のキャリブレーションデータが壊れるおそれがあるので、 アンテナを接続せずには電源を入れない方が良い。この場合や、 適切なアンテナが正しく接続されていないときなど、アンテナへの供給電流が規定の 範囲外の場合には Alarm が点灯するはずである。

[fig.3 Z3816A front pannel]
front panel

出力を確認してみた。10MHz 出力は 50Ω 出力であるが、 PPS 出力は 0-5V のロジックレベル出力のようである。 図示していないが 19.6608MHz 出力 も 0-5V のロジックレベルであった。

[fig.4 Z3816A 10MHz Output (Rload=10MΩ||13.3pF)] [fig.5 Z3816A PPS→Serial output delay]
10MHz waveform PPS to TxD delay

§4 PPS (Pulse per second) インターフェース

[重要 : PPS はアップエッジでキャプチャされる。 §11, §14 参照のこと]

ntpd で kernel PPS を使用出来るようにするため PPS-API 用に、 サーバーのパラレルポートの *Ack 入力に (Z3816A の) PPS をインバートして接続する インターフェース (以下 PPS-I/F) を次の様に作成した。 手元の部品で間に合わせに作ったのだが、 パラレルポートの入力がプルアップされていることを利用して オープンドレイン接続にしたため、別に電源を必要としないのは利点である。 FET には RENESAS の高速度電力スイッチング用 (4V 駆動) MOS FET 2SK1772 を使用した。

[fig.6 Z3816A PPS-I/F]
PPS to PPI-ack interface

インターフェースケーブル長は 0.67 m である。 整合されているわけでは無いのであまり長くすることは出来ない。 PPS-I/F の回路図と、サーバーのパラレルポートに接続した状態での測定結果を次に示す。 [Jun. 8, 2005]

[fig.7 PPS-I/F schematic] [fig.8 PPS PPS-I/F input/output waveform (Input=Z3816A PPS)]
PPS to PPI-ack interface schematic *PPS propagation delay
[fig.9 PPS-I/F turn-on delay (BW > 100MHz)] [fig.10 PPS-I/F turn-off delay (BW > 100MHz)]
*PPS on delay *PPS off delay
PPS のパルス幅は Agilent 53131A にて tpw=20.751,845μs (σ=456ps, N=100, Vth=1.4V) であった。 [Jul. 14, 2005]

後日、隣の部屋にある Stratum2 の NTP サーバーのために PPS信号をフォトカプラで絶縁して接続するインターフェースを作成した。 別に電源を用意しないで済むように、アナログ伝送用のフォトカプラ Avago (旧 Agilent (旧 Hewlett Packard)) の 6N135 を用い、 フォトダイオードのバイアスは、パラレルポートの入力プルアップから得ている。 立上り時間の改善のために出力トランジスタを東芝のミキサ用ショットキーバリアダイオード 1SS154 でクランプし、 また、ベースに蓄積電荷の放電用の抵抗を追加してある。 基板は他の用途に作成していたものを流用した。

[fig.11 Isolated PPS I/F ] [fig.12 Isolated PPS I/F propagation delay]
Isolated PPS I/F Isolated PPS I/F propagation delay
[fig.13 Isolated PPS I/F schematic]
Isolated PPS I/F schematic
[May. 31, 2012]

§5 シリアルインターフェース

Z3816A と PC 間のシリアル接続用ケーブルは手元にあった次のような接続の クロスケーブルを使用したが、 Z3816A にはフロー制御信号の RTS/CTS は無いので、 この接続 (7, 8 ピン) は不要である。 PC 側の DSR-DTR (6, 4 ピン)の接続は、アプリケーションによってはこの接続が無いと シリアルポートが使えない場合があるのであった方が良い。 Z3816A の DCD ピンは N.C. になっているので PPS 信号を後述の DCD ピンから PC に入力したい場合には別途接続する必要がある。

[fig.14 GPS serial connection cable]
gps-pc serial cable

PPS-API 用にはシリアルポートの DCD (Data Carrier Detect) 入力に入れた PPS 信号も扱うことができるが、 シリアルポートには通常、数100kHz 以下の帯域制限がかかっているため μs オーダーで遅延が増加する可能性がある。それで今回はパラレルポート接続にしたが、 シリアルポート接続にする場合、MAX232A などの昨今の RS-232C インターフェース IC のレシーバでは、スレッショルド電圧がほぼ TTL 互換になっているものが多く DCD 入力に Z3816A の PPS 出力の様な 0-5V の PPS 信号を (接続ケーブル長が短かいのならば) 直結できるものも多い。 この場合 RS-232C ドライバを余分に使わずに済むのでその分 (数 100ns オーダー) の遅延が発生せずに済む。

Part numberVTL(min) [V]VTH(max) [V]Hysteresis(typ) [V]
ADM222/232A/242(5V)0.82.40.4
MAX232A(5V)0.82.40.5
MAX3380E(3.3V)0.62.40.3
MAX3380E(5V)0.82.40.3
MAX3222E/3232E(3.3V)0.62.40.5
MAX3222E/3232E(5V)0.82.40.5
実際に Z3816A の PPS をいくつかの PC のシリアルポート (の DCD) に接続して、
./ntp-4.2.0/util/pps-api /dev/cuua0
のようにして確かめてみたが、どれも PPS 信号を取得出来ているようであった。 [Jun. 10, 2005]


§6 PPS 割り込み応答遅延

[重要 : PPS はアップエッジでキャプチャされる。 §11, §14 参照のこと]

FreeBSD に実装されている PPS-API ではモニター用に PPS 割り込みに対する 応答信号(エコー)を発生させることができるので、 測定用に ./ntp-4.2.0/util/pps-api /dev/pps0 を実行させて観察した。 PPS-I/F に接続した Z3816A の PPS 信号からエコーまでの遅延時間の様子を fig.15, fig.16 に示す。
エコーはパラレルポートのオートラインフィードピン (fig.7 では CN2 の 14 ピン) に出力される。

[table.1 披測定装置(D.U.T.1)諸元]
ワークステーション Hewlette Packard MT d330 uT
プロセッサ Intel Pentium4 processor 2.4C (200MHz FSB, 512KB L2 cache)
チップセット Intel i865G
主記憶装置 Samsung K4H560838E-TCCC 512MB * 2 (DDR400-3-3-3-8)
外部記憶装置 HGST HDS722516VLAT80 * 2(160GB RAID1/Promise FastTrack TX2000)
オペレーティングシステム FreeBSD-4.11-STABLE
特記事項 kernel compiler and its options
 gcc version 2.95.4 20020320 [FreeBSD]
 COPTFLAGS = -O -march=pentium
Hyper Threading Technology is enabled by BIOS and sysctl
 machdep.hlt_logical_cpus=0
 machdep.hyperthreading_allowed=1

[fig.15 PPS→Echo delay (D.U.T.1, fcore=2.4GHz)] [fig.16 PPS→Echo jitter (D.U.T.1, fcore=2.4GHz)]
PPS to Ack delay PPS Ack jitter
D.U.T.1 では、エコー遅延はおよそ 39.5 〜 44μs の間に集中しているが、 たまに 48.1μs にもなることがあるのが分かった。 (但し PPS パルス幅と PPS-I/F 遅延分を含む) [Jun. 14, 2005]
次の示すように D.U.T.1 とほぼ同じ構成でプロセッサの速度が違うシステムで同様のテストを してみたら、エコー遅延はおよそ 31.5 〜 34μs の間に集中していて、 たまに 36μs にもなることがわかった。 このことからプロセッサのクロックが高い方がジッタも遅延も少なくなることが 確認できたがバスブリッジによるジッタや Pentium 4 の様な深いパイプと大きな キャッシュを持つプロセッサのハードウェア割り込みに対するレイテンシや ジッタへの影響も気になるところである。 [Jun. 17, 2005]
[table.2 披測定装置(D.U.T.2)諸元]
ワークステーション Tyan S5101ANNRF
プロセッサ Intel Pentium4 processor 3.0 (233MHz FSB, 512KB L2 cache)
チップセット Intel i875
主記憶装置 Samsung K4H560838E-TCCC 512MB * 2 (DDR466-3-4-4-8)
外部記憶装置 HGST HDS722516VLAT160 * 4(320GB RAID0+1/Promise FastTrack TX2000)
オペレーティングシステム FreeBSD-4.11-STABLE
特記事項 kernel compiler and its options
 gcc version 2.95.4 20020320 [FreeBSD]
 COPTFLAGS = -O -march=pentium
Hyper Threading Technology is enabled by BIOS and sysctl
 machdep.hlt_logical_cpus=0
 machdep.hyperthreading_allowed=1
[fig.17 PPS→Echo delay (D.U.T.2, fcore=3.5GHz)] [fig.18 PPS→Echo jitter (D.U.T.2, fcore=3.5GHz)]
PPS to Ack delay PPS Ack jitter

§7 HP Z3816A の設定

Z3816A の設定はシリアルポートから行う。

コマンドコメント
:SYSTem:COMM:SER1:BAUD 9600;PARITY NONEシリアル通信速度を標準設定の 9600 Baud パリティ無しに設定
*CLSエラー解除
PTIMe:TCODe:CONT 0非連続モードに設定
:SYSTem:COMM:SER1:FDUP 0デュプレックスをオフに設定
:DIAG:GPS:UTC 1UTC 時間に設定
:PTIMe:TCODe:FORMat F2出力フォーマットを F2 に設定
余談だが連続モードのときには1秒ごとに出力されるデータのフォーマットは F1 になるようである。
この Z3816A の識別情報を確認したところ以下の情報が得られた。
コマンドコメント結果
*IDN?製品 IDHEWLETT-PACKARD,Z3816A,3710A00335,4001-A
:DIAG:IDEN:GPS?内部 GPS 受信器 ID "COPYRIGHT 1991-1997 MOTOROLA INC.", "SFTW P/N # 98-P36848P ", "SOFTWARE VER # 3 ", "SOFTWARE REV # 1 ", "SOFTWARE DATE May 28 1999", "MODEL # R5122U1154 ", "HWDR P/N # 5 ", "SERIAL # R06OIE ", "MANUFACTUR DATE 9L08 ","
:SYSTem:STATus?フォーマット済みステータス出力…省略… (HP SATSTAT と同様)


§8 kernel のリビルド (FreeBSD 4.11-STABLE)

[重要 : PPS インターフェースを変更してみるのに伴い /usr/src/sys/dev/ppbus/pps.c も変更した。§14 参照のこと]

FreeBSD-4.11-STABLE カーネルのコンフィギュレーションファイルに次の行を追加/修正してカーネルをコンパイル、インストール。
PPS 信号をパラレルポートの *ack (Dsub25-10) に接続している場合には pps デバイスが必要。
シリアルポートから取得する時刻のジッタは シリアルポートの FIFO を使用しないようにした方が低減出来たが 所詮 ms オーダーのことで、 時刻精度の方は PPS に任せるのでこれはあまり気にしなくて良い。


options         PPS_SYNC

device          pps             # Pulse per second Timing Interface

device          sio0    at isa? port IO_COM1 flags 0x02 irq 4 # disable FIFO


cd /usr/src
make buildkernel
make installkernel
reboot

デバイスファイルの作成
GPSレシーバのシリアル入出力を PC の COM1 に接続していて、PPS 信号はパラレルポート0 の *Ack に接続している場合。


cd /dev/
ln -s /dev/cuaa0 /dev/hpgps0
sh MAKEDEV pps0


§9 ntp のビルドと設定 (ntp-4.2.0)

ntp-4.2.0 を ATOM と HPGPS ドライバ付きで configure してコンパイル、インストールする。


cd ntp-4.2.0/
./configure --enable-ATOM --enable-HPGPS
make
make install

ntpd がリファレンスクロックを参照するように /etc/ntp.conf を設定し、 システムに合わせて遅延補正値も設定する。 kernel PPS を利用するには PPS ドライバの flag3 をセットする。 ついでにログファイル関係も設定する。

[/etc/ntp.conf の設定例 (ristrict 関係は省略)]

logfile /var/log/ntp.log
driftfile /etc/ntp.drift
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

# Atomic pulse per second interface
# Fudge flag3 controls the kernel PPS discipline: 0 for disable (default), 1 for enable.
# Fudge time1 is used to compensate the PPS acquisision delay.
server 127.127.22.0 prefer
fudge 127.127.22.0 flag3 1 time1 0.000028

# GPS_HP
# Fudge time1 is used to accomodate the timecode serial interface adjustment.
#   20.1ms + 25ms (24 characters at 9600 bps)
# Fudge flag4 can be set to request a receiver status screen summary, which
#   is recorded in the clockstats file.
server 127.127.26.0 prefer
fudge  127.127.26.0 time1 -0.9549 flag4 1

# Public stratum2 servers
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ring.nict.go.jp

# Local clock
server 127.127.1.0
fudge  127.127.1.0 stratum 10


§10 ntpd の動作

ntpd で PPS が正しく使えているか確かめるには、ntpd を起動した後 しばらく後に ntptime で確認した status に PPSSIGNAL が立ち、それから PPSTIME と PPSFREQ が立っていくのを確かめれば良い。

[ntptime 実行結果の例]

ntp_gettime() returns code 0 (OK)
  time c679dc18.3421e1c0  Sat, Jul  9 2005 14:16:08.203, (.203642110),
  maximum error 8390 us, estimated error 2 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset 0.754 us, frequency -0.003 ppm, interval 256 s,
  maximum error 8390 us, estimated error 2 us,
  status 0x2107 (PLL,PPSFREQ,PPSTIME,PPSSIGNAL,NANO),
  time constant 6, precision 0.001 us, tolerance 496 ppm,
  pps frequency -0.003 ppm, stability 0.006 ppm, jitter 1.012 us,
  intervals 2178, jitter exceeded 339, stability exceeded 0, errors 0.

status 0x2101 (PLL,PPSSIGNAL,NANO),
 ↓
status 0x2141 (PLL,UNSYNC,PPSSIGNAL,NANO),
 ↓
status 0x2341 (PLL,UNSYNC,PPSSIGNAL,PPSJITTER,NANO),
 ↓
status 0x2307 (PLL,PPSFREQ,PPSTIME,PPSSIGNAL,PPSJITTER,NANO),
 ↓
status 0x2107 (PLL,PPSFREQ,PPSTIME,PPSSIGNAL,NANO),

ログファイルも結構大きくなるし ntpd には無用なのでセットしない方が良いと思うが、 hpgps ドライバで flag4 をセットしておくと HP SATSTAT と同様のフォーマット済みステータス出力が 次の様に clockstats ファイルにロギングされる。

[フォーマット済みステータス出力]

------------------------------- Receiver Status -------------------------------
SYNCHRONIZATION ............................................. [ Outputs Valid ]
SmartClock Mode ___________________________   Reference Outputs _______________
>> Locked to GPS                              TFOM     3             FFOM     0
   Recovery                                   1PPS TI +100 ps relative to GPS
   Holdover                                   HOLD THR 1.000 us
   Power-up                                   Holdover Uncertainty ____________
                                              Predict  900 ns/initial 24 hrs
                                                
ACQUISITION ................................................ [ GPS 1PPS Valid ]
Tracking: 5 ____   Not Tracking: 3 ________   Time ____________________________
PRN  El  Az  C/N   PRN  El  Az                LOCAL    13:59:42     02 Sep 2005
  1  56 311   44   *14  78 191                GPS 1PPS Synchronized to UTC
  5  17  51   38   *16  13 235                ANT DLY  50 ns
  6  49 120   45   *22  11 198                Position ________________________
 25  43 309   40                              MODE     Hold
 30  51  41   53                              
                                              LAT      N  35:xx:xx.xxx
                                              LON      E 139:xx:xx.xxx
                                              HGT               +50.83 m  (GPS)
ELEV MASK 10 deg   *attempting to track       
HEALTH MONITOR ......................................................... [ OK ]
Self Test: OK    Int Pwr: OK   Oven Pwr: OK   OCXO: OK   EFC: OK   GPS Rcv: OK
Z3816A の稼働を開始して2ヵ月程で Holdover Uncertainty Predict が 2μs 程から 1μs 程に減って来ているのだが、 これは hp SmartClock (TM) Technology の学習効果だろうか。[Sep. 2, 2005]

§11 ヒントと気になる点

[ 重要 ] 最初は PPS-API の PPS_CAPTUREASSERT っていうのは パラレルポートの *Ack 入力のロジックレベルが 'Low' に なったときにアサートされると思っていたのだが 測定してみると逆で実はアップエッジでの割り込みになっていた。 ntp.conf には PPS の前縁(アップエッジ)からの遅延補正値を指定しているので ntpd の動作上には変わりが無いが微妙に気にくわない。 /usr/src/sys/dev/ppbus/pps.c を見ると割り込み時に *Ack 入力のレベル確認を しているようだが、これだとパルス幅の短い PPS 信号は取得できないので問題である。 実際、fig.7 のように入れてある(オープンドレイン)インバーターを入れなかった 場合には fig.8 の PPS 信号はうまくキャプチャ出来なかった。 普通は負論理の信号をアサートすると言えば 'Low' にすることだと言うのは 置いておいても、なぜこんな非常識っぽい (プルアップされている負論理 TTL 割り込み入力を正論理で使うと ノイズマージンが減少するし、アップエッジのジッタはダウンエッジに比べて多いし、 後段のレジスタでメタステーブルが発生する確率も高い) 方を選んでいるのかわからない。割り込みコントローラの都合なのか? この辺りの事情をご存知の方は教えて頂けると幸いである。 [Jul. 13, 2005]

ntpd から見て GPS_HP(0) の jitter が 4 ms 程度と余り良くないので Z3816A との通信速度を 19.2k baud に変更して ntpd にパッチをあてて試してみたが 余り違いは無かった。今は結局そのまま 19.2k buad で使用している。

まぁ、これは高精度の PPS(0) の方に同期していれば問題ないのだが、 NMEA ドライバ等と違い HPGPS ドライバはドライバの中から PPS-API を使って くれないので、ntp.conf の中で HPGPS と PPS の両方の server に対して prefer キーワードを付けなければ PPS(0) にロックし続けてくれなかった。

原因は不明だが ntp.conf の中で参照クロックだけを server にして、 それ以外の NTP サーバーを参照していないと PPS を取りこぼしたかのような不安定な動作をすることがあった。 これは Z3816A との通信速度や SIO の FIFO の設定を変えても変化が無かった。
Local clock (127.127.1.0) を server 設定しておくというのでも大丈夫のようだが、 システムクロックにはホールドオーバーできるほどの安定度がないので これを設定するのはためらわれる。 しかし、LAN の外側でのリンク断が発生した時にも上記の事象が発生するという事態が 生じたので、LAN 内にまで影響が及ぶのを防ぐためには Local clock も server に設定しておいた方が良さそうだ。[Jul.17,2005]

[ntpq -p -c rv 実行結果の例 (PPS fudge time1 = 40μs)]

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
oPPS(0)          .PPS.            0 l   41   64  377    0.000    0.040   0.004
+GPS_HP(0)       .GPS.            0 l   42   64  377    0.000   -0.292   3.379
 LOCAL(0)        LOCAL(0)        12 l   11   64  377    0.000    0.000   0.004
+xxx.xx.x-xxxxx. .GPS.            1 u   28   64  377   12.007    1.169   0.394
+xxxxx.xxxxx.xx. .GPS.            1 u   58   64  377   11.079    1.454   0.928
+xxxxx.x-xxxxxx. .PPS.            1 u   17   64  377   11.369    1.315   0.527
status=2174 leap_none, sync_atomic/PPS, 7 events, event_peer/strat_chg,
version="ntpd 4.2.0@1.1161-lyuka56-z3816a-r Tue Jun 14 00:47:14 JST 2005 (18)",
processor="i386", system="FreeBSD/4.11-STABLE", leap=00, stratum=1,
precision=-18, rootdelay=0.000, rootdispersion=1.534, peer=20516,
refid=PPS, reftime=c66d6915.f52e43d7  Thu, Jun 30 2005  3:38:13.957,
poll=6, clock=c66d693e.a99b2281  Thu, Jun 30 2005  3:38:54.662, state=5,
offset=0.040, frequency=0.007, jitter=0.001, stability=0.001

fig.15 や fig.16 のジッタの様子からみれば妥当であるが、 ntpd から見た PPS の jitter が 4μs 程度と当初予想していたより大きかった。 カーネルのコンパイルオプションとかで改善可能かも知れない。

ntpd の -N オプションを付けて優先度を上げておくと NTP クライアントから見て 若干ジッタが減るようである。


§12 システムクロック交換(SPXO→TCXO)

ワークステーションのシステムクロックはクロックジェネレータに接続された 水晶振動子で作られているため SPXO と同等の安定度しかないので、 これのジッタの影響も大きいのかもしれない(参考文献 5, 6 参照)。 PPS のキャプチャー時のジッタが μs オーダー、 システムクロックの変動による 1 秒ごとのジッタも μs オーダーと考えられるので、 今のところどちらが支配的とも言えない。fig.19 は ntpd の loopstats から見た オフセット変動の例である。

[fig.19 offset drift (SXO)]
 offset drift (SXO)

その後、ワークステーションのシステムクロックジェネレータ ICS 952606 の 4, 5 ピン に接続されている水晶振動子を外して、その 4 ピンに TC74SHU04FU でバッファした 14.31818 MHz の VC-TCXO の出力を入力するように改造してみた。 といっても Z3816A の 10MHz にロックさせているわけではないので、 制御電圧は基準電圧 IC LM236-5.0 から生成した電圧を印加している。

[fig.20 offset drift (VC-TCXO)]
 offset drift

ntpd の loopstats でみると周波数安定度は数倍改善され、スパイク的なオフセットの 変動も若干減って今のところ ±8μs 以内に収まっているようである。[Jul. 1, 2005]


§13 アンテナ交換(58504A→58532A)

GPS アンテナを恒久設置とするために同軸ケーブル配管を敷設し、 アンテナを HP 58504A から HP 58532A に変更した。 58532A は 1575.42MHz ±50MHz で 60dB(typ) の減衰量の狭帯域 フィルタが入っていて雑音の多い都市部では有利と考えたからである。 58532 は狭帯域フィルタが入っている割に NF が 1.8dB(typ) と 58504A の 1.5dB(typ) に比べて遜色がほとんど無い。 ついでに同軸ケーブルも 50ns 遅延のケーブル (N 型コネクタ付き フジクラ 5D-FB 約12.14m) に 交換し、アンテナケーブル遅延も再設定 (:GPS:ADELay 5E-8) した。 5D-FB はそもそも屋外用ではないので屋内に引き込むところまでは外径 18mm の硬質ビニル電線管(未来工業 VE-14J2, N-14J) 等で 保護している。

[fig.21 HP 58532A anntera] [fig.22 wire protection bend]
HP 58532A GPS L1 reference antenna cable pipe

ところが、58532A を Z3816A に接続すると Z3816A の ALARM LED が点灯する。 エラーステータスを見て(:SYSTem:ERRor?)もエラー無しなので、K8CU のサイトでも報告のあったように アクティブアンテナへの電流が少なすぎるのが原因かと思い 5V での電流を 測ってみた。58504A が約 27.5mA に対して 58532A が約 17.5 mA と約 10mA 少なくなっていたのでやはり少なすぎるようだ。でもまぁ、 アンテナの故障検出以外に実害は無いので(今のところは)気にしないことにしている。

アンテナ交換のついでに VC-TCXO の制御電圧用基準電圧を TL431CLP とその定電流源 用の 2SK117BL に交換した。 TL431C のダイナミックインピーダンスが 0.2 Ω(typ) と LM236-5.0 に比べ 約 1/4 と低いので電源雑音に起因する変動が改善されるかもと考えたからである。 結果は、fig.23 のようにゆっくりとした変動もスパイク状の変動も随分改善されて ±4μs 以内になったように見える。同時にアンテナと制御電圧回路を変更したのでアンテナの特性と 基準電圧の特性のどちらがどういうふうに効いているのかはわからないが、 SPXO と 58504A より VC-TCXO と 58532A の方が良いのは間違いなさそうだ。 [Jul. 5, 2005]

その後一週間分のオフセット変動の統計をとったところ、サンプル数 N=9,390 で 標準偏差 σ=788ns であった。 5σ でも 3.94μs なのでオフセット変動は ±4μs 以内と言って良さそうだ。 [Jul. 10, 2005]

[fig.23 offset drift (VC-TCXO'+58532A)]
 offset drift
 (Jul/4/2005→Jul/10/2005, N=9,390, σ=788ns)
正規分布では m±&sigmaの間 に 68.2%,m±2&sigmaの間に 95.4%,m±3&sigmaの間に 99.73%, m±4&sigmaの間に 99.993,7%,m±5&sigmaの間に 99.999,943%

先に延べたようにシステムクロックの短期安定度は ntpd のポーリング間隔あたり PPS のジッタ未満であれば合理的とすれば 4μ / 64 から 3e-8 (per minute) 程度で十分といえる。 そう考えると SPXO では性能不足で TCXO で十分だろうということになって 今回の結果通りだが、PPS の取り込みジッタがもっと少ないとか ハードウェアタイムスタンパを使うのであれば システムクロック (14.318 MHz) は GPS レシーバの基準周波数出力にロックさせる (Z3816A の 10MHz * 63 / 44 = 14.318 MHz) 必要があるとも言える。[Jul. 6, 2005]


§14 PPS インターフェースを変更してみる

§11 で書いたように PPS 信号は 'High' レベルになったときにキャプチャされる ことがわかったので、fig.7 の PPS-I/F の Q1, R1 を取り除いて直結して試してみた。 以前のテストで、このままでは PPS を取りこぼすことがあったので list.1 の様に /usr/src/sys/dev/ppbus/pps.c の中の ppsintr() を余計な事をしないように シンプルに変更、また目安として時刻の取得の前後でエコー出力が変化するように も変更した。

[list.1 /usr/src/sys/dev/ppbus/pps.c 変更箇所]

static void
ppsintr(void *arg)
{
    device_t ppsdev = (device_t)arg;
    device_t ppbus = device_get_parent(ppsdev);
    register struct pps_data *sc = DEVTOSOFTC(ppsdev);
    register struct timecounter *tc;
    register unsigned count;
        
    tc = timecounter;
    ppb_wctr(ppbus, AUTOFEED);
    count = timecounter->tc_get_timecount(tc);
    ppb_wctr(ppbus, IRQENABLE);
    pps_event(&sc->pps, tc, count, PPS_CAPTUREASSERT);
}
[fig.24 PPS→Echo jitter (D.U.T.1, fcore=2.4GHz)] [fig.25 PPS→Echo average(256) (D.U.T.1, fcore=2.4GHz)]
PPS to Ack jitter (infinite persistance) PPS to Ack (average)

Agilent 53131A にて計測したところサンプル数 N=100, Vth=1.4V で、PPS→Echo の遅延は

tdPPS↑Echo↓= 5.795μs (σ=794ns) 
tdPPS↑Echo↑=10.854μs (σ=765ns)
であった。結局、PPS→時刻取得の遅延はおよそ 8μs 辺りかなというところか。 [Jul. 14, 2005]

その後、このままで数日試してみたところ、原因は不明だが一日に数回の頻度で 数 10μs のスパイク的遅延が発生するようになり、またジッタもやや増加したので 元のインターフェースに戻し、pps.c も list.2 のようにエコー出力の前に時刻を取得するように変更した。 [Jul. 18, 2005]

[list.2 /usr/src/sys/dev/ppbus/pps.c 変更箇所]

static void
ppsintr(void *arg)
{
    device_t ppsdev = (device_t)arg;
    device_t ppbus = device_get_parent(ppsdev);
    register struct pps_data *sc = DEVTOSOFTC(ppsdev);
    register struct timecounter *tc;
    register unsigned count;
        
    tc = timecounter;
    count = timecounter->tc_get_timecount(tc);
    ppb_wctr(ppbus, AUTOFEED);
    ppb_wctr(ppbus, IRQENABLE);
    pps_event(&sc->pps, tc, count, PPS_CAPTUREASSERT);
}
[fig.26 PPS→Echo jitter (D.U.T.1, fcore=2.4GHz)] [fig.27 PPS→Echo average(256) (D.U.T.1, fcore=2.4GHz)]
PPS to Ack jitter (infinite persistance) PPS to Ack (average)
Agilent 53131A にて計測したところサンプル数 N=256, Vth=1.4V で、PPS→Echo の遅延は、PPS パルス幅を含み
tdPPS↑Echo↓= 30.598μs (σ=733ns) 
tpwEcho↓Echo↑=1.912μs (σ=50ns)
先の計測結果と合わせて考えると間をとって結局 PPS→時刻取得の遅延は 28μs というところだが、 UTC に対してシステム全体で ±10μs くらいの時刻確度だろうか? [Jul. 19, 2005]


§15 後書き

1.000,000,000,00Hz 今回自宅に stratum1 を構築することになったのは、非対称な伝送速度の 通信路における ntpd の問題点を解決しようと色々と試していて LAN 内に stratum1 が欲しくなっていたのと、それまで 外部の公開 NTP サーバーを利用して ±500μs 程度の安定度が 得られていたのが、ある日を境に地元 CATV 系の ISP とその上位間で 1 秒近い ピーク遅延/ジッタが発生するようになってお話しにならなくなったのと、 また その ISP の兼ねてからの大雑把なメンテナンスに起因する年平均 1 ‰ を越えるリンクダウン率と回数に愛想をつかしたのがきっかけである。
そもそもは基準周波数用に導入した hp Z3816A GPS レシーバであるが、 これの時刻出力と PPS 出力を利用することにより、 ついでに stratum1 NTP サーバーを構築することが容易にできた。 PC ワークステーションを NTP サーバーとして動作させるために水晶交換以外に 特別なハードウェアの改造を行わなくても ntpd から見て ±4μs 以内の 安定度を得ることが出来ている。
GPS の受信環境をもっと整え、タイミング専用のハードウェアを追加すれば数 100 ns 程 の安定度にすることも可能だがイーサネットで接続している限りあまり意味が無さそうだ。 自宅の LAN 環境では 100base/TX 接続の stratum2 用サーバー (TCXO 仕様)では スイッチングハブを 2 段経由して ±30μs 程度の変動に、 LAN 内の 1000base/T 接続のファイルサーバーではスイッチングハブを 2 段経由して ±150μs 程度の変動にまで時刻安定度が劣化している。 とはいえ、通常の使用には十分な時刻精度が得られているので有効にこの環境を 利用できそうである。
また、冗長系用に別の GPS アンテナ (hp 58532A) とレシーバ (hp Z3801A, hp Z3816A) も用意したが天候の多少違う別ロケーションで使うことになりそうである。

§16 サーバー更新

電源の保守の関係で NTP サーバーを下記のものに更新した。
それに伴い、VC-TCXO の制御基準電圧源を TL431C より安定度の高い (i.e. 0.5ppm/℃typ, 2ppm/Vtyp) Maxim MAX6325CSA に交換した。
また、VC-TCXO の温度による短期変動特性改善のため、温度勾配を減らし、かつ急な温度変動を緩和するために熱容量を増大させる目的で 65g の銅ブロックを VC-TCXO に付加した。

[table.3 披測定装置(D.U.T.3)諸元]
マザーボード Tyan S5102G3NR
プロセッサ Intel Pentium4 processor 3.06 (133MHz FSB, 512KB L2 cache)
チップセット Intel i875P
主記憶装置 Samsung K4H560838E-TCCC 512MB * 2 (DDR333-2.5-3-3-7)
外部記憶装置 HGST HDS722516VLAT80 * 2(160GB RAID1/Promise FastTrack TX2000)
電源装置 Seasonic SS-460HS/S
オペレーティングシステム FreeBSD-4.11-STABLE
局所発振器 Kinseki(KSS) VC-TCXO-43C with Maxim MAX6325CSA voltage reference
特記事項 kernel compiler and its options
 gcc version 2.95.4 20020320 [FreeBSD]
 COPTFLAGS = -O -march=pentium
Hyper Threading Technology is enabled by sysctl and in the BIOS settings.
 machdep.hlt_logical_cpus=0
 machdep.hyperthreading_allowed=1
The parallel port is set to the ECP mode in the BIOS.

[fig.28 VC-TCXO] [fig.29 TCXO buffer] [fig.30 Clock generator]
VC-TCXO TCXO buffer Clock generator
[fig.31 PPS→Echo delay (D.U.T.3, fcore=3.06GHz)] [fig.32 PPS→Echo jitter (D.U.T.3, fcore=3.06GHz)]
PPS to Ack delay PPS Ack jitter

Agilent 53131A にて計測したところサンプル数 N=900, Vth=1.4V で、PPS→Echo の遅延は、PPS パルス幅を含み

tdPPS↑Echo↓= 32.7688μs (σ=893.1ns) 
tpwEcho↓Echo↑=1.1386μs (σ=57.7ns)
であった。内部クロックが 3.06GHz に速くなったにもかかわらず応答時間は D.U.T.2(Pentium4-2.4C) よりも遅くなっていて、 またジッタも増大している。
FSB が 400MHz から FSB 333MHz と遅くなったのが原因だろうか。
[Jan. 10 2009]

この増大してたジッタだが、 前のマザーボードでは ICS のクロックジェネレータ にヒートシンクを張り付けていたので、同様にヒートシンクを張り付けたところ 元のレベルに改善した。
温度によるクロックジェネレータの入力ピンのところの容量の変動が バッファを介して僅かに VCTCXO に影響を与えていたと思われる。
[May. 12 2012]


§17 参考文献

  1. K8CU Real Ham Radio.com/Z3801A Receiver Main Page
  2. www.febo.com - Time and Frequency Measurement
  3. Z3801A GPS receiver modifications (by Jeff@mock.com)
  4. LeapSecond.com - web site dedicated to precise Time & Frequency
  5. NTP server using PC gnu/linux and freebsd
  6. PC-UNIXとGPSによる Stratum-1 NTPサーバの構築と評価
  7. 国立天文台/佐藤克久 - GPS時刻同期型NTPサーバーの時刻精度関連
  8. [PDF] Agilent AN 1289 - The Science of Timekeeping
  9. [PDF] 高安定 PC によるネットワーク計測
  10. Using a Global Positioning System (GPS) receiver as a NIST traceable frequency reference
  11. [PDF] Time and Frequency Measurements using the Global Positioning System
  12. [PDF] ハードウェアSNTPサーバの開発
  13. [PDF] PCにおける時刻精度の精密計測とその評価
  14. www.ntp.org/ntpfaq/
  15. rfc.net RFC-1305 Network Time Protocol
  16. rfc.net RFC-2783 PPS interface
  17. [PDF] The Nanokernel
  18. ntp.ring.gr.jp
  19. www.jst.mfeed.ad.jp
  20. NTP - wiki@nothing
  21. www.freebsd.org
  22. Hewlett-Packard
  23. Agilent Technologies
  24. Symmetricom, Inc.
  25. OSCILLOQUARTZ
  26. Stanford Research System
  27. MTI-Milliren Technologies, Inc.
  28. NTP for Windows NT/2000/XP
  29. David W. Allan
  30. NTP うるう秒
  31. Jhon Miles, KE5FX

www.finetune.co.jp [Mail] Copyright (c) HOSODA Takayuki. All rights reserved.