周波数カウンタ       ホームページに戻る

  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(クリスタル基準)であることが確認できました。 

    FC.JPG - 15,300BYTES     FC1.JPG - 15,068BYTES

      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*10*10*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回目)割込み時に、タイマカウンタオーバフローがほぼ同時に来たときの処理が問題です。

  FLOW.JPG - 43,603BYTES

   まず、@のようにINT0割込以降(同サイクル含む)にオーバフロー割込があった場合には、オーバフロー処理が実施されないのでその

 処理を組む必要があります。(TOV1フラグをチェックし、桁上げ処理)

   逆に、Aのようにオーバフロー割込処理中に最終割込があった場合には、オーバフロー処理が終わるまで最終割込(カウンタ停止)が

 実行できません。そのためオーバフロー処理分 (最大+13カウント)誤差が生じます。 (頻度は1/65536以下とまれです。)

   誤差が生じる範囲

     A:被除数 1.92x1011、C:カウンタ値  とすると

       A/C-A/(C+13)<0.5  → C+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程度で変動しています。)

  クリスタルが正確であれば、かなりの精度が得られるはずです。一度、正確なカウンタと比較したいと思ってます。

     FC2.JPG - 16,906BYTES 

    1kHzのパルス(別の高精度クリスタルを分周)をLowモードとHiモードで比較してみました。

   COUNT1.JPG - 8,851BYTES   COUNT2.JPG - 9,942BYTES

                  LOWモード                                           Hiモード        

       回路図        プログラム

  

    ケースに組み込んだ外観です。

      FCASE.JPG - 27,520BYTES