PSOC4を使った周波数カウンタ(OCXO自作) その3 温度制御修正版(特性確認含む)

PSOC4を使った周波数カウンタもOCXO対応したものが完成となりました。
今回はソースコードも公開します。あまりきれいなコーディングではありませんが、参考にして作り直してもらえれば幸いです。

詳細はソースを見てもらえればわかりますので、今回のブロック図を記載します。
なお、前回と比べるとVCTCXOの分圧比を変更しています。

■PSOC4ブロック図
画像
















★今回はOCXO部分が新規となりますので、この温度の自動調整について説明します。
OCXOとしての温度の狙い値は60℃としました。(この温度にした理由は前回のその2で説明)
OCXOはニクロム線で加熱していますが、ON/OFFしてもすぐには温度が変化せず、10秒程度おくれて変化します(温度センサーまでの距離があるので)。したがって、温度をみて単純にヒーターをON/OFFするだけではきれいに温度が安定してくれません。このため、1~2分で0.1℃程度変化するヒーター値を探し、毎秒切り替えることで60℃を維持するようにしました。具体的には今回は14ビットのPWM周期としていますので、最大の16382から15000->14000->13000->12000->11000->の順にヒーターの平均電力を小さくする方向でさげていき、60℃にならない値を見つける方法としました。この値をみつけたらこの値を挟んで高い値(60℃以上にできる値)と、低い値(60℃にならない値)で1秒単位でON/OFFして切り替えます。こうすることで、±0.1℃以内の調整ができるようになりました。調整過程の温度は下の温度特性グラフをみてください。

■全体のグラフ(GPSとの周波数差も記載)
緑:温度 縦軸x10℃が温度(x10℃)、黒:周波数ズレ10秒モード(Hz)、赤:周波数ズレ1秒モード(Hz)、青:OCXO制御用電圧(V)
大体、10分程度で温度追従、周波数追従が終わって安定する様子がわかります。
画像















■周波数ズレ10秒モードと100秒モードのみとしたグラフ
大体、0.01Hzで収まっている様子がわかります。
たまにジッタで0.02Hzが見られる。15分程度でロックしているのがわかります。
カウンタをGPSの1ppsを使って1秒単位でキャプチャーして積算(直前10秒、100秒の平均)して表示しています。OCXO部分のズレと、GPSの1ppsのジッタの積算となりますが、だいたい良いところまでできているとおもいます。
画像















■OCXOの温度特性グラフ
こちらは大体12分程度でロックしているのがわかります。
電源を投入して、初めに60℃の前後で行き来しているのがわかります。これを行って最終的に60℃にロックしています。
画像















■OCXOの周波数制御用電圧グラフ
こちらも大体14分程度でロックして安定しているのがわかります。
ちなみに、PWMをDA変換したときの電圧なので、実際のOCXOの制御端子の電圧ではありませんので注意。
画像















■NWT4000 170MHZ 6時間連続測定
●NWT4000は周囲温度や自分自身の温度変化で周波数変化をします。
●その周波数を長時間測定した場合、まわりの温度変化で周波数がずれますが、OCXOとGPSの周波数は一定なので、周波数差がジッタの範囲であることが観測できるはずです。
●逆に言えばNWT4000の周波数が変化するということは温度変化が見られることを示し、GPSとOCXOの周波数差が安定していることによりOCXOの安定度が確認できます。
以下実際に測定した結果を示します。

NWT4000は周囲温度で周波数の変動が大きいと思いますが、6時間連続で周波数を測定してみました。エアコンを停止すると急激に周波数が変化し、その後温度が下がってくる状態です。赤はOCXOの温度を示し、10当たり0.1℃なので、周囲温度が変化しても0.1℃以内をキープしていることがわかります。
ただ、調整電圧は本来は温度一定なら、あとは恒温槽にしていないPSOC4自体(特にDAコンバータ)の変動が残っているので、これかな。変動しているといっても10mVに満たない小さなところですが、こんなに急激に変化させる必要はないので、アルゴリズムを別途修正します。
170MHzの周波数の方も、めちゃくちゃズレが大きいことはないですが、小さな若干変動はあります。NWT4000か、周波数カウンタ自体か、それとも両方かなんとも言えませんが。でも100秒レンジで0.1Hzなので、OCXO起因なら、0.01Hz以下のズレということになりますが、ユニバーサル基板でノイズ配慮がそれほどない状態で作ったにしては安定している方かな。ちゃんとプリント基板をつくってGNDと電源をもっと強化してやればよいかもしれません。まあ、商売するわけではないので、この程度で十分かな。
赤はOCXOの60℃との温度差(1目盛り当たり0.01℃)を示します。黒は170MHZとの周波数偏差(Hz)、緑はOCXOの調整電圧(1目盛り当たり1mV)を示します。
★以下のグラフでNWT4000の周波数が変動しているが、OCXOとGPSの周波数差の変動がほとんどないことに注目してください。これが今回の自作のOCXOの安定度となります。
画像
















■拡大波形 10秒毎と100秒毎の波形としています。
100秒レンジでも0.1Hz程度の変動は見られます。

画像














■今回のまとめ
OCXOの自作はおおむね良好です。
VM39GS5-12.8MHzは電源電圧でも周波数が大きく変化するので、今回のように電源電圧自体をシャントレギュレータで調整する方法でうまくできました。前回のその2に写真を載せましたが、表面実装品のみで両面のユニバーサル基板を切り抜いてそこに実装が、ルーペを見ながら半田付けしたので大変でした。
OCXO本体に両面テープを巻いて絶縁して、そこにニクロム線を巻いて、さらに断熱材で巻くので、分圧比などを簡単に変更できず、一旦分解して行う必要があるので、これも手間でした。
今回ヒーターの電力は最大1W程度で60℃でのPWMでの平均電力は0.67W。
室温なら追従できると思いますが、冬はちょっと不明です。だめなら、OCXO部の断熱材を外し、巻き数を減らして発熱量を増やす予定。(抵抗値を現在の24Ω→17Ωで約1.5Wになる。)
今回作ったカウンタのソースを、以下にアップしました。ソースはMAIN.Cのみ見てもらえれば問題ありません。他は回路ブロックを置いたときに自動的に生成された関数です。とりあえず無難に動くところまでなので、まだまだ直すべきところはありますが、参考にはなると思います。

いろいろPWMを組み込んだ本最終版で200MHZを測定したら、測定できなくなっていました。周囲温度が暑くなってデバイスが遅くなったかもしれません。
170MHZ程度が最大になっていました。そのため、本プロブの題名を修正しました(すみません)
でも、昔の単純なカウンタに戻すと200MHzでも行ける。うむむ。機能を詰め込みすぎて、内部に遅延が入ったか。弱いのは前段のカウンタのビット数で、12.8MHZで6ビットカウンタではロジック的に205MHZまでが上限で、以前に説明した通り、入力周波数205MHZの1/64が3.2MHZと、12.8MHZの1/4が3.2MHZで等しくなり、これが上限となります。ここに遅延が入ったら、その分動作できる周波数は減るので、ここかな。もう1ビット増やせばいけるか?。もともとデバイスの動作保証範囲外の周波数をカウントしているのである程度はやむを得ないですが・・・・。

とりあえず170MHZで10秒レンジで±0.2Hz以下の変動にはおさまっているようなので、使い物にはなりそうですが、現時点では0.01Hzまでは無理そうなことはわかりました。

★特に上のグラフ(NWT4000 170MHZ 6時間連続測定)のGPSの1ppsと自作のOCXOの周波数ズレの1時間~6時間の平均が1mHzのレンジで0になったことは、他のサイトで先人が同様にGPSの1ppsの確認をしている人の見解と同様、長時間の合計を取ればズレは無いと思って良いことが確認できました。OCXOと比較しているのでこれも安定していることになりますが、10秒~30秒間のGPSの1ppsの周波数ズレに同期させているので、GPSと同じ結果となるのはプログラムがうまく動いていることの確認となります。

●では単純にGPSの1ppsでカウントしたときとOCXOでカウントしたときの差分はどうなのかということになりますが、その時の測定結果を見直してみると、GPSの1pps計測で175MHzを8秒で計測したとき(先日の記事Psoc4とTCXOを使い、GPSで確認する周波数カウンタ作成)17.3~18.5Hz(1.2Hz)に対し、今回のOCXOでの測定(1時間時)での30カウントでの結果は下のグラフで示すように0.5Hz~0.8Hz(0.3Hz)で変動は小さいのでやはり今回のOCXOの方が優れていることになり、苦労した意味はあったと思います。
以下のグラフはNWT4000を170MHz設定したときの170MHzからのズレをグラフにしています。

画像












いままで、GPSモジュールの1ppSを使って周波数を直接カウントするところからスタートし、OCXOの自作までやってきました。ここで、いままでの関連記事の全体を書いておきます。

1)GPSモジュール(U-blox NEO6M)の1ppS信号をつかって周波数を計測してみました。
 Psoc4とGPSモジュール(U-blox NEO6M)を使った周波数カウンタ作成 

2)1ppsをつかって周波数計測するカウンタの特性を確認しました。
 Psoc4とTCXOを使い、GPSで確認する周波数カウンタ作成 

3)GPSの1ppsで計測した周波数にジッタがあったので、OCXOを自作してそれをつかって周波数カウンタのゲート信号をつくり、カウントするハードをつくりました。
 OCXO自作編(その1) 

4)OCXOの周波数カウンタの特性を測定しましたが、OCXOの周波数設定ミスがあり、ハードを直しました。
 OCXO自作編(その2) 

5)本記事にてハードを手直しして特性を測定しました。


■ソースコードダウンロード先
ちょこちょこREVアップするかもしれません。(ZIPのファイル名のREVが変わっていたら)
PSOC4ソースコードダウンロード  


この記事へのコメント

この記事へのトラックバック