ちょっとTea Time!? 水晶発振器の絶対値をあわせたい! 2021.6.17

8桁の精度がある周波数カウンタが欲しい!

Small-LED4を作ったときに、周波数カウンタの機能も盛り込みましたが、所詮4桁の表示です。
それに、時間基準がPICの内蔵発振器なので仕様上は1%程度の精度です。実力値としても0.3%程度でしょう。
折角なので8桁くらいの精度をもつ周波数カウンタも常備したくなりました。
というのも、PICの発振器の周波数を観測していても、絶対精度が全然わからないのが寂しいです。
オシロにも周波数カウンタがありますが、中古なので校正されているかどうかも怪しいです。

市販で3〜4万円だせば8桁の周波数カウンタが手にはいりますが、タイムベースにつかっているのは温度補正付の水晶発振器のようですので
精度としてはよくて1ppm程度でしょう。となれば、8桁表示があっても有効な表示は5桁程度になってしまいます。

8桁程度の周波数カウンタをつくろうと考えたとき、問題はその精度を満たすための10-8以上の高精度な発振器が必要なことです。
どうしよう?


Small-LED4での周波数カウンタ。PICの内蔵発振器なので精度は1%以下。
実力値でも0.3%程度でしょう。やはり8桁程度のものが欲しいです。


温調付の水晶発振器がありました!

もともと、このTea Timeのきっかけは色々と部品箱を整理していたら、かなり古いですが温調付きで電圧調整可能な水晶発振器(10MHz)が
みつかったからです。温調付なのでかなりの精度がでるタイプで、主に柱上の携帯電話の中継器などにつかれるものです。
中心周波数はどちらも10MHzなのですが、問題は10MHzにぴったりと合わせる校正手段がありません。


温調付きの水晶発振器がみつかりましたが、校正する手段がありません。

ちなみに、電圧調整できる範囲の周波数を調べてみると0〜基準電位(約5V)で18Hzの変化幅がありました。
元の周波数が10MHzですから、調整できる範囲はおよそ±9×10-7です。ちなみに、オシロだと10MHz測定時の
最小分解能が1kHzだったので観測できません。他の発振器(DDS)と並べてオシロで観測して調べたものです。
でも、オシロをつかったおかげで少なくともオシロの周波数カウンタは校正されていることが確認できました。

手持ちのオシロでは10MHzを示しています。オシロの校正は出来ていそうです。
でも分解能は5桁しかありません。



この桁数だとすこし寂しい。

どうやって校正するか?

目標とする精度には10-9オーダで調整する必要がありますが、どうやったらいいだろう?
ここまでくると原子時計並みの基準が必要になってきます。


引用:https://toragi.cqpub.co.jp/Portals/0/backnumber/2010/12/p147.pdf

時報はどうだろう?

放送で流れる時報はたしか原子時計をつかっているはずです。時報といっても、ネット時報では通信速度の影響があるのであてになりません。
携帯も同じです。家には固定電話もありますが、こちらもIP電話なのでだめでしょう。
使える時報とすればラジオです。NHKラジオなどでは時報も流れています。でも、時報をつかう最大の課題は校正にかかる時間です。

3.2年かかる?

よくよく考えると10-8の精度となると3.2年に1秒の誤差なんですよね。秒単位をあわせて校正しようとすれば、長年待ち続ける必要があります。
できれば、1日程度で合わせたいところです。となると、時報のピーの立ち上がりの精度は86us以下が必要ですが、時報の波形を観察しても、それだけの
精度がでるかな〜。なんか労多くても実入りはすくなそうです。

GNSSは1PPSの出力がある!

いろいろと調べているとGNSS受信機には1PPSでの出力端子がついているようです。
さらに、それを応用した10MHzの発振器もあるようです。
かの有名なFURUNOからでていました。でも、ちょっとお高いなあ〜。

FURUNOからこんなものがでています。でも、結構お高いです。

で、われらが秋月電子ですが、探してみたらありました。かなり安価なキットがでています。


秋月からGNSSの安価なキットがでています。


このような出力が得られます。

この1PPSの時間精度ですが、なにやら総合的にも10ns程度らしいです。そりゃ、その時間をベースに測位システムが動いているわけですから、
本来はもっと高い精度がでているはずです。
10nsの精度がでるのなら、10秒間でのカウント値を用いれば10-9オーダでの調整ができます.

でも、よく考えたら・・・・・

でも、GNSSをつかって正確な1PPSの出力が得られるのなら、わざわざ水晶発振器を校正しなくてもこれを周波数カウンタの基準時間にすればいいのでは?
と思ってしまいました。
 でも、衛星からの電波が捕まえられない場合もあるだろうし・・・・それに、このGNSSキットを動かしてみたい気もするし・・・・・

ああ、また目的と手段が入れ替わってしまいそうです(笑。

とりあえず、後学のために買ってみましょう!


測定回路を検討しておきましょう。  2021.6.18

物が届く前に、周波数カウント回路を検討しておきましょう。
最近は秋月さんも結構忙しいようで、通信販売の発送も結構なリードタイムがかかるようです。

・カウンタはPICにおまかせ
 PICには16Bitのカウンタがありますので、これで水晶発振器のカウントをおこないます。10MHzの発振回路を
例えば100秒間カウントするには32bitは必要になりますが、カウントする周波数が低いこともあるので、
定期的にカウンタを読み出して、オーバフローする回数を数えれば32bitあるいはそれ以上のビット数も実現可能です。
反対に、測定する周波数がほぼ10MHzと分かっているので、オーバフローを気にせず、下位16Bitだけのカウントだけでも
問題ありません。10MHzを1秒間数えれば、下位16bitの値は10000000-152*65536=38528になるはずです。

・簡単なゲート回路で仕切り
 正確に1秒間のカウントをおこなうた方法ですが、簡単に水晶発振器のクロックを1秒間のゲートで区切ってやることにします。
 たとえば、こんな感じです。
 
 簡単なカウントのためのゲート回路ですが、罠が待っています。

 この方法は簡単でいいのですが、正確なカウントには向いていません。40年ほど前に
 74LSロジックのみで周波数カウンタをつくったときに、これで少し失敗しました。というのもゲートが
 かかるタイミングによってはカウント値が+1の誤差が発生します。
  たとえば1Hzのクロックを1秒のゲートをかけて、カウントしようとした場合
 下図のようなタイミングでゲートがかかれば、カウントは1となります。


 このタイミングでゲートがかかれば、測定クロックは1だけになります(アップエッジでカウント)。

しかし、下図のようなタイミングでゲートがかかった場合、ゲートが閉じるときのエッジを
カウントしてしまうので、カウントは2になってしまっいます。


 このタイミングでゲートがかかれば、測定クロックは2となってしまいます。

高い周波数を数える場合は、カウントが1程度狂っても気になりませんが、今回については1秒間でのカウントが1狂うと
誤差が0.1ppmと無視できません(狙いは0.01ppm以下)。
 そのため、下図のようにゲート信号が閉じるときの被測定クロックの極性をラッチしておいて、その値によって
カウント値を1つだけ減算させることにします。


カウント誤差を補正するために、ゲートが閉じるときの被測定クロックの極性をわかるようにしておきます。

これらを含めて、PICで水晶発振器の信号をカウントするために付加する回路は下図のようになります。
ロジックICで4個ほど必要です。


水晶発振器をカウントするためにPICに取り付ける回路になります。


・DACも必要
 最終的には、測定した水晶の周波数をジャスト10MHzに設定するために、VCO電圧を調整します。そのためにDACも必要です。
使用する水晶発振器の周波数調整は0〜5Vで約20Hzであることが分かっているので、250mVで1Hz変化します。
発振の調整分解能をを0.01Hzとすれば、DACの必要分解能は2.5mVになります。12BitのDACを使えば、5V/4085=1.25mVですから
周波数分解能は0.005Hz(5×10-10)となります。12Bitで十分ですね。それ以前に、水晶発振器自体の安定性がどこまであるか心配です。
ちなみにカタログベースだと次のようになります。
 一番敏感なのは室温の変化でしょう。一応恒温槽付ではありますが、室温の影響をうけてしまいます。
室温が2℃変化すれば、±1.7×10-9の変化(0.017Hz)変わってしまいます。
 水晶発振器をさらに恒温槽の中に入れるか、それとも常にGNSS信号をもとに補正しつづけるかしないと精度の維持は難しいかもしれませんn。

KSS OCVCXO−120A
温度特性 ±3×10-8 MAX/ -10 to 60℃ 室温が±2℃変化するとした場合±1.7×10-9
経時変化 ±5×10-10 MAX/ day
±5×10-8  MAX/ year
一日あたりの変化はカタログ上ではかなり小さいです。
でも、使う前にはかならず校正したほうがいいようです。
電圧変動 ±2×10-9 MAX/ 12V±5% 電圧は定電圧をつかうので、ほぼ無視できるでしょう。

でも、これらはあくまでもカタログベースの値なので、実際の安定性については計ってみないとわかりません。
カタログはチャンピオンデータなのか、それとも実力はもっと上なのか・・・・


話は変わって

メールでGPSをつかった1PPSの活用に関する情報をいただきました。
http://seppina.cocolog-nifty.com/blog/2016/01/10mhzgps-2940.html
http://tyunitidenko.x0.com/fcounter15.html

中日電工さんも、水晶発振器の精度を検証するために時報も活用されていたようです。
でも、やっぱり時間がかかっていますね。


全体の回路図を書いてみましょう.

28PinのPICをつかいますが、結構I/Oが埋まってしまいました。
でも、この程度の部品なら液晶表示器も含めてSTDサイズの基板に乗るかな?やっぱり無理かな?
水晶発振器が12Vで動作するので、15Vからレギュレータで降圧します。温調付なので
電源投入初期は400mAくらい流れるので放熱板は必須です。定常動作にはいれば大体80mA程度の消費電流です.
15Vを元電源にするのでロジック5Vのためのレギュレータにも放熱板は必須です.これらがスペースを結構占有します.


全体の回路図を書いてみました.


STDサイズに納まるかとおもいましたが、無理そうです。GNSSモジュールを搭載するスペースがありません.


WIDEサイズでないと収まりそうにないな〜.

でも、回路も検証が済んでないからまずはブレッドボードで試したほうがいいかな〜.

とりあえずはGNSSモジュールが届いてから考えましょう.


物到着! 2021.6.19

思ったより早く到着しました。この週末はこれで遊べそうです。


GNSSのキットが一式入っています。電池まで入っているのですね。


主要なものはこれだけ。キットですが、ほぼ完成品です。端子を半田付けすれば出来上がりです。


とりあえず通電です。アンテナは窓辺におきました。
通電後して数十秒たつとLEDが1秒毎に明るく点灯します。



定常時の電流は34mA程度。LEDが点灯すると40mA程度になります。

まずはブレッドボードで組みましょう!

回路のチェックを含めてまずはブレッドボードで組みましょう。
というか、ちょっと半田ゴテをつかうには机の上が散かっているので・・・・・

ブレッドボードで組み立て中です。

ブレッドボードでの配線はすぐに済んでしまいました。回路図を最初に書いておいたので、
図面をみながら淡々の配線するだけです。

ソフトにかかりましょう!

まずは簡単なチェックソフトから作成です。このときにGNSSを使ってもよかったのですが、GNSSは
電源を入れてからパルスが出るまで30秒ほどかかります。ソフトのデバッグにはすこし不便なこともあり、
まずはGNSSと同じような1PPSの類似パルスを出すPICを作っておいて、まずはそれを基準源としておきました。


ソフトのデバッグ中はPICで1PPS信号をつくります。

ソフトといっても簡単なもので、全体で100行もありません(LCDライブラリーは除く)。
ほとんどデバッグらしいこともなく、まずは動き出しました。
水晶発振器の測定カウントが9.94MHzを示していることから、PICでの基準発振器の
誤差はおよそ0.6%といったところでしょう。

まずは簡単なチェックプログラムを作成しました。

いよいよ、GNSSを接続してみましょう。


基準発振器をPICからGNSSに置き換えです。

やはり安定しますね〜

最初GNSSのとりつけて電源をONにしても、なかなかLEDが点滅しない(衛星を捕捉できていない?)
のですこし焦りましたが、ちょっと天気が悪くなったのと、窓側にアンテナをおいているとはいえ、
半分雨戸(鉄製)がしまっていたこともあり受信感度が低くなっていたようです。
雨戸を開けてやれば受信開始しました。
 1PPSの信号が出始めると水晶発振器のクロックを表示してくれますが、やはりすごく安定しています.
発振周波数の調整電圧をREF(5.2V)とGND(0V)と両端で測定したところ、それぞれ10MHzに対して
+7Hzと-10Hzという結果になりました。
 ということで、調整電圧を2.5V程度にすれば10MHzに合わせられるでしょう.

VCOの設定電圧をREF(5.2V)にした場合です。10MHzに対して+7Hzです。



VCOの設定電圧をGND(0V)にした場合です。10MHzに対して-10Hzです。

DACいらないんじゃないかな?

VCOの設定電圧はDACでなくても、簡単にVRにしても1Hz以下には校正できそうです。
DAC載せるのやめようかな〜。

でも、1Hz以下で0.1Hz、0.01Hzを狙った調整を考えると測定間隔は10秒、100秒と増えていきます。
そんな間延びしたような調整は手動ではできそうにないな〜。自動にしておけば、一晩かけて0.001Hzまで
狙えるかもしれません。

やっぱりDACは載せましょう!

DACでの電圧調整範囲は0〜5Vを考えていましたが、もっと調整範囲を絞れそうです。±1Hz程度の調整
範囲にしておきたいのですが、それを調べるためにはVCO電圧と周波数の関係を調べておく必要がありそうです.
ということで、測定です。周波数の測定精度が1Hzしかないので、できるだけ沢山の測定点を得ておいて
近似線をつくってやりましょう。


VCO電圧と周波数誤差との関係です。

上の図から、±1Hz程度の調整範囲を考えると3.06V±0.3Vの範囲で電圧が発生できるDACにすればいいようです。
ということで、回路図を少し変更してOPアンプを搭載します。使おうと思っていたDACのMCP4222は2chあるので、CH.B
を租調整用、CH.Aを微調整用に割り当てます。OPアンプは5Vで動く単一電源のものがあればいいのですが、
手持ちの単一電源動作はLM358しかありません。5Vで動作するレールtoレールのものをストックしておかないといけないな〜。
LM358は5Vでも使えますが、最大電圧は電源電圧-1.5Vなので、最大でも3.5Vしかだせません。これは、なにかあったときに
対応できないかもしれません。ということで、LM358は水晶発振器と同じ12Vで動作させます。ただし、出力電圧が5Vを超えると
水晶発振器を壊しかねないので、出力はダイオードでクランプしておきます。


DAC周辺の回路をすこし変更しました。LM358は12Vで動作させます。

さて、回路図も書き終わったので実装しておきましょう.


DACとOPアンプも搭載しました。 これで全てのハードは実装です。

ソフトを修正

DACも搭載しのでソフトを若干修正です。
周波数カウント誤差に応じて、DACの値を修正するフィードバックを加えます。
本来は比例制御とかを入れたかったのですが、積分制御だけです。そのため、誤差修正には結構時間がかかってしまいました.
でも、その分安定精度はいいようです。

目標達成!

まずは周波数のカウント時間を10秒にして動作させます。
この場合の分解能は0.1Hzになりますが、しばらく動作させて制御をかけると
出力周波数は10000000.0Hzとなり、0.1Hz以下まで発振精度を追い込めました。
これで、誤差は0.01ppmですから目標の10-8達成です。

10-8精度を達成しました。

ここまでくると、欲がでてきます。周波数のカウント時間を100秒まで増大させて、さらに下の桁の精度を狙います.
フィードバック間隔が100秒なので、気長に待ちます。NETFLIXみながら待っています(笑。

結果としては、0.01Hz以下まで追い込めました。

10MHzに対して誤差0.01Hzまで追い込めました。

ただし、同じVCO電圧に関わらず誤差がでる場合もあるようです。


誤差が1カウント(0.01Hz)発生しました。


誤差の発生原因としては、もともとの水晶発振器の限界もあるでしょうが、やはりブレッドボードでの組み立てということもあり
VCO電圧にノイズが乗っているのかもしれません。あるいはロジック部のノイズかな?でもこれは考えづらいかも.

いずれにしても、10MHzに対して0.01Hzの誤差なので10-9の精度まで追い込めました。
さらに、この上の10-10に挑戦したいところですが、そのためにはまずはブレッドボードを卒業しないとだめですね.
それと、そこまで精度をあげても使用するところがありません. 0.01Hzの誤差なら十分です。

まとめ
 水晶発振器の校正にGNSSの1PPSが便利に使えることが分かりました。
 VCOの制御により0.01Hz以下まで発振精度を高めることができました。
 
#休日のお楽しみでした。

(後編につづく)

<付録>
今回の最終的な回路図です(ブレッドボード版).