周波数カウンタ ホームページに戻る
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(クリスタル基準)であることが確認できました。
4MHzのクリスタルを1/2に分周して測定 クリスタルの1/4(3.2MHz)の入力(見やすく','を追加)
(pushSWには意味がありませ、以前製作の残がいです)
周波数カウンタの拡張(商用周波数の測定追加)
高い周波数をはかるには、適当なプリスケーラを前段に入れればことはすみますが、低い周波数をより正確(小数点以下)
に計測することはこのカウンタでは無理です。(1Hz単位) ゲートタイムを、10Sとかにすれば桁は稼げますが、サンプリング
間隔が長すぎ実用的ではありません。
低周波測定ができる安価なテスターはほとんどなく、ネット上の製作記事でも見つかりませんでした。 そこで、小数点以下が
計れるモードの追加に挑戦することにしました。ターゲットは個人的に(仕事上)興味のある商用周波数(50/60Hz)を小数
第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周期分測定する。
・1/1000まで計算させるため Fo*1000*30/N (整数除算、小数以下四捨五入)
(Fo*1000*30=6.4*106*103*30=1.92x1011≒237 ∴ 37ビット/24ビット除算)
・実用測定範囲 11.444 〜 9798[Hz]
・分解能(後記の誤差がない場合)
<309.839Hz 0.001Hz
−<979.80Hz 0.01Hz
−<3098.4Hz 0.1Hz
−<9798Hz 1Hz
入力回路はAC100Vにあわせ、オシロプローブ(1/10)と分圧回路を組み合わせシュミット回路をとおして、INT0の入力としてます。
ロジック信号の入力できるジャックも設けました。
ソフト処理は出来上がってみればたいした内容ではありませんが INT0とタイマ1オーバフロー2つの割込みを使用するため、苦労 しました。
測定パルスの最終(30回目)割込み時に、タイマカウンタオーバフローがほぼ同時に来たときの処理が問題です。
まず、@のようにINT0割込以降(同サイクル含む)にオーバフロー割込があった場合には、オーバフロー処理が実施されないのでその
処理を組む必要があります。(TOV1フラグをチェックし、桁上げ処理)
逆に、Aのようにオーバフロー割込処理中に最終割込があった場合には、オーバフロー処理が終わるまで最終割込(カウンタ停止)が
実行できません。そのためオーバフロー処理分 (最大+13カウント)誤差が生じます。 (頻度は1/65536以下とまれです。)
誤差が生じる範囲
A:被除数 1.92x1011、C:カウンタ値 とすると
A/C-A/(C+13)<0.5 → C2+13C−26A>0 → C>2234271
∴f<A/2234271=85934 (1/1000単位)
よって、85.934Hz以下であればこれによる誤差は生じません。
同様に誤差範囲を求めると、次のようになります。
11.444−85.934Hz (誤差なし)
85.935−<271.75Hz (誤差0.01未満)
271.75−<859.3Hz (誤差0.1未満)
859.3−<2717Hz (誤差1未満)
誤差発生周波数とその影響をまとめると、別紙一覧表のとおりになります。
表内の周波数付近では誤差が含まれる可能性があります。前記の分解能とあわせ測定精度を見極める必要が
あります。
実際に測定しているのが、次の写真です。(電源周波数は60±0.05Hz程度で変動しています。)
クリスタルが正確であれば、かなりの精度が得られるはずです。一度、正確なカウンタと比較したいと思ってます。
1kHzのパルス(別の高精度クリスタルを分周)をLowモードとHiモードで比較してみました。
LOWモード Hiモード
ケースに組み込んだ外観です。