2014年9月23日火曜日

PIC16F88とATtiny2313を使った周波数カウンタの製作

PIC16F88とATtiny2313を使った周波数カウンタを作りました。
本当はPICだけで周波数カウンタを作りたかったんだけど、うまく行かなかったのでAVRでゲート時間を制御するようにしました。
PICにはパルスのカウントに専念させ、AVRはゲートの開閉を制御します。
ゲートには74HC08のANDを使用しました。
AVRでゲート時間を生成することで、基準発振器1周期の分解能でゲート時間を設定することを可能としています。また、ソフトウェアディレイとnop命令を組み合わせることで様々な周波数の基準発振器にも簡単に対応できます。
PIC16F88のタイマ1カウンタはPICの動作クロックと非同期に動作することができるので、プリスケーラを使用しなくても40MHz以上までカウントできます。

- とりあえず仕様 -
・AVR: ATtiny2313 (基準発振器を動作クロックとする)
・PIC: PIC16F88(内蔵8MHz発振器で動作)
・測定可能周波数: 0.01Hz ~ 48MHz(48MHz以上の発振器がないので未確認)
・ゲート時間: 0.1s, 1s, 10s, 100s
・測定用カウンタ: 32bit
・周波数確度: 基準発振器次第


回路図


回路はとてもシンプルです。PICがAVRに指示を出す際は、AVRをリセットしてからゲート時間を設定するための2本のラインを制御します。
入力アンプをつけていないのでTTLレベルでの入力となります。

以下写真など
基準クロックを測定して測定結果と基準クロックの周波数が一致するようにAVRのゲート時間を微調整する。

内蔵しているLTC1799モジュールの周波数を測定

48MHzの水晶発振器の周波数を測定


24.576MHzの水晶発振器の周波数を測定


今回使用したTOYOCOM製の8.000MHz水晶発振器ですが、温度補償もされておらず、また、周波数の微調整も出来ないので周波数カウンタの基準発振器として使うのはあまり好ましくありません。BPM標準電波とゼロビートをとった10MHz発振器の出力を測定してみると、9,999,951Hzと表示さたので、8MHzより若干高い周波数で発振していることになります。温度によっても変化します。
TCXOを入手したら換装しようと思います。
標準電波を使った校正方法と10MHz発振器については次回あたりに書きたいと思います。
今回作成したプロジェクトファイル一式です。
https://db.tt/csBQFcvd
開発環境はAtmel Studio 6.2とMPLAB X IDE v1.41です。

LCDの表示処理の部分がごちゃごちゃしてスマートじゃないですが一応動作しています()

~おわり~