1.はじめに

No.182では10MHzを出力するGPSユニットを作りました。No.185では10MHzの比較器を作りました。一応は完成しているのですが、このままでは上手な使い道がありません。そこでこれを使って周波数のズレを測り、CPUからOCXOの制御を行う事で正確な10MHzを出力するという、ちょっと変わった写真1のようなGPSDOを作ってみましたので紹介します。

写真1 このようなGPSDOを作りました。

GPSDOといえば、GPS Disciplined Oscillatorです。高精度が目的なのですが、まだまだ完成という領域ではありません。満足するような性能には至っていないのですが、「実験記」ということで読んで頂ければと思います。

2.回路

普通のGPSDOはPLLを使ってOCXOをGPSの周波数に合わせます。合わせ方としてはGPSユニットの出力を10kHzとか100kHzに設定して基準とします。OCXO出力を分周して同じ周波数にして、比較するのが一般的な方法です。これにはGPSユニットの出力に、ノイズの少ない周波数を選ぶという目的もあるようです。

確かにGPSの出力する周波数は正確なのでしょう。しかし質の高いOCXOであれば、GPSの出力よりも安定で正確といえる場合もあります。時間をかけて安定したOCXOは、周波数の揺れるGPSよりも安定ということです。もちろん、普通の水晶発振器程度では話になりません。そこで安定したOCXOの出力とGPSユニットの出力をCPUで比較し、D/Aコンバータの出力電圧で僅かにOCXOの周波数補正を行ってみようと無謀な試みを始めました。

この実験は、No.182で作ったGPS出力の10MHzとOCXOの10MHz出力を、No.185で作った比較器で比べる事から始まりました。これで様々な事を考えていました。どちらも、この目的があって作ったものです。PLLで制御しようとした場合にはノイズが問題となるのですが、CPUで読みますので直接的な影響はありません。逆に周波数が高いので、ズレが良く解るというメリットがあります。もちろん、ノイズの影響が全くないということではありません。ノイズも周波数の変動に変わりはありませんが、それ以上にGPS出力には揺らぎがあります。

この比較器の出力をオシロでXYとして入力すると、回転を見ることができます。10秒で一回転すれば0.1Hzのズレがあると解り方向も明快です。このXYの値をCPUでA/D変換して読み込み、角度を計算すれば360度の位置が解ります。オシロではできない数値化が可能になります。そして回転の状態から周波数のズレを計算し、D/AコンバータでOCXOの周波数を調整するという、私としては壮大な計画を考えました。

このように考え、見たことのないようなGPSDOを作ってみました。今までと全く違うため、実験と作製、後戻りを写真2や写真3のようにして何回も繰り返しました。その結果、全回路としては図1のような回路となりました。もちろん、これで完成したとは全く思っていませんし、この先にも続くと考えています。

写真2 実験をしているところです。

写真3 このように少しずつユニットも増えます。

図1 全回路図になります。

3.各部の作製

私の場合は、実験→作成→失敗→実験を何度も繰り返しましたので、ユニット毎で作るしかありませんでした。従って、決して理想的に作られたのものではありませんし、改善すべき点も沢山あるはずです。かなり苦労したのですが、最終的には何の変哲もない回路の積み重ねになったと思います。そんなものなのでしょう。

(1)OCXO
部品の中で、比較的ジャンクに頼るのが10MHzのOCXOです。それも電圧によって周波数の微調整ができるタイプなので、VC-OCXOと呼ぶのが正確なのでしょう。私が使ったのは写真4のようなジャンクで、OCXOには間違いありませんがダブルオーブンか否かは不明です。何の資料もありませんが、周波数は安定しており、可変幅としてはかなり少ないようです。実験では外部電圧の0~5Vで1Hz可変しました。実はNo.117で一度ケースに入れていたのですが、新たな発振器にリニューアルしたわけです。
 

写真4 使用した10MHzのOCXOです。
 

全体の回路が、このOCXOで大きく変わると思いますので注意して下さい。最近では、このようなVC-OCXOの新品もネットで購入できます。今度安価なものを購入して、試そうかと思います。

(2)電源ユニット
実は一番難儀したのがこの電源ユニットでした。この回路図を図2に示します。上記のようにOCXOはNo.117で使っていたものの再利用ですので、電源も15Vのスイッチング電源をそのまま使おうと思っていました。ところが、これを使うと出力のスプリアスがあまりに多くなってしまいました。GPSDOとするには考え物で、15Vの電源が必要となりました。この15Vは重要と考え、ここにはNo.173で使ったローノイズ電源のキットを用いました。CPUとLCD、オペアンプには5Vを使っています。15Vと同時に作るため電圧の差が大きくなり、0.6A程度の消費電流ですが効率が悪く熱を出します。D/Aコンバータも5Vですが、これは直接C/Nに直結するのでCPU/LCDとは別の5Vにしました。3端子レギュレータに分けただけです。GPSDOとはいいながら、半分は電源関係で悩んでいたように思います。このように、それなりの容量も必要で、ノイズが許容できる部分とそうでもない部分が同居するという、やや面倒な電源の構成となりました。従って、効率は悪くても仕方ない、熱が出るのも仕方ない、と思うようにしました。

図2 電源ユニットの回路図です。

電源ユニットは図3の実装図で作りました。秋月B基板と呼ばれるユニバーサル基板を使っています。トランスは12Vのタップを使っています。15Vで使うには少し低いと思ったのですが、あまり高くすると5Vのレギュレータの発熱が大きくなります。試して問題が無かったため12Vのタップを使いました。このあたりは各回路で使う電圧がバラバラで、まとめにくい部分になります。写真5が基板を作ったところです。放熱のためヒートシンクをペタペタと貼り付けているのが解ります。試行錯誤が多かったため、途中の写真が抜けてしまいました。

図3 電源ユニットの実装図です。

写真5 電源ユニットです。

(3)CPUユニット
CPUユニットの回路を図4に示します。入力したXY信号を処理し、AVRのA/Dコンバータに入力します。AVRは回転の状況をグラフィックLCDに表示し、外付けICのD/Aコンバータを使ってOCXOの出力周波数を微調整します。たったこれだけの機能です。普通に考えるとXYで円を表示する必要は全くないのですが、これは趣味で作っているものです。従って、見ていて面白いものは付けることにしました。確かに面白いのですが、このために苦労が増えたのも事実です。

図4 CPUユニットの回路図です。

「D/A2.5V」のスイッチは、OCXOの出力周波数の調整時に、制御電圧を中央の2.5Vにするものです。もちろん、この時には自動での周波数の調整はしません。「AUTO TUNE」は、何かの実験中に周波数が動いて欲しくない場合もあるだろうと思い、OFFできるように付けました。もちろん通常はONになりますが、OFFにすると周波数の調整を行いません。

OCXOのコントロール電圧は、0~5Vで1Hzの微調整ができます。これはOCXOによって大きく変わります。1HzのズレをCPU出力のD/A変換した電圧でコントロールするのですが、8ビットでは256ステップとなりますので3.9mHz間隔となります。これでは少々粗すぎるでしょう。12ビットでは0.24mHzとなります。16ビットでは0.015mHzとなります。16ビットまでは不要と考え、12ビットで実験を始めました。写真6が12ビットのMCP4726で、I2Cで制御します。これは秋月電子で購入した、DIP化のモジュールになります。従って、最終的にどれほど安定したとしても、0.24mHzの半分の0.12mHz以内には収められない可能性があります。これはGPS出力の揺らぎを観察していて、これ以上は意味がなさそうだと考えたからです。実際に動かしてみて、ちょうど良い程度かと思います。但し最近になって考えてみると、細か過ぎて支障があるわけではありません。この先の進展を見越すと、16ビットを使っておけば次の実験に応用しやすかったかな・・というように少し考え直しています。

写真6 12ビットD/AコンバータのMCP4726です。

比較器ユニットからのXとYの出力は-0.2V~+0.2V程度です。これをCPUのAVRで読むために0~5Vに収まるように調整するのが入力のオペアンプです。普通のAFを増幅するような作り方ではDCの増幅ができません。マイナス側のDCも増幅する必要がありますので、電源にもマイナスの電圧を使っています。ここはもう一工夫できたと思う部分です。

オペアンプに使う-5Vだけは、CPUユニットの内部で+5Vから作りました。これはノイズだらけなのでしょう。定番のICL7660を用いてさらっと済ませています。ICL7660は写真7のようなタイプを使っています。随分前に秋月電子で衝動的に100個入りの袋買いをしたものです。これでは使い難いので、まず写真8のように足を広げました。そして写真9のようにDIP化して使ってみました。連結ソケットの上側のピンは、ハンダ付けの前に切断しています。元々8ピンのDIPタイプもありますので、その方が早いと思います。ピン配置もDIPタイプに合わせていますので、そのまま差し替えられるはずです。問題は、このCANの部分をちょっと地絡しただけで、簡単にICが飛んでしまう事です。今まで何個かというくらいに飛ばしてしまいました。袋で買っておいて助かったというICです。

写真7 昔々に袋買いをしたICL7660です。


写真8 8ピンの連結ソケットに合わせて足を広げます。


写真9 このようにDIP化しました。

CPUユニットの実装図が図5になります。秋月B基板の一番安いタイプを使っています。電源と同じサイズですが、どうしてか微妙に異なるタイプになりました。写真10が基板をハンダ付けしたところです。そのハンダ面が写真11になります。グラフィックLCDとの間のコネクタは、自分でハンダ付けして作りました。ハンダ付け部分をエポキシ系の接着剤で固定し、脱着時、一部のワイヤーにテンションが集中しないようにしました。鉛フリーのハンダではありませんので、ハンダ部分に触れないで済みます。基板とLCDをフロントパネルに固定し、コネクタで接続した様子が写真12になります。

図5 CPUユニットの実装図です。


写真10 CPUユニットです。


写真11 そのハンダ面になります。


写真12 このような自作コネクタで接続し、フロントパネルに固定しました。

(4)出力分配ユニット
OCXOの出力には、比較器に接続するアンプと外部出力への分配用のアンプを入れています。比較器へのアンプは不要と思っていたのですが、これがないと比較器側から漏れてくるGPSからのノイズが回り込んでしまいました。ですから、ここはアンプというよりも半分はアイソレータのつもりで入れています。図6が回路図になります。半固VRによって出力を調整できるようにしました。実装図が図7になります。秋月D基板のシールドメッシュタイプを使っています。緑の点はシールド部分へのアースを示しています。この基板が写真13になります。同軸の接続にはタイコウのコネクタを使っています。

図6 出力分配ユニットの回路図です。


図7 出力分配ユニットの実装図です。


写真13 出力分配ユニットを作ったところです。

(5)10MHz入力ユニット
 GPSユニットからの10MHz入力回路になります。この入力は、No.182のGPSユニットからの信号を受けます。図8が回路図になります。10MHz以外のスプリアスをLCのフィルタで除くようにはしていますが、この程度ではあまり期待はできません。特に近接するスプリアスには全く無力ですが、それほど問題にはなりません。図9が実装図です。この基板も秋月D基板のシールドメッシュタイプです。実装図を作って写真14のように作製しました。

図8 10MHzGPS入力ユニットの回路図です。


図9 10MHzGPS入力ユニットの実装図です。


写真14 10MHz入力ユニットを作ったところです。

(6)比較器ユニット
GPSとOCXOとの比較をします。No.185とほとんど同じです。図10の回路図になります。但し手持ちの関係で、使用したDBMと2分配ハイブリッドは変更しました。入力はSMAではなくタイコウのコネクタに、出力もJSTのEHコネクタに変えています。使った2分配のハイブリッドは10MHzでは周波数が低すぎて苦しいのですが、一応動きましたので良いことにしています。DBMはIFポートがDCから使えるものが必要です。図11のような実装図を作ってから作業しました。秋月C基板のシールドメッシュタイプを使っています。写真15のようになりました。

図10 比較器ユニットの回路図です。


図11 比較器ユニットの実装図です。


写真15 比較器ユニットを作ったところです。No.185と少しだけ違います。

(7)ケース
ケースにはリードのPK-1を使用しました。少々大掛かりなため、それなりの大きさが必要になってしまいました。WHDが、それぞれ250×90×210というサイズになります。以前、JK1AFI大和田さんにQSYして頂いたケースです。このGPSDOにちょうど良い大きさです。写真16が内部のレイアウトを考えている様子です。

写真16 ケース内のレイアウトを考えている様子です。
 

ケース内に生基板を置き、生基板の下から皿ネジを入れてトランスや基板等を固定する構造にしました。もちろん皿ネジの頭が生基板から出ないように処理をしています。基板だけではなく、電源トランスもあったための工作です。基板だけならカラーをハンダ付けしてしまいます。生基板は写真17のように固定しました。ケースのゴム足に合わせて生基板に穴を開けて固定しました。ケースは底面であってもネジの頭は出さない構造です。

写真17 このように生基板の下側から皿ネジで各基板やトランスを固定しています。
 

ケース内を組み立てながら動作チェックをしているのが写真18です。このように試しながら組み立てて、内部は写真19のようになりました。CPU基板は写真20のようにフロントパネルにLCDと共にネジ止めしました。ここだけは外側にネジの頭を出さざるを得ませんでした。少々悔しいので、目立たないように黒の化粧ネジを使っています。OCXOは周波数を微調整する必要がありますので、写真21のようにリアパネルにドライバーを入れる穴を開けています。奥に見えるOCXOのマイナスネジを外して、ここから調整します。

写真18 ケース内の組み立てを行いながら、動作チェックをしています。
 

写真19 組立て終わった内部の様子です。


写真20 取り付けたCPUユニットの様子です。


写真21 OCXOの調整のために、ドライバーを入れる調整穴を開けています。

5.ソフト
ソフトは比較器からのXとYの信号をAVRの10ビットのA/D変換で読み取り、角度を計算します。その角度を使ってLCD上に位置をプロットします。

そして20秒間隔での平均の誤差を表示します。次に100秒間隔での平均の誤差を表示します。電源ON直後には、ここでOCXOの微調整のためにD/Aコンバータの出力をI2Cで制御します。次に500秒間隔での平均の誤差を表示します。これを5回繰り返して2500秒後には500秒間隔での平均の誤差で、D/Aコンバータを制御するように移ります。LCDでmHz表示の文字が反転している値が、D/Aコンバータの制御に使う値です。電源ON直後には頻繁に制御し、OCXOが温まったところで長い時間の平均に変えるという作戦ですが、これが正しいのかは???です。もう少し詰めた方が良いようにも思えます。

表示の様子を写真22に示します。「AUTO TUNE」をしていて、直前の20秒平均のズレは+9.2mHz、100秒平均で+4.3mHz、500秒平均では-0.7mHzという意味です。500秒のセットを28回終了し、残り10秒で29回目も終わります。D/A変換の出力は2111ですので、2.5Vより多少上がっていることになります。そして左側の+と×を合成した印の周囲を点が回転します。これは角度の変化が解りやすいようにしたものです。この写真では1時の付近に点があります。このような表示をしています。但し、測定間隔は正確ではりません。従ってズレが+4.3mHz等の表示をしていますが、誤差はあります。

写真22 LCDの表示です。

OCXOの制御の方法ですが、例えば50mHzほど高いとします。1ステップが0.24mHzですので、50/0.24=208ステップほど上げると最も近づきます。しかし、これだとOCXO自体の揺らぎや時間的な変動もあって、過補償になる場合もありそうです。そこでスタート時は100%合わせに行くのではなく50%程度近づけて、少しずつ時間と回数をかけて合わせるようにしました。この場合は、50×2=100ステップほど上げるような設定にしました。そして電源ONから2500秒後に500秒間隔でD/Aコンバータの制御をするようになってからは、100%補正するようにしました。安定してからは0.24mHzでも合わせるという考えになります。しかし、この位がベストかというと、良く解りません。一応時間をかければ収束して安定します。もちろん、どちらにしても時間をかけないと安定はしません。

ソフトはここに置いておきますので、参考にして下さい。但し、まだ多少のバグが残っているようですので、もう少し時間をかけて整理すべきでしょう。また、font8x8.fontが同じフォルダにないとコンパイルできません。WEBで探せるとは思いますが、私のホームページにHEXファイルを置いておきます。

 なお、PCの環境はWINDOWS XPで、BASCOM AVRの製品版 VER.1.11.9.8を使ってコンパイルしています。書き込みはAVR ISPmkII ですが、基板のISP端子との接続には自作の変換ケーブルを使っています。これ以外の環境についての確認はしていません。

6.調整

回路的に調整が必要なのは、CPUユニットにあるTP-1,TP-2の波形です。ここにはオシロをXYモードにして取り付け、回転状態とレベルを確認する端子です。CPUでA/D変換できるのは0~5Vですので、どちらの端子も0~5Vに収まるように半固VRを調整します。更にXもYも2.5Vの位置を中心とした円を描くことです。この調整が正しくできないと、LCDの表示では回転する速さが一定になりません。もちろん、OCXOの調整もしておかないと、周波数が収束しません。

7.使用感

随分と苦労し、時間もかかりました。ほぼ半年以上は掛かり切りでしたので、他の記事の遅れの原因になったことは明らかです。今までには無かったような作り方をしたので仕方ありません。完成してみると、まあ平凡な感じになっています。GPSの出力周波数が動いているのが見えるので楽しいです。見ているだけで、他の作業が止まってしまいます。GPSといえども数mHz上下するのが良く解ります。最大で20mHz動く場合もあります。平均すれば正しいのでしょうけども、これでPLLを制御するとやはり上下してしまうのでしょう。このような製作を行って、あまりに高精度と称している製品には疑問を持つようになりました。今回作ったGPSDOは、短い周期の揺らぎは吸収できます。どの程度の誤差となっているのか興味深いです。でも測れません。この段階では、GPSの出力すら怪しくなってしまいます。

使用したOCXOにも長時間では揺らぎがあるようです。別のダブルオーブンを入手して試したいとも思います。また、室温によってOCXOの調整が微妙に変化するようです。季節が変わるとOCXOのトリマーを再調整しないと追いかけられません。これは大問題ですので、何とかしたいと思います。最近になって、年間を通してどのように変化するのかが多少解ってきました。うまく調整すれば、再調整をしなくても良くなるかもしれません。今回はかなり大掛かりになってしまいましたので、もっと簡易で小型のGPSDOにマイナーチェンジするのも良いかと思っています。

また、瞬間的にGPS出力が20mHz位ジャンプするタイミングがありますが、このようなケースは無視するのが良いのか、これを含めてトータルで平均するのが良いのか、ここが肝心なのですが良く解りません。今のところはトータルで平均しているのですが、これで良いのでしょうか?

この方式の欠点として、周波数が10MHzより離れすぎると比較ができません。つまり収束できません。OCXOによっては使えない可能性もありそうです。するとスタート時は普通のカウンタとして測って調整し、ある程度まで追い込んでから比較器を使って更に追い込むというような、2段階にすることも考えるべきかと思います。