レシプロカル方式周波数カウンター

おじさん工房 TOP へ


2008/07/22 レシプロカル方式の周波数カウンターを試作しました
2008/07/27 AVR のプログラムを公開しました。
2010/12/02 回路図を公開しました。


2008/07/22 レシプロカル方式の周波数カウンター

AVRやPICといったワンチップマイコンで作る周波数カウンターというと0.1秒とか1秒のゲート時間を作成し、その間の信号をカウントするといった方式が普通のようです。 しかしこの方式(以下ノーマル方式)では周波数が低い場合、ゲート時間を長くしないと精度がとれません。 たとえば1000Hzの信号をゲート時間1秒で測定した場合、999〜1001Hzと3桁(最終桁は±1の誤差がある)の精度しかありません。
これに対しレシプロカル方式ですと同じように1秒間で1000.0000Hzと7桁の精度( 12800000Hz をリファレンスにした場合)がとれます。 レシプロカル方式はハードウェアで構成すればそれほど難しくなく、私も過去に何回も作っています(APM-1APM-2APM-3など)。 このときは FPGA で 32 ビットのカウンター2つで構成しました。

しかしワンチップマイコンに内蔵しているカウンター(タイマー)は16ビット程度のものが普通で、しかも協調動作するようにはできていませんのでレシプロカル方式でつくるのはちょっと面倒です。

今回試作したものは、ATMEGA88 に、入力バッファーアンプ、プリスケーラー( MB501 )、SW( TC4W53 )、アンプ( TC7SH04 + TC7SH14 )、それにログアンプ( AD8307 )です。 高周波数測定( 6MHz 以上 )やレベル表示が不要なら入力バッファとアンプだけでOKです

■試作したもの

rfc-1_proto 基板写真

左上が電源端子、その横がシリアル出力、右上が信号入力です。
表示部の左上の R はレシプロカルモードを示しています。 表示の2行目は信号入力レベルです。 入力バッファに FET のソースフォロワーを使ったためか大入力時の直線性が悪く、せっかく AD8307 をつけたのにもったいないです。 単純なダイオード検波にしておけばよかったです。

ブロックダイアグラム

AVR 内蔵のタイマー0(8ビット)とタイマー1(16ビット)を使っています。 タイマー0を比較モードで使い、比較一致割り込みの処理ルーチンでタイマー1の値を読み込みます。 割り込みは常に CPU が SLEEP 状態に入っているときに発生するようにすることで、正確な時間を保障します。

レシプロカルモードでは入力信号はタイマー0に入ります。 内部リファレンス(12800000Hz)はタイマー1に入ります。 タイマー0があるきまった回数カウントすると比較一致割り込みが入り、そのときのタイマー1の値を読みます。 それらから以下の式で周波数を計算します。  式を見るとタイマー1の逆数( reciprocal )になっているのがわかります。

ノーマルモードでは逆に、入力信号はタイマー1に入り、内部リファレンスはタイマー0に入ります。 たとえばゲート時間が1秒のときは、タイマー0が 12800000 になったときのタイマー1の値が周波数になります。 ノーマルモードではゲート時間を0.1秒とか1秒などのきりのいい数字にすれば計算は簡単になります。

計算式

上は原理的な動作を説明したもので、8ビットや16ビットのカウンターではオーバーフローの考慮や、タイマー0のカウント数をいくつにするか、周波数を計算するのに高精度の演算(8桁程度)などが必要です。 

レシプロカルモードではタイマー0の比較一致割り込みが入るまで sleep モードに入っているためタイマー1が何回オーバーフローしたかがわかりません。 そこで、まず最初にノーマルモードで測定し、大体の周波数を得、次に周波数に応じて低いリファレンスでのレシプロカルモードで中精度の周波数、その後最終的にゲート時間に応じたタイマー0カウント値で測定します。 測定で得られたタイマー1カウント値にオーバーフロー回数推定値を加え最終的なタイマー1カウント値とします。 周波数の計算は、精度が必要なので float( winavr では double は float になる)は使えず、固定小数点演算ルーチンを使いました(もとはJJY基準周波数信号源でつくったものです)。 整数部32ビット+小数部24ビットの計56ビットです。




2008/07/27

AVR のプログラムを公開しました。
まだ周波数補正値をEEPROMに書いて起動時に読み込むルーチンが入っていませんがあとは大体OKです。


2010/12/02

回路図を公開しました。
ノートに手書きのものを清書したので間違いがあるかもしれません。
また試作で終わったので定数は最適化されていません。



inserted by FC2 system