Key words:ATMEL,AVR,Micro Controller,MPU,BASCOM-AVR,Frequency Counter,Simple,ATmega,ATtiny2313,AT90S2313,Fuse Bits,Fusebits

The AVR Frequency Counter,Real simple !

AVR & BASCOM-AVR:Part Five/ Build the Simple Frequency Counter !
巻・5:ATMEL AVRマイコンとBASCOM-AVRで創る『ベーシック』な周波数カウンタ

(Ver.1.0 : July 17th 2006+Ver.1.1 : July 25th 2006+Ver.1.2 : Oct. 16th 2006+Ver.2.0 : Oct. 21st 2006+Ver.2.1 : Oct. 25th 2006+Ver.2.2b : Nov. 19th 2006+Ver.2.3a : Dec. 5th 2006+Ver.2.3b : Dec. 31st 2006+Ver.2.3c : Mar. 18th 2007+Ver.2.3d : Mar. 21st 2007+Ver.2.3e : May 17th 2007+Ver.2.4 : Sep. 26th 2007+Ver.2.5a : Jan. 18th 2008)

Counter

written by Takahiro Kato JA9TTT/JH1WBU, Saitama JAPAN

http://ja9ttt.homedns.org/hamf/myexp/Basic_Counter.html



このページの目的
AVRマイコン活用の手始めとして、超簡単な周波数カウンタを製作します.ベーシックな周波数カウンタですが、AVRマイコンを使った周波数計測の基本は全て含まれています.計測範囲を拡大したり、機能の追加を行なうにしても、プログラミングの考え方はほとんど共通です.


関連のページ
AVRマイコン入門と活用・応用編には、以下のページがあります.


ご案内
左側の写真をクリックすると大きな写真を見られます.
大きな写真から戻るにはブラウザのバックボタンで戻って下さい.

LCD_Counter.JPG 回路図:
回路を説明します.実用性能を維持しつつ、最少の部品数で実現することを目標にしました.ご覧のようにLEDチカチカの回路に数点の部品を追加しただけです.測定分解能はプログラムで任意に変更できますが、下記のサンプル・プログラムを書込むと1Hzになります.測定上限周波数はマイコンのクロック周波数に依存します.おおよそ、クロック周波数の半分までです.クロックが12.8MHzなら約6MHzまでとなります.LCDに表示される桁数は内部変数の関係で10桁までですが、実際には上限周波数によって制限されるでしょう.マイコンにはLEDチカチカと同じAT90S2313を使いました.最近安価になったATtiny2313でも良いです.回路もプログラムもそのままで大丈夫です.なお、ATtiny2313を使う場合は下記の重要情報を参照して下さい.勿論、ATmega168でも良いです.ピン配置に合わせて少し配線変更し、プログラムもごく一部を変更すればまったく同じように動作します.ATmega及びATtinyシリーズを使うならヒューズビットの設定も忘れずに! 表示器は16文字2行の液晶表示モジュールです.全体の消費電流は少ないので電池動作も可能です.そのときには、U3にロー・ドロップアウト型の3端子レギュレータを使います.入力部分のダイオード(2個)は過電圧からの保護用です.AVRマイコンのカウンタ入力はシュミット回路になっています.そのまま正弦波を加えてもミスカウントの心配はありません.従って周波数カウンタの入力回路に必須な波形成形回路はなくても大丈夫です.入力アンプを省いたので高感度ではありませんが、実験の結果、約200mVの入力で測定できました.必要に応じてプリアンプを付加すれば良いでしょう.入力インピーダンスは約100KΩです.組込用途なら、信号源の近くにバッファ・アンプを設けてからカウンタ回路に接続するのが良いです.なお、回路例の測定上限は約6MHzです.上限周波数を拡大する一番簡単な方法はプリスケーラを使うことです.例えば64分周のプリスケーラを使えば簡単に300MHz以上になります.しかし、このまま低周波発振器やテストオシレータに組込んではどうでしょうか.回路が簡単なのでそのような組込用途にはピッタリだと思います.


主要部品:

AVR_2313s.JPG AVRマイコン:
写真は主役のAVRマイコンです.写真上のAT90S2313を使って製作しました.旧型でまだ入手はできますが既に生産中止品になっています.入門用にはAT90S2313が安直なので第一にお薦めできます.写真下のATtiny2313が新型の互換品ですが、少々注意が必要です.ATtiny2313を使うにはFusebit(ヒューズ・ビット)と言うものを書き換えてやる必要があります。書き換えは難しくはありませんが、『入門編(4):ATtiny2313への乗換えかた』に方法を纏めておきました.そのほか、ATmega8/48/88/168などのATmegaシリーズなど、Timer0Timer1の2つのタイマー/カウンターを内蔵するAVRマイコンならどれでも同じように使えます.もちろん、違うチップを使うならピン配置に合わせて回路とプログラムを部分的に修正します.12.8MHzのクロックで使うのでチップの上限周波数にも注意します.少々のオーバークロックは大丈夫です.

重要情報:BASCOM-AVRのバグに関して:
現時点(2007年9月26日)における、BASCOM-AVRはVer.1.11.8.8が最新です.このバージョンは、その前のバージョン(Ver 1.11.8.5など)のバグが解消され、ATtiny2313も問題なく使えるようになりました.以前の、Ver.1.11.8.5(またはVer.1.11.8.3)は条件によりATtiny2313が正しく動作しないことがありました.従って、ATtiny2313を使うには古いVer.1.11.8.1(またはそれ以前)もしくは、Ver.1.11.8.7 以降の最新版を使う必要があります.それさえ注意すれば、プログラムはどちらの2313でも動きます.もちろん、ATtiny2313を使うならヒューズビットは外部水晶に設定します.ATtiny2313の詳細については『入門編(4):ATtiny2313への乗換えかた』に纏めておきました.(追記:Sep 26th 2007)


12800KHz.JPG クリスタル:
従来の周波数カウンタでは、例えば10MHzなどの基準発振器(タイムベース)が内部にあって、それに基づいて測定していました.マイコン式の場合、測定の基準(タイムベース)はマイコンに与えるクロックそのものです.マイコンは自身が動作するクロックを基準にして測定しますからもちろん安定でなくてはなりません.従ってセラミック振動子(商品名:セラロックなど)では安定度が不足します.必ず水晶発振にしてください.但し、周波数の絶対精度はあまり問題ではなく、安定度が良好なら良いのです.基準周波数の誤差はプログラムによって補正可能だからです.また周波数も12.8MHzに限りません.プログラムの部分修正である程度任意に変更できます.このように柔軟性があるのがマイコン式周波数ウンタの特徴です.安定度を保証する最も良い方法は写真左上のTCXO(温度補償型水晶発振器)を使うことです.しかし普通の水晶でも10ppm(10/100万)以下の精度に追い込むのは容易です.なお、プログラムによる誤差補正はステップ状です.さらに精度を追い込むために周波数を0.01%くらい微調整できる必要があります.回路図にはトリマ・コンデンサの記載がありませんが、C2もしくはC3を可変するか、場合によって水晶と並列に20pF程度のトリマコンデンサを入れます.水晶によって誤差の傾向が異なるので試して決めます.誤差が目立って来るのは高い周波数を測定するときです.低周波専用なら無調整でも問題なく実用になりますが、周波数の『測定器』なのですから、なるべく校正すべきです.HAM局の場合は、ジェネカバ受信機を使い標準電波と比較校正で絶対値校正できますが、他のホビーのお方は何らかの工夫が必要でしょう.


AK_LCDs.JPG 液晶表示モジュール:
簡単化のために周波数表示には液晶表示(LCD)モジュールを採用しました.写真上のモジュールはバックライト付きですが、十分な明るさにバックライトを点灯させるにはかなり電流を流さねばなりません.電池が電源ならバックライトの常時点灯は不適当です.秋月では写真下のように大きいLCDモジュールもあって、文字が大きくてコントラストも強いのでかなり読みやすいです.但しこちらの方はバックライトはありません.液晶表示モジュールではなくて、発光ダイオード(LED)表示器を使うほうが視認性は優れています.しかし最少部品数の実現と、プログラムの簡略化のためには液晶表示モジュールを使うのが一番です.組立て配線も楽です.

液晶モジュールの電源ピンについて:(注目!)
市販されている液晶表示モジュールには各種のものがあります。キャラクタ・タイプの液晶モジュールなら、制御コマンドは共通なのでBASCOM-AVRからはどれも同じように使えます.但し、一部のモジュールでは、電源とGNDピンが逆になっているものがあるので十分注意してください.サイトに掲載の回路図は、秋月電子通商で売っている写真上側のモジュールSC1602BSLB(バックライト付き)またはSC1602BS*B(バックライト無し)のピン接続に合わせて書いてあります.同じモジュールを使うなら回路図通りの配線で結構です.種々の液晶表示モジュールについて、調査した結果、SC1602BSLBの電源ピン配置(Pin_1=Vcc、Pin_2=GND)はむしろ例外的であることがわかりました.他の多くのモジュールでは、Pin_1=GND、Pin_2=Vccになっています.使用に際しては、お手持ちの説明書を良く読んで十分確認してから配線して下さい.すぐに気付いて正しい配線に戻せば大丈夫だったという報告もありますが、逆に電圧を加えればダメージを与えてしまう可能性があります.写真下側のデカ文字液晶モジュール、PWB16230Aも、一般的なPin_1=GND、Pin_2=Vccであり、掲載の回路図とは電源とGNDピンが逆ですので十分に注意して下さい.秋月ではその他4行表示のモジュールなどありますが、その殆どがPin_1=GND、Pin_2=Vccになっています.(追記:Nov.23rd 2006)


AVR_TEST_Board.JPG 組立の一例:
ユニバーサル基板を使って製作しました.部品数が少ないので簡単です.基板化しておけば再利用しやすいかもしれません.あとで適当なケースに組み込みましょう.なお、写真の例ではLCD表示部を分離するようにしましたが、独立させず基板上に一体に作っても良いでしょう.
調整:
取りあえず無調整でもよいですが、もし高精度の発振器があれば、それを測定しながら調整すればベストです.校正手段がないなら無調整で使っても少なくとも0.1%程度の精度はあるでしょう.


プログラム:

Counter_V011.JPG 動作原理を詳しく説明すると長くなるので取りあえず省略します.それほど難しいプログラムではないので、あとはご自身で研究されてください.基本的に普通の周波数カウンタの原理をマイコンチップ内蔵のタイマー/カウンタ機能とプログラムによって実現したものです.(注:専ら個人的な趣味への利用に限ります.他所への掲載を含め、無断で販売や頒布を目的に利用しないで下さい.部分的であっても利用したい場合は問い合わせること.)


BASCOM仕様変更への対応:
現在のBASCOM-AVRはVer.1.11.8.8になっています.Ver.1.11.8.7以降では、Timer/Counterコマンドの一部に仕様変更があったようです.お使いのBASCOM-AVRのバージョンによっては、図の*1の行「Enable Counter1」がコンパイル時にエラーになるかもしれません.もし、エラーになっ場合は、*1の行を「Enable Timer1」と書き換えて下さい.プログラムの他の部分を変更する必要はありません.なお、古いバージョンのBASCOMでは逆にエラーになるかも知れませんので、適宜変更してお試し下さい.


お願い
マイコンのプログラムを掲載するとお問い合わせのメールが来るそうです.改造方法やご自身で改造したがうまく動かないなどのご相談のようです.初心者の手助けはやぶさかではないのですが、個人の力には限界があります.まずは、掲示板の方に『何を目的として、どんな改造を行ったら、どのような症状なのか』を具体的に整理してお書き下さい.ご覧のエキスパートが親切に回答してくれるでしょう.さらに必要そうなら個別にメールを差上げます.Spam対策をして掲示板にメールアドレスをご記入下さい.上記に掲載のプログラムは、周波数カウンタとして必要最低限の機能にしぼった参考用です.自分なりのニーズに適用する方法は各自でご研究ください.様々なトラブルも皆さんの相互扶助で解決できると思います.なお、上記プログラムの書込み済みチップが必要ならご相談下さい.(有償)


FC_LCD_Disp.JPG さて、周波数計測の基本を実現しただけのシンプルなプログラムなので、周波数はこのように表示されるだけです.表示を工夫できるように便利なコマンドがBASCOM-AVRには備わっています.Hz単位表示ばかりでなく、途中に小数点を入れてKHzにするなどFormat文を使った文字列処理で容易にできます.その辺りを各自工夫してみたら面白いでしょう.そうした自由があるからこそ、自身でプログラムをいじる意味があるわけです.上記のプログラムは、加工するための素材と言うことです.


エピローグ
いまでは既製品の周波数カウンタが安価に売っています.テスタのオマケ機能として付いていることもあります.しかし、もし持っていないなら一台自作してはどうでしょう.カウンタ専用チップを使ってもこのAVRカウンタほど簡単には作れません.簡単だからといって、精度が悪い訳ではありません.TCXOでも使えばちょっとしたメーカー製と同等の精度になります.ラジオの工作には勿論ですが、オーディオなど低周波回路の製作にも一台あれば重宝です.独立した測定器として製作するばかりではありません.簡単なLC発振器を自作して周波数カウンタを内蔵すれば、読取精度抜群のテストオシレータが作れます.ラジオの調整に便利に使えます.部品代は2,000円も掛かりません.組込用に最適でしょう.

HAM用としては、上限周波数が6MHzでは物足りないかもしれません.より高速のチップを使いクロック周波数を高くすれば回路はそのままで上限アップできます.しかしそれでもせいぜい15MHz位までです.それ以上を実現するには幾つかありますが、いずれも部品を追加する方法になります.もっとも簡単なのはプリスケーラを前に置く方法です.一方、測定分解能を犠牲にすることなく上限周波数をアップするには、少々複雑になります.それに応じてプログラムの変更も必要です.そうした本格的な周波数カウンタも面白いので何れは公開するつもりです.しかし上限周波数を伸ばすのも良いのですが、このシンプルなままでも大いに役立つことがわかります.なにしろシンプルさではこの上ないものです.また、中波ラジオの周波数表示用ならそのままで十分な性能です.ラジオ・カウンタに変身させるには、まずゲート・タイムを100mSecにします.更に計測値を1/10にして100Hzの桁までの表示にすると使い易いようでした.これはダイヤル操作への追従性などを検討した結果です.もちろんIF周波数分は測定値から差し引き、局発の実測周波数をオフセットして受信周波数が表示されるようにします.こうした変更は難しくないので、プログラムの動きを眺めればご自身でできると思います.しかし、もし難しいようでしたら、IF=455KHzのラジオ・カウンタ用でしたら参考用に供給します.プログラミングに興味はないが、ラジオのデジタル表示用の素材として『ラジオ・カウンタ用チップ』が欲しい方も可です.お問い合わせ下さい.ご返事には暫く時間を頂くことがあります.

さっそくマイコン式カウンタの実用編・ラジオカウンタに進むにはこちらで.


Back to Experiments Index

Back to Site Top


End / おわり

(c)2006 Takahiro KATO All rights are reserved.
Not for republication in any form without written permission.