GPS にロックした基準発振器の試作

2017.03.27 JA1VCW

１． はじめに測定器の基準周波数として外部から正確な周波数を入力すると、測定精度が上がる場合が多くあります。 そのためになるべく高精度、高安定な発振器が欲しいと思いました。
正確な周波数を得る方法として JJY、カラーバースト（今は地デジになって不可）、ルビジウム発振器
GPS、などがありますが現実的にGPSにロックする方法にしました。
周波数は 10MHz やその倍数の周波数発振器が多く使用されます。 今回は10MHz としました。
実現方法など先達がいろいろと発表されていますが、今回は試作なので（いつも試作で終わりますが）前記を参考に自分で回路やプログラムを考えました。
この試作が理論的にに正しいかどうかは不明ですが、最終的に本稿のような結果が得られました。
２． 実現方法
２．１ 方法概略
いくつかの実現方法がありますが、主なものとしては
１）GPSモジュールからの1pps をカウンタのゲートとして可変水晶発振器の10MHz の周波数を測定し、その測定値が10MHz ちょうどになるよう発振器の周波数をコントロールします。
２）GPSモジュールから数10kHzのクロックをとりだしてそれを基準周波数として一般的なPLLを構成し、そのループフィルタの定数を考慮することによって、高純度の10MHz を得ます。
今回は次のような理由で、前記 ａ）の1pps を利用する方法で試作してみようと思いました。
１）GPSモジュールのほとんどが1pps 出力を有しています。 また、今回使用のモジュールは1pps 以外の周波数を取り出す方法が（方法はあるのかも知れませんが）分かりません。
２）比較的良い特性のOCXO（オーブン付き水晶発振器）がありました。
３）マイコンが余っていました。
４）こちらの方が作って面白そうだと思いました。
２．２ 検討１）GPS受信モジュールから得られる1pps = 1秒周期の信号は長時間平均すれば精度の高い信号です。
1秒ごとではジッタを有し、若干精度が落ちます。
今回使用したモジュールでは秋月電子製で、その取説によると1pps の確度は1秒±10ns なので数値にして確度 ＝ ±10ns／1秒 = ±（1E-8） 程度です。
このモジュールは太陽誘電の［GYSFDMAXB］を使用しています。
２）周波数を1/Nに分周すればジッタは1/Nになるので、確度が1pps に比べてN倍良くなるはずです。
この方法をうまく実現できれば性能向上になります。
３）全体の周波数コントロールは次のように行います。
①±10ns 程度のジッタがある1pps の信号は ±1E-8 程度の確度です。
②それを200秒累算して ±5E-11 程度の確度まで上げ、それを基準（ゲート信号）として
OCXO の周波数を測定します。
③測定した周波数が10,000,000.00Hz（2,000,000,000カウント@200秒ゲート）になるようOCXO をコントロールします。
４）10MHz のOCXO を使って高精度を期待しますが、OCXO も周波数がわずかながらふらつきます。
この短時間のふらつきは補正できません。 ３）の場合200秒に1回OCXO の周波数を補正しますがその間はOCXO の特性で自走しているので、OCXO の特性がそのまま現れます。
1

この200秒間のふらつきは実測して±0.8mHz 以下程度でしたので、今回の確度には大きな影響が無いと考えられます。 OCXO は外部から周波数がコントロールできるタイプを使用します。
５）ブロック図は次のようになります。

1pps

GPS module

N分周器
1/N

1/N Hz（今回N=200）

ゲート

OCXO
10.0・・0MHz

Counter

周波数 control
12bit
DAC

10MHz出力

差*係数

数値比較

10. 0・・0MHz

2

３． 追加検討
さらにもう少し条件や方法を検討します。
１）OCXOOCXO は付１．１のものを使用します。 OCXOでかつ周波数が外部電圧でコントロールできます。
２）CPU、カウンタ
CPUにはATmega64を使用しました。 理由はこのCPUが手持ちで余っていたためです。
もっと小さいATmega328でもIO数、プログラム容量は十分です。
ATmega64 では、16bit 2本のハードウェアカウンタ（ハードカウンタ）があるので1本を使用します。
このカウンタはCPUクロックの1/2.5以下で使用するように取説で指示されています。 入力部にCPUクロックと同期させる回路が入っているためです。 CPUクロックは16MHzなので入力周波数
6.4MHz以下となります。 従って10MHzをカウントするために1/2のカウンタを外部に接続します。
外部のカウンタの出力状態はCPU からリードできる必要があります。
全体のカウンタは次のように構成されます。
1bit（外部ハードカウンタ）+16bit（CPU内部ハードカウンタ）+15bit（ソフトカウンタ）
３）ハードカウンタは外部の1/2分周回路を含めて17bitありますので、1／131072になります。
10MHzを入力した時はおよそ13.1ms ごとにoverflowが発生し、それをインタラプトとしてソフトのカウンタをカウントアップします。 13msの間隔がありますのでプログラムは十分対応できます。
４）1pps の信号
1pps の信号はモジュール出力の立ち下がりのみが保証されているため、そのように使用します。
５）演算のbit長
BASCOMAVRを使用しますと、整数の数値としてはDword型が最大で4byteで32bit長です。
ただし、数値計算をするのでLong型を使用すると、 32bit（long） ≒ 2,147,483,647 なので10MHzをゲート1秒でカウントすると 2,147,483,647 /10,000,000 ≒ 214s までの数値が扱えます。
６）DA変換器（DAC）は安価な秋月電子の12bitのI2Cでコントロールするタイプを採用しました。
12bitが分解能として十分であるかどうかは後で検討しますが、現時点ではこれを使用します。
７）OCXO の周波数可変端子のドライブには電流が流せる（<2mA）必要があるので、op-ampを使用し且つLow noiseで単一電源のタイプを選びました。 ただし最大の電源電圧が低いので使用には注意が必要です。
８）ロジックICはスピードやレベルに応じて、適当なタイプ（HC,AC、HCTなど）を使用しています。
９）出力は５回路設けました。 各出力はサイン波でアイソレートしてあり、出力電圧は3Vp-p＠50Ω程度です。 出力のバッファアンプは2SK195を使用しています。 あまり馴染みの無いFETですが、なぜか分かりませんがたくさん持っていましたので使いました。
１０）ケースは壊れたカセットデッキを流用しました。 ハードオフでケースが適当な大きさで働かない物を買ってきました。 電源トランスが流用できるかと期待しましたが、若干電圧が低くて使用不可。
１１）ケース内のトランスが使用できませんので、外付けのACコンセントと一体になっている電源を使いました。 これは出力電流によって+13V～+15V程度までの電圧変動があります。 どうやら
トランスと整流器+フィルタ程度の様です。 したがって本体に低損失の12Vのレギュレータを付けました。 実験してはいませんが、SWタイプの電源はノイズを発生する可能性がありますので敬遠しました。
４． 確度目標mHz（ミリヘルツ）台を扱うことになりますが、どこまで可能かわかりません。
200秒Gateを使用しますと、カウンタのLSBは0.005Hzになりますので±1E-9 程度まで行けば上出来と勝手に考えます。
3

５． ブロック図や概略の動作など
５．１ ブロック図
前出のブロック図を現実的なものにします。
ATmega64
I2Cbus

DAC
12bit

DAcontol

ｿﾌﾄｶｳﾝﾀ
15bit

Drive用Buffer-amp

基準発振器

1/2 カウンタ

Gate

CK

D
CK

Q

Q

D

OCXO
10MHz

1pps

O

＊Q

I
5MHz

ﾊｰﾄﾞｶｳﾝﾀ

16bit（Timer1)

76Hz

cl

I
I
I
O

コントロール＊Q D-FFcl
Gate

ControlO

表示器（LCD）

５．２ 概略の動作
１）1pps のNパルス（=N秒ゲート）間OCXO の周波数をカウントし、次の１パルス分休んでその時に必要な処理をします。 従って1シーケンスはN+1秒です。
２）GateコントロールはD-FFを使用して、1pps に同期してopen／closeします。
３）Nはプログラムで設定できます。 N秒ごとの処理としては①カウントしたデータと理論値を比較。 差分をとります。
②差分から算出した適当な数値をDACに送ってその分の周波数を補正。
③Nは200以下の任意の数。 ただし切りの良い数字にしておかないとあとで検算が面倒。
今回は200（200秒ゲート）で動作させています。

パルス = N秒

N

パルス = N秒

N

1pps

Gate

Gate open

処理
4Gate open

６． ハードウェアのプログラムによるコントロール
これは私の個人的なメモなので分かりにくいところがあります。 同じものを作られる方もいないと思いますので、ソースプログラムは公開しません。
①

①

②

①

1pps

Gate
Enucntr

n-1

n

0

1

１）1pps の上がりのエッジを検出してａ）まず1pps のカウンタをupする。 すなわちEnucntr= Enucntr+1ｂ）Enucntrがnになったら、GateをLoにします。
２）1pps の上がりのエッジを検出してａ）Enucntrがn+1のとき（n秒カウントした時）、ｂ，ｃ，ｄを行います。
ｂ）カウンタデータを読み込み。
ｃ）理論値との差を算出。
ｄ）差が>0 又は<0によってDACにある値を設定することによって、OCXO の周波数を修正。
ｅ）次のゲートサイクルのための設定。 Enucntr= 0、ハードの初期化、ソフトカウンタの設定 etc.
ｆ） DFFDをHiにします。
３）最終的に理論値のカウント数に近づいて、その境界あたりを上下します。
４）数値のコントロールは、単純に測定値が理論値と同一になるようにします。
この詳細は付３．に述べます。
５）時々GPS受信モジュールからの1pps のパルスが止まる場合があります。 これは衛星を4個以上捉えていない場合に発生しますが、実験中ということもあってモジュールの置き場所によって割と頻繁に発生します。
これが発生した時はこの回の測定値を破棄して、あらかじめ記憶してあるひとつ前の値（カウント値
やDAC の数値）を採用するようにプログラムします。
一度DAC の数値が変わってしまうと、元に戻るのに時間がかかりますので、それを防止します。
６）エラー表示について
LCDディスプレイが付いているので、モニタとして内部の状態を表示するようにしました。
表示フォーマットは気分によって変えてしまうことがありますのでここでは示しませんが、
ａ）カウント値ｂ）DAC にセットする数値
ｃ）1pps の累計回数ｄ）エラーおよびGPS-ロック表示
このなかでｄ）のGPS-ロックにつきましては、明確な条件としては良くわからないので、付３．のように行っています。 これが本当に正しいかどうかわかりません。
・GPS-ロック ： 現時点では付３．のようにしてあります。 （変わる可能性もあります）
・エラー ： 項目５）が発生した時の累計、および 前記ロック以外が発生した時の累計を各々表示。
ロックしないときはエラーカウントがupするので、エラーリセットの押し釦SWを設けロックしたのちにエラーリセットが可能にしておきます。 エラーのモニタです。
5７）プログラムはAVRのベーシックコンパイラ（BASCOM_AVR）を使用し、およそ5kbyteでした。
無償のBASCOM_AVRではプログラム量の制限にかかってしまいますので、正式版が必要です。
７． 測定
性能を測定してみました。

７．１ 測定機器、測定方法
ルビジウム発振器（Rb発振器）が借用できたので、それを使用してデータをとります。
Rb発振器に関しては、いかにRb発振器といえども経時変化はあってメーカーやユニットによって個々に変わりますが、カタログなどからみると 1年で 1*1E-10 ～ 5*1E-10 程度は変化するようです。
恐らく実力値はもっと良いと思われます。
今回のRb発振器は数年校正されていないので、どうなっているかわかりません。
しかし、現在校正する方法も、確度を調べる方法もないので、このRb発振器を測定の基準とします。
周波数カウンタ（Fカウンタ）は、HP-53131Aの高精度option無のタイプです。 このExt Reference
入力端子にRb発振器の信号を入力し周波数を測定します。
特に断らない限り、以後のデータ取りはこの方法で行います。
ただし、一部のデータにRb発振器を借用する前のデータがあります。 このときのReference発振器はアンリツのSSG MG3641A 内蔵の発振器（OCXO）を使用していました。

および試作機を1日程度通電した後に測定します。

Rb発振器、Fカウンタ

Reference発振器（ルビジウム発振器
又は アンリツSSG）

Ext Reference
10MHz

周波数補正
試作機

6

HP-53131A（F カウンタ）Ω

Ch1_input
1M
ACHigh sense

オシロスコープ
プローブ （ 1：1 ）７．１．１ 測定誤差のチェック
Rb発振器とFカウンタを組み合わせて、組み合わせの誤差を測定します。
図のように接続したときに正しく測定できればFカウンタには 10 000 000． 000 0 Hz と表示されます。
測定条件は
１）Rb発振器 ： 10MHz
Fカウンタ ： 10秒ゲート でカウンタの機能を設定し、 100回測定でのmin/mean/max を測定。
Ext Reference
10MHz

Reference発振器（ルビジウム発振器)

HP-53131A（F カウンタ）Ω

Ch1_input（1M ）オシロスコープ用
プローブ(1:1）

２）結果
電源ON => 1日以上予熱 => 1回測定、その後約24時間置いて2回目測定しました。
1回目
2回目

max (Hz)mean (Hz)10 000 000.000 1 9 999 999． 999 97
10 000 000.000 1 9 999 999． 999 98

min (Hz)
9 999 999． 999 99 999 999． 999 9

max-min
0.000 20.000 2測定系のばらつきは、0.000 2 Hz 程度存在しました。
測定データに対して十分良好なばらつきですので、これを使用してデータを取ることは問題無いと考えます。

７．１．２ Fカウンタのドリフト
１）Fカウンタの影響
測定ブロック図（前項）で1日以上動作させた状態で、Fカウンタのみ電源を約1日間offした後再投入し、その15分後から周波数表示値の変化を観測します。 見やすいように小数点以下のみを記述。 測定結果の周波数の例として
9 999 999．Hz + 下記の値

２）結果

．992 Hz

=>

9 999 999．992 Hz

Gate time : 1sec
Gate time : 10sec
経過時間(min) max (Hz)min (Hz)max (Hz)min (Hz)
0
0.994
0.992
0.993 2
0.992 6
30
0.993
0.992
0.991 7
0.991 1
60
0.993
0.991
0.991 80.991 3
これらの値は十分ウォームアップした時とほとんど変わらないので、Fカウンタ自体の測定能力は時間によって測定に影響あるような変化はありません。
このFカウンタの測定能力はほぼ外部Reference の能力だけで決まることが分かりました。

7７．２ 周波数制御を止めてフリーランの時のデータ
７．２．１ 測定条件
１）発振周波数が10.0・・0MHzに近くなる様なコードをDACにセットし、そのまま周波数データを取ります。
２）Fカウンタは10秒ゲートで100回測定し、その中のmax／mean／min（最大値／平均値／最小値）を測定。 これらの測定はFカウンタの機能を使用。
３）Rb発振器をFカウンタの Ext Reference に接続して使用。
４）測定間隔は不定で、測定者の時間がある時に測定。
周波数安定状況 （Fカウンタ 10秒ゲート、 DAC分解能 0.58mHz、制御無フリーラン）
Fカウンタの外部ゲート入力に対して、Rb発振器（10MHz）を入力
time
(min)
0
17
34
51
68
170
187
204
221
307
324
341
493
510
527
929
1021
1049
1544
1561
1578

max
93.1
92.5
92.2
92.1
92.4
93.9
94.3
94.4
93.3
94.0
94.3
93.9
93.2
93.0
93.1
97.8
97.3
96.4
95.2
95.3
95.0

周波数 (mHz)
mean
min
92.73
92.1
92.11
91.8
91.85
91.6
91.90
91.5
91.90
91.4
93.54
93.2
93.51
93.0
93.20
92.8
92.90
92.5
93.60
93.2
93.78
93.3
93.42
92.9
92.85
92.6
92.60
92.3
92.80
92.5
97.50
97.0
96.85
96.2
95.88
95.5
94.89
94.6
94.92
94.5
94.60
94.2

20170224

測定方法
10秒ゲートで100回測定して、その中のmax/mean/min （最大値／平均値／最小値） の値
Fカウンタの機能を使用
数値表示
93.0 =>9 999 999.993 0 Hz

周波数（mHz）
100.0
98.0

max
mean
min

96.0
94.0
92.0
90.0

0

200

400

600

800 1000 1200 1400 1600 1800

2/24 14:40 start

この区間での最大値と最小値の差は6.4mHzでした。
8時間（min）

７．３ 周波数補正を行ったときの短い時間（数十分）内のデータ
７．３．１ 測定条件
１）ロックをかけた状態で十分ウォームアップした後にデータを取ります。
OCXOの周波数補正（DACから電圧を与えての補正）は201秒ごと。
２）データの間隔は約22秒。
３）周波数は 9,999,999．000Hzからの変移のみ表記。 例） 0.0254（Hz） ⇒ 9,999,999.0254Hz。
４）このときFカウンタのReferenceとしては、アンリツのSSG内蔵のOCXOの出力を使用。
短時間の出力周波数の変動
DACの分解能が約 0.58mHzの時の様子。
カウンタのレファレンスは アンリツSSG内蔵 OCXO
(sec) 周波数（Hz） (sec) 周波数（Hz） (sec) 周波数（Hz） (sec) 周波数（Hz）
22
0.0242 286
0.0248 550
0.0254 814
0.025444
0.0242 308
0.0248 572
0.0247 836
0.025466
0.0242 330
0.0248 594
0.0248 858
0.025488
0.0243 352
0.0253 616
0.0248 880
0.02541100.0243 374
0.0253 638
0.0249132
0.0248 396
0.0253 660
0.0249154
0.0249 418
0.0253 682
0.0248176
0.0249 440
0.0253 704
0.0248198
0.0249 462
0.0254 726
0.0248220
0.0249 484
0.0254 748
0.0247242
0.0249 506
0.0253 770
0.0254264
0.0248 528
0.0254 792
0.0254
0.026
0.025
0.024
0.023
0.022

0

200

400

600

800

1000 （秒）・DACの分解能（≒0.58mHz）で階段状になっています。 この特性は周波数補正を行っているときの特性です。

9７．４ 周波数補正を行ったときの長い時間（数時間）内のデータ
７．４．１ 測定条件
１）通常の動作状態でのデータです。
２）Fカウンタは10秒ゲートで100回測定し、その中のmax／mean／min（最大値／平均値／最小値）を測定。
２）これらの測定はFカウンタの機能を使用。
３）Rb発振器をFカウンタの Ext Reference に接続して使用。
４）測定間隔は不定で、測定者の時間がある時に測定。
周波数安定状況 （Fカウンタ 10秒ゲート、 DAC分解能 0.58mHz）
Fカウンタの外部ゲート入力に対して、Rb発振器（10MHz）を入力
time
(min)
0
17
34
51
187
204
389
406
423
440
540
925
942
959
1061
1078
1095

max
94.3
94.7
94.1
93.6
93.1
93.3
93.6
94.0
92.8
94.0
94.5
94.2
94.3
93.3
93.0
94.0
93.3

周波数 (mHz)
mean
min
93.79
93.0
93.94
93.1
93.16
92.2
92.43
91.6
91.68
90.5
92.24
90.8
91.93
90.3
92.21
90.3
91.40
90.1
92.96
91.7
93.26
92.2
93.47
92.7
92.88
91.7
91.60
90.3
92.55
91.8
92.55
91.0
92.22
90.8

20170228

測定方法
10秒ゲートで100回測定して、その中のmax/mean/min （最大値／平均値／最小値） の値
Fカウンタの機能を使用
数値表示
93.0 =>9 999 999.993 0 Hz

周波数（mHz）
100.0
98.0
96.0
94.0
92.0
90.0

0

200

400

600

800

いつ測定しても89.0～96.0あたりをうろうろしています。
10

1000

1200

max
mean
min
時間（min）

８． 測定結果
８．１ 測定結果
１）前述の測定結果からRb発振器を基準としてspecを考えると、少し余裕を持たせて10MHz 誤差 （-8mHz±4mHz）
あるいは（少し確度が悪くなりますが）切り良く
10MHz 誤差 （±12mHz） => ±1.2*1E-9にしても良いと考えます。
２）本当はデータをパソコンなどに転送できるような方法で長時間テストする必要がありますが、今回その方法ができないので、specとしては少しお粗末です。
３）そうは言っても長いことランニングして安定した状態では、前記specから逸脱した値は見たことがありません。 （定量的でも客観的でもない観測ですが・・・）
８．２ 測定結果の考察
１）実際は使い物になるとは思います。 ほかの方の製作例とくらべてどのようであるか、わかりません。
２）誤差の項の±4mHzはばらつきやドリフトでしょうが、-8mHzのオフセットの理由が分かりません。
次項で考えてみましたが、やはりよくわかりませんでした。
３）周波数補正を行っていない場合（OCXO単体のフリーラン）は、ばらつきもドリフトも穏やかです。
しかし、ドリフトは補正を行った時よりも大きい。
４）周波数補正を行ってDACのデータが一定の時（1ppsの信号を累積している間。 今回は200秒間）
では、Fカウンタの測定値はほぼ一定。 （バラツキは±0.8mHz程度）
５）周波数の補正を止めると一部性能が良くなります。 ３）項の様です。
本来は補正を行っている状態では補正を止めた状態よりも良い特性が得られないといけませんが、そこまでに至っていません。 （今回の本当の問題はここです）
短期安定度は４）項このように良いので、正しい値からずれた分の、少しの周波数の補正をしてやればもっと良く性能が上がりそうですがうまくゆきません。
６）内部補正を行った時に、補正用のDAC の分解能（約0．58mHz）1カウントしか増減していないのにドリフトと相まって数倍（1～3）程度周波数が動くときがあるようです。
７）OCXO の設置方向で0.09Hz程度ずれました。 これはOCXOの規格内です。 DAC のカウント値も約150カウント程ずれます。（150*0.58mHz） そうしますと20分とか30分とかかかって元に戻ります。
周波数補正が動作していることが分かります。
８）設置方向を変えると周波数がずれるのは、重力の影響だそうです。
あるメーカーの水晶発振器の使用上の注意に書いてありました。 1E-9程度の変動だそうです。
したがって、設置状態を変えたらその後安定時間を設けた方が良いと思います。
定量的にデータを取ったわけではないのでずれの値は不確実ですが必ず発生しました。
1ppsを使用しない、例えば数10kHzなどをリファレンスにしたPLLの、ずれが短時間に補正されるような方式ならば問題ないのでしょうが本機はそうはいきません。
このことは細かい数値の測定をするまで気が付きませんでした。

11

８．３ 8mHzの誤差（オフセット）について
8mHzの誤差は何が原因でしょうか。 次のような項目にずれが発生している可能性があります。
１）本機の発振周波数
２）Rb発振器の発振周波数
３）Fカウンタの測定値
４）GPS受信モジュールからの1pps

１）は設計が不十分で、実際に8mHzずれている。 本機のカウンタは5mHz分解能なので8mHzは
1.6カウント分のオフセットに相当する。 ちょっと微妙。
２）Rb発振器といえど経時変化はある。 今回のRb発振器はおそらく数年は校正はされていないはず。
Rb発振器の経時変化は 最大 5*10E-11／年 程度（個体によって違う。 いくつかのカタログで見て、この程度）なので、5年間ぐらい校正していないとすると、2.5mHz程度変化している可能性があるが、まあ、specに対してのマージンもあるはずなので1mHz程度のずれ位はあるかもしれません。
３）Fカウンタ自体に測定誤差がある。 又は測定方法に間違いがある可能性だが、前出の７．１項から考えると、この可能性は少ない。
４）正確な1ppsを売り物にしているので、もしずれているとしたら、部品不良。
結局一番可能性の高いのが１）ですが、理由が分かりません。 アナログ的な要素が入る可能性が少ないのです。 OCXOをコントローるするDAC あたりがアナログですが、帰還ループを閉じれば内部カウント値が20 000 000 00 カウントになるように制御されているだけのはずです。
どれが影響しているか調査するためには、正確なreferenceが必要です。
もう一台新しいRb発振器を用意するか、別のGPSロックの発振器を用意する等が必要です。
今回はどれも用意できませんので、現用のRb発振器を基準にし、本機が8mHzずれているということにします。 いつか可能な時までの課題とします。 そのためにプログラムでoffset が加えられるようにしてあります。

12

９． 感想など
１）周波数測定の分解能が0.005Hzで200秒ゲートです。また測定には原理的に1カウントのばらつきが発生することを考慮に入れると、現時点ではこの程度とも考えます。
実験途中ではゲート時間を変えたりその他実験を行いましたが、長いほうが良好のようです。
２）周波数補正をかけた方が、フリーランで動作させた時よりも性能が悪い。 すなわちばらつきやドリフトが大きいなど。 フリーランといってもDACの数値を固定しているだけで、電気的な系統が変化しているわけではありません。 また、周波数補正も系が安定した後は200秒に1カウント分しかDACのデータを変えていません。 それにもかかわらずふらりと周波数が変化します。
この状態は実用的には問題ないレベルではありますが、ちょっと気に入らない点ではあります。
３）ちょっと何かを変更すると周波数が落ち着くまで（0.01Hz台）10分オーダーの時間がかかります。
なかなかのんびりです。
４）GPS受信モジュールは高感度で、室内に放置しておいても通常衛星の必要数（min4個）見えていますが、まれに必要数の衛星が見えなくなるようなことが発生します。
そうしますと1pps の信号が止まります。 見えなくなる理由は分かりません。
モジュールはアンテナと一体のなので、どんな設置方法が良いか実験する必要があります。
５）カウント数が大幅にずれたときに、ゲート時間を早くしてある程度のところまでおおよそに合わせ、目標値に近づいたらゲート時間を延ばして確度を上げてゆくような処理方法もありますが、実際に使用するときは長時間電源を入れっぱなしにするので、今回は採用していません。
６）今回DACは12bitですが、 ATmega64ではCPU内16bitのカウンタがあるのでにPWMタイプの16bitのDACとして使用できます。 （ATmega328は16bitカウンタが1本しかないので不可） ただし、AVRのBasicコンパイラ（ BASCOM_AVR）が16bitのPWMをサポートしていない様なので使用していません。
まあ、アセンブラでプログラムすれば可能と思いますが、今回は実施しません。
10bitまでのPWMでしたら、BASCOM_AVRもサポートしていますし、実際に使用したことがあります。
７）これでも実用上は十分ですが、もうちょっと性能が上がらないかなとも思います。 GPSの性能に比べて少し悪い。 何らかのデータ処理などでもう半桁でも確度が上がればよいのですが、うまくゆきませんでした。
８）重力の影響での水晶発振器の方向による周波数の変化が体験できるとは思いませんでした。
ただし、機械の位置を動かすとLockするまで時間がかかるのはこのタイプの欠点です。
９）今回借用したルビジウム発振器は少し古い感じがします。 ヤフオクなどでも出品されています。
ebayなどでは、何十も出ています。 しかも¥20k～30k 程度です。
どの程度spec満足しているか分かりませんが、そんなに多くのずれは無いと思います。
今回のGPSロック発振器は材料費＜¥10kですし、プログラムの開発などちょっと楽しめました。
１０）周波数の確度・安定度のみが必要ならば、前記のルビジウムのモジュールを買ってしまえば簡単で高性能な発振器が使えることになりますが、それでは面白くないのでこんなものを作ってみました。
１１）高級無線機の周波数安定度が 0.05ppm という規格ですので、5*1E-8です。
本機は ±1.2*1E-9 とすると1桁以上程度良いことになります。 また、経時変化もほとんど無い
はずで、10年後も同じ確度と考えられます。 ずれが集積されないところが最大の特徴です。

13

１０． 写真
バラックで作業中や、一応ハコに入れたときの写真です。
１）むき出しのGPS受信モジュール。
２）CPU（ATmega64） + 少しの追加ロジック。 （実験などで、使用していない回路が含まれています）
３）OCXO は気休めでプラスチックの梱包材で包みました。 包むと少し保温が効いてOCXO の+12Vが若干少なくなります。 （室温 約15℃ ） 下の通り0.3W程度違います。 無いよりマシでしょうか。
梱包無： 138mA（1.656W） ピンク梱包： 112mA （1.344W） アオ梱包： 110mA （1.32W）
ピンクは何かの梱包用クッション、アオは100均の工作用発泡スチロールカラーボードです。
４）LCD表示器はデバッグとモニタ用。
５）GPS受信モジュールを入れるハコを探さなくては。
６）ボードに空きがあります。 より小規模にCPU、ATmega328などを使えばジャノメ1枚で完成します。
GPS受信モジュール

気休めに梱包）OCXO （AVRプログラムライタ

アオ梱包

ニタ

USBモ

ATmega64をATmega328にテンドーの基板）

ATmega64（アイロジック

変更して、右の基板に載せれば基板1枚で済みます。
でも、今回はこのまま・・・・・

OCXO
NDK製
9140A-CEE70（さるOMからいただいたものです）

14

ケースに配置
電源

受信モジュール

OCXO

Logic

Atmega64１）ジャンクのカセットデッキの箱。
２）左の青い立方体がカバー付きのOCXO。
３）右下の蛇の目基板は5分配の回路。
４）機内トランスは未使用（電圧不足）
その代わりに外付けACコンセント
用電源使用。
これ、重いのでトランス入り。

Clock dist.

１）元についていたSWなどを利用。
２）現時点では右上の2個の押釦SWのみ使用。
エラーリセットと、エラー表示。
３）フロントパネルはそのうちに薄いアルミ板などでお化粧予定。
４）5分配出力のうち4つはリアパネル、
1つはフロントパネル（これは現在付いていません）
お化粧した時に付ける予定です。

１）LCD表示などは本来不要ですが、何もないと様にならないのでつけました。
２）内部の状態、エラーなど適当に表示しています。
デバッグなどにはとても有効です。

15

測定系
周波数カウンタ
HP53131A

ルビジウム発振器
自作（借用品）箱の中のルビジウム発振器
モジュール
形名 不明

16

付１． OCXOについて （NDK 9140A-CEE70 予備調査 ）OCXOの可変範囲を調べます。 上記部品のみのデータです。 部品が変われば以下は無効です。
データシートに明記はされていないのですが、Controlという端子があります。
データシートにはこの端子はGNDに接続しろと書いてあります。
他のOCXOのいくつかは10kΩのVR使用して発振周波数を変化させることができるので同じように試してみました。
OCXO

Ω VR

I mA

10k

Cont

+12V

Cont

端子

端子

OCXO
Cont
0V

0V
VCXOとして0V

直流電圧を加える
１）まず正規の接続として、ContをGNDに接続して本体の半固定調整用トリマを回すと、10.0・・0MHzを中心として-5.1Hz （1.2mA） ～ +4.7Hz （1.2mA）
電流はCont端子から流し出し。
２） Contをopenにしてトリマを回すと+8.4Hzでほとんど変化なし。
３）１）の状態で（ContをGND）トリマを10. 0・・0MHzに調整する。
その後VRを接続してVRをContに接続せずに中点付近で+6Vに設定した後、Contに接続する。
+7.46Hz （6.47V）４）３）の状態でVRの端から端まで-0.19Hz （0V） ～ +14.2Hz （11.9V）
５）４）の状態でVRを0Vにし（VRを回し切った）、その状態でトリマを回して-3Hzに設定する。
徐々にVRを回して周波数が+3Hzにする。
-3.0Hz （0V、1.2mA） ～ +3.0Hz （3.84V、0.56mA）
これで10.0 ・・0MHz MHz±3Hzにするためには外部から0V～3.84Vを印加すればよいと思われるので、実際に電圧を加えて試すとそのように動作しました。
また、この時の電流値は 1.26mA～0.56mA でした。 電流は端子からGNDに流れ出る方向です。
実際にOCXOを可変周波数として動作させ、DACと接続して中心値のあたりの特性を見ます。
テスト

DACデータ
DAC出力電圧値(V)
カウント数 （10秒ゲート時の測定値）
3,048
3.765
100000027
2,048
2.527
100000005
1,048
1.291
99999982
これによるとDACデータ1,000に して22 23カウント（10秒ゲートなので周波数では2.2 2.3Hz）変しているので、DACデータ1LSBに して 2.3mHz変 していると考えてよいでしょう。
ただしこの値は使用しているOCXOで実測する があります。
また、DACやOCXOのが ったものを使用すると、それに合わせてバッフ アンプにゲインや

対 ～
～
化
対 約
化
必要
規格 違
ァ
オフセットの再設計が必要になる場合があります
最終的には少し違った設定になりました。（中心：2.5V、範囲：約±0.12Hz 1LSBあたり0.58mHzとして動作させている）
17

付２． OCXO の周波数の変化 （予備調査 ）付２．１ パワーオンからの周波数変化
Power on からの周波数変化

Fカウンタ10秒Gate

℃

15.6

経過時間 周波数(注） 10,000,000Hzmin+10,000,000Hz からのずれ(Hz) 周波数(Hz)1
261.574
261.574 300
2202.716202.716 250
3138.164138.164 200
478.19178.1915
28.38
28.38 150
60.17630.1763 100
7969.27-30.7350
8974.277-25.7239
981.932-18.068010985.742-14.258 -50 0
5
10
15
20
12
988.251-11.749
時間 (min)
14
988.75-11.2516988.876-11.12418
988.976-11.024 （注） 上位の5桁を省略
20989.015-10.985261.574
10,000,261.574 Hz
55
989.439-10.561989.439
9,999,989.439 Hz

25１）周波数コントロールの電圧が約2.5Vの時に周波数が10.0・・0MHzにになるように、本体のトリマを合わせる。 これはVCXOとして使用した時の10MHz時の電圧が2.5Vのため。
２）その後周波数コントロールをGNDに接続。
その状態で測定。
ここでは、OCXOの周波数の変化をデータとし、絶対値は調整によって変化するので注目しません。
結果として、p-onから15分も経過すれば 1Hz 以内程度には安定するようです。

使用したFカウンタはHP53131A ユニバーサルカウンタ。
アンリツのSSG MG3641Aの10MHzOCXO出力を、FカウンタのEXTGateに接続して使用。

レ
昼夜 エ

ショ

HP53131Aも確度のグ ードがあります。 今回使用のものは高精度オプ
ンが無いタイプで、
SSGのReferenceと比較してSSGのほうがずっと良いことが分かったので、この方法で使用します。
FカウンタもSSGも一以上 ージング に使用。

後

SSG MG3641A（アンリツ）
Reference発振器（OCXO)Ext Reference

HP-53131A（F カウンタ）
Ch1_input

control

OCXO
GND

18

付３． 周波数コントロールについて
以下については理論によって証明されていませんので、勝手に操作してある程度の性能が出ているとしか言えません。
また、プログラムの考え方ですので、理解しづらい又ちょっと方法が変ということがあるかもしれませんが現時点の状態です。 ここに書いてあること以上の説明は細かくなりますので割愛します。
付３．１ コントロールの条件
周波数のコントロールについては、基本的には次のようになります。
１）1pps 信号200パルス（200秒）の間に、OCXO からの10MHz出力周波数をカウントします。
２）そのカウント数が、20,000,000．00 （基準カウント）になるようにDACの電圧を変化させてOCXOをコントロールします。
また次のような条件があります。
１）200秒のゲートがかかっているので、カウント数は 20,000,000．00 で、5mHz分解能です。
5mHz以下の情報は得られないので、一般にはこの発振器の性能は±5mHz程度でしょう。
２）DACの分解能はおよそ 0.58mHz程度、 OCXO の短期間の周波数安定度（含むDAC,AMPなど）はおよそ ±0.8mHz／3分とします。 DACの分解能とOCXO の短期安定度が5mHzよりも良い。
３）安定状態ではカウント値は10.0・・0MHzに対して最終桁がほぼ2値（0,1） 又は（9,0）になりますが、まれに3値までずれる様なことがあります。
実際の周波数はそれほど変化しているわけではない様です。
発振器の性能をもう半桁でも良くならないかと思っていますが、浅学につき思うように行きません。
付３．２ 方法
現在の処理が最適ではないと思いますが、動作はしているようです。
ここで10Mカウントというのは内部カウンタの値で、5mHz分解能です。
１）10Mカウントが大幅に基準カウントからずれている場合は、｜（基準カウント－10Mカウント）｜*10 の値を極性を合わせてDAC設定します。
これを何回か繰り返すとずれは少なくなります。
２） 10Mカウントが基準カウントの±2カウント以内になったら、DACのLSB（約0.58mHz分解能）で1回目、2回目、3回目・・とDACに設定するカウント数を減らしながら （基準カウント－10Mカウント）の符号に合わせて誤差が少なるようにDACの値に加減算します。
３）２）から5回のサンプル後、“Lock”状態とします。
“Lock”状態では、｜ （基準カウント－10Mカウント）｜ <= 2カウント まではDACには1を加減算し、｜ （基準カウント－10Mカウント）｜ > 2カウント では、１）の操作に戻ります。
４）このあたりの制御はまだテスト中で、変更される可能性は多大にあります。

19

付４． 回路図について
参考に回路図を提示いたします。
１）このまま同じものを製作される方もいらっしゃらないとおもいますし、プログラムも必要で、それは公開していませんので、そのままでは製作はできないと思います。 回路図は主要部分です。
２）内容は間違いのないように十分注意していますが、もしあった場合はご容赦ください。
３）定数、回路自体など変更する場合があります。 この拙稿の発表した時点では動作していた回路です。
４）回路は実験などを行った結果ですので、最適化していません。 不必要なゲートやFFがあります。
５）モジュールからのデータ系（TXD,RXD）当たりの回路は、現在使っていませんので動作は確認して
いません。

20

の P12V分配器の P12V
OSC

21

以上