ホームページに戻るAVRマイコン4414のタイマカウンタ1を使用した周波数カウンタです。カウンタの入力(T1)に測定信号を入力し、ゲートタイムを1S間正確にはかり周波数を測定します。周波数基準は、秋月で売られている高精度クリスタル発信器12.8MHzを使用し、74HC161で1/2に分周して、CPUのクロック源としています。タイマカウンタ1は16ビットであり、最大65535カウント(Hz)なのでこれを広げるため、レジスタを一桁として使い(処理上最大23ビット)、最大8.39MHzまで表示可能です。T1の入力パルスは動作クロックの1/2程度が限界なので、実用は3.2MHz程度と思われます。(プリスケーラ無しで)桁上がり処理は、結構厄介でカウンタ1のオーバフローでレジスタ値をインクリメントしますが、この処理によりゲート時間が1Sより長くなってしまうので、それを補正する必要があります。AVRStdioシミュレーションを使って試行錯誤を繰り返し、補正ルーチンを完成させました。クリスタルの1/4(3.2MHz)周波数を入れてソフトのチェックをすると、計算どおりの値が表示されゲートタイムがちょうど1S(クリスタル基準)であることが確認できました。ソース周波数カウンタの拡張(商用周波数の測定追加)高い周波数をはかるには、適当なプリスケーラを前段に入れればことはすみますが、低い周波数をより正確(小数点以下)に計測することはこのカウンタでは無理です。ゲートタイムを、10Sとかにすれば桁は稼げますが、サンプリング間隔が長すぎ実用的ではありません。低周波測定ができる安価なテスターはほとんどなく、ネット上の製作記事でも見つかりませんでした。そこで、小数点以下が計れるモードの追加に挑戦することにしました。第3位程度まで計測することを目標にしました。周波数の計測法方法は、被計測パルス幅を基準パルス(高周波Fo[Hz])で数えその数NからFo/Nで算出する。具体的には、外部割込み(INT0)に被計測パルスを入力し、割込みと割込みの間タイマカウンタ1を進め、その値から周波数を算出します。次に、精度について考えてみます。基準は、高精度クリスタル発信器KTXO−18(12.8MHz)で精度は±3ppm(百万分率)である。1MHzで3Hz程度なので5桁は確保できます。タイマカウンタ1は16ビット(最大65535カウント)で4〜5桁なので、もう一桁レジスタを追加し5桁以上確保することにする。これで、被除数・除数とも5桁なので結果も5桁の精度が確保できます。・タイマカウンタ1の基準クロックFoは6.4MHz(CPUクロックCKを使用)・測定誤差を小さくするため、被パルスは30周期分測定する。1Hz入力回路はAC100Vにあわせ、オシロプローブ(1/10)と分圧回路を組み合わせシュミット回路をとおして、INT0の入力としてます。ロジック信号の入力できるジャックも設けました。測定パルスの最終(30回目)割込み時に、タイマカウンタオーバフローがほぼ同時に来たときの処理が問題です。�@のようにINT0割込以降(同サイクル含む)にオーバフロー割込があった場合には、オーバフロー処理が実施されないのでその処理を組む必要があります。(TOV1フラグをチェックし、桁上げ処理)逆に、�Aのようにオーバフロー割込処理中に最終割込があった場合には、オーバフロー処理が終わるまで最終割込(カウンタ停止)が実行できません。(最大+13カウント)誤差が生じます。(頻度は1/65536以下とまれです。(1/1000単位)よって、85.934Hz以下であればこれによる誤差は生じません。同様に誤差範囲を求めると、次のようになります。(誤差1未満)誤差発生周波数とその影響をまとめると、別紙一覧表のとおりになります。表内の周波数付近では誤差が含まれる可能性があります。前記の分解能とあわせ測定精度を見極める必要があります。実際に測定しているのが、次の写真です。(電源周波数は60±0.05Hz程度で変動しています。)クリスタルが正確であれば、かなりの精度が得られるはずです。一度、正確なカウンタと比較したいと思ってます。1kHzのパルス(別の高精度クリスタルを分周)をLowモードとHiモードで比較してみました。プログラムケースに組み込んだ外観です。