AT90S1200による周波数カウンタ 1999.11.28 (最終更新1999.11.28)

avrfc.jpg

これはATMEL AVRマイコン(AT90S1200-12PC)で作った周波数カウンタです。
まだ、広帯域アンプ部分が未完成なのでカウンタ部分のみの公開です。

仕様は次の通りです。

基準周波数 12.8000MHz
ゲートタイム 0.01sec 0.10sec 1.00sec 10.0sec
周波数分解能 100Hz 10Hz 1Hz 0.1Hz
入力周波数範囲 0Hz 〜 約100MHz
入力ch数 3 ch

PICマイコンで作った周波数カウンタはよく見かけますが、AVRマイコンで作ったものは見たことが
なかったので自分で作ってみました。

PICの場合はカウンタのクロック入力端子とカウンタの間にプリスケーラがありますが、AVRの場合は
プリスケーラは無く、直接カウンタに入力されています。
実際には、カウンタへの入力信号は内部でCPUクロックで同期化されているようで、CPUクロックの
1/2以上の周波数は正常にカウントされません。

そこで、4ビットバイナリカウンタ(東芝 TC74VHC161F)で分周してからAVRに入力することにします。

VHCシリーズは安価で、軽負荷時ACシリーズより高速、出力波形が綺麗、アンバッファタイプの品種と
元々シュミットトリガの品種以外の全ての品種の入力に標準で0.15Vのヒステリシスがあるので
変化の遅い信号でも誤動作しにくく、私のお気に入りのシリーズで、仕事ではよくこのシリーズを
使っているのですが、面実装パッケージしか存在しないので自作には使いにくいかもしれません。
比較的新しいシリーズなので扱っているお店は少ないですが、サトー電気などで扱っているので、
通販でも入手可能です。

で、AVRの外部で1/16に分周するので、最高カウント可能周波数は16x12.8/2=102.4 MHzとなります。
AVRに入力するのはバイナリカウンタの出力で、デューティ比はほぼ1:1になりますから、実際にも
100MHz程度までカウント可能だと思います。

しかしそのままでは周波数分解能が低下するので、ゲートを閉じた後に、ソフトで作ったクロックで
バイナリカウンタの出力が変化するまでカウントを進めることで、カウンタの値を読み取ります。
そのソフトで作っているクロックが入力chのセレクタ(TC74VHC153F)の1C3に入っている信号です。
入力が1 chでよければ、TC74VHC153Fを制御している3本の線をTC74VHC161FのQA、QB、QCに接続し、
直接カウント値を読むようにソフトを変更すれば部品点数が減らせます。
ピン数の多いAVRマイコンを使えば素直に作れますが、これを作った当時は28ピンのデバイスは
手に入らず、40ピンでは大き過ぎると思ったので少し面倒ですがこのようにしました。

使用したAVRマイコンはAT90S1200-12PCで、800kHzのオーバスペックですが、データシートによると
5V動作時は16MHz以上まで動作するので大丈夫です。

ソフトはそのプログラムメモリ512ワード中501ワードを使っていて空きは殆どないので、それなりな
機能を追加したい場合は、AT90S1200と同一パッケージ同一ピン配列のAT90S2313-10PCに変更すると
いいと思います。この場合には2.8MHzのオーバスペックですが、データシートによると5V動作時は
16MHz以上まで動作するのでやはり大丈夫です(動作確認済み)。

AT90S2313はプログラムメモリがAT90S1200の倍で、スタックを128バイトのSRAM上に持つので、
3レベルのハードウエアスタックしか持たないAT90S1200よりプログラムが作りやすくなります。
スタックのレベル数不足のためにやむなく展開している部分もサブルーチン化できるので、さらに
空きメモリが増やせますし。
その点では、PIC16F84は同じくハードウエアスタックでも8レベルあるので便利ですね。

で、このAT90S1200用のソフトは、スタックポインタの初期化処理を追加すれば、AT90S2313でも
そのまま動作します。
AT90S1200はハードウエアスタックなので、ソフトから見えるスタックポインタは存在せず、当然、
その初期化も不要なのですが、AT90S2313ではスタックポインタの初期値がメモリの存在しない
ところを指しているのでそのままでは謎の暴走に悩まされます、ええ、確実に(^^;

基準発振器にはよくみかける12.8MHzのTCXOを使っています。秋月電子なら京セラ製が200円で
売られていました。他の店でも何種類か見かけますが、どのメーカ製の物も出力がコンデンサで
直流カットされているようです。
そのため、回路図では抵抗分圧で中点にバイアスをかけていますが、AVRのクロック入力端子は
発振回路の入力でもあるので内部でフィードバックがかかっているらしく、実際にはバイアスを
かけなくても中点付近の電位になっているので、そのままTCXOの出力を入力するだけで正常に
動作しています。

このTCXO、私が使っている某メーカ製の安物周波数カウンタよりも精度、安定度とも良好でした。
この某メーカ製カウンタは、電池動作時の方が明らかに基準発振器の周波数安定度が良くて、
電源の発熱の影響を露骨に受けているとしか思えなかったので開けて見ると、基準発振器は
TCXOなどの発振モジュールでなく、オーブンもなく温度補償もされていない単なる水晶発振回路で、
知らない方が幸せだったと、見てしまったことを後悔しました(^^;

表示用のLCDモジュールも秋月電子で1200円くらいで売られていたものですが、互換性のあるものが
いろいろあるようなので好きなものを選んで下さい。
私の場合は、回路図の型番のものは文字の形がイヤだったので、現在は写真に写っているSII製の
M1672-OAという型番のものを使っていますが、これは端子の配列は同じなのに番号のつけ方が
逆になっています。
どちらのタイプが多いのか知りませんが、端子番号ではなく信号名で合わせるのが安全でしょう。

冒頭の写真は実験中の基板で、中央下の公称67.10886MHzの水晶発振器の周波数を測っています。
中央が12.8MHzのTCXO、その右がAT90S1200-12PC、TCXOの下が74AC153、その右が74AC161で、
3端子レギュレータはLCDの下になっています。
実験ではユニバーサル基板に組んだので、DIPの存在しない74VHCシリーズの代わりに74ACシリーズを
使っています。
ゲートタイム等の選択SWの代わりに、黒いリード線で4つ並んでいる抵抗の足に触れる仕様です(^^;

回路図
プログラム

avrfcamp.jpg
おまけ。実験中のアンプ基板。

back