PICマイコンを使って測定ツールを作ってみよう(1) ―― クロック周波数やモータの回転数を測れるカウンタを作る(前編)

中西 紫朗

2.カウンタを作る

 では,まず1番目のカウンタ機能について説明していきましょう.

 現状の図1の回路で測定できるのは,マイコン基板のクロックぐらいです.0V~5Vで,矩形波のクロックでないと測定できません.信号発生器などのサイン波で+/-の両方向にふれる電圧波形のクロックを測定する場合,コンデンサで直流分をカットし,10KΩ程度の抵抗でプルアップ/プルダウンして,信号を2.5Vの中点にもっていきます.

 小信号の場合は,OPアンプかトランジスタを入れて増幅させます.今回のユニバーサル基板と感光基板ではその回路は入っていませんが,本格的に業者に基板を発注するときは,その回路を追加します.

●クロック周波数からモータの回転数,落下物の個数の測定まで

 そもそもカウンタは何の役にたつのでしょう.「周波数を測定するため」と言えばそれまでですが,実際にはかなり広範な応用があります.

 まず,マイコン基板を組み立てたときに確認するべき項目が,電圧とクロックです.これが正常でないと動作しません.電圧はテスタで測れますが,1MHz以上の周波数を通常のテスタで測るのは無理です.このとき,この基板で周波数を測れば,クロックが正常に出ているかどうかが分かります.よくコンフィグの設定を間違えてうんともすんとも言わないことがありますが,このようなときにクロックを確認できると非常に役立ちます.回路の中には,いろいろなクロックを生成するものもあるので,どこまで回路が正常に動作しているかも分かります.

 それ以外の応用として,フォトセンサやホール素子を使ったモータの回転数の測定が考えられます.およそ回転するものは,たいていセンサを使って回転数を測定できます.また,フォトセンサで落下物の個数もカウントできます.チップ抵抗などの小さい部品を一度に一個づつ通過するように工夫して,数をカウントします.自然界では回転数や数量を測定する要求はたくさんあります.こういうときに活用できると思います.

●計測にはマイコン内部のタイマ・カウンタを活用

 カウンタはPICマイコンの内部機能で実現しています.ファームウェア(一般のアプリケーション・プログラムと区別して,組み込み用のプログラムはこう呼ぶ.よりハードウェアに近いプログラムと言える)でタイマの設定を行うと,カウント機能を使えます.

 PIC18F2550は4種類のタイマ・カウンタを内蔵しており,8ビット・カウンタが1個,16ビット・カウンタが3個あります.カウント・クロックには,内部クロックと外部クロックのどちらかを指定できます.水晶発振子か水晶発振器を使うと,精度の高い内部クロックが得られ,カウント値も正確な時間に比例します.非定常なクロック,例えばセンサからの信号を外部クロックにつなぐような場合に,イベント間の時間測定も行えます.

 PICマイコンにはいくつかの種類があります.例えばPIC16F877のTimer0は8ビット・カウンタですが,前段に8ビット・プリスケーラを持っているので,実質16ビット・カウンタとして使えます.一方,今回使用するPIC18F2550では,これが16ビット・カウンタとして実装されており,実質24ビット・カウンタとして使えます.

 カウンタとして使うときには,一定周期,例えば100ms(ミリ秒)のクロックを別のタイマに与えないといけません.Timer1を100msタイマとして設定して,その間に入力された外部クロック数をカウントします.つまり,100msごとにTimer1の割り込みが発生するように設定して,その割り込みサービス・ルーチン(ISRと呼ぶ)の中でTimer0のカウンタ値を読み出し,また0に設定すれば,100msごとに外部入力クロック数をカウントできます.

 Timer1を100msカウンタに設定するには,プリスケーラと初期値を適切に設定する必要があります.プリスケーラの分周比を小さくすれば,それだけ測定精度は高くなりますが,測定可能最大値が小さくなります.ここでは,1:8を選択します.PIC18F2550基板には20MHzの水晶発振子が載っているので,その1/4の5MHzが内部クロックになります.つまり200nsが1周期となります.これを1/8に分周するので,Timer1には1.6μsの周期のクロックが入力されることになります.100msのタイマにするのなら,62,500カウントすればいいことになります.アップ・カウンタとして使うのであれば,最大値が2^16(=65,536)なので,初期値を65,536-62,500=3,036(10進表示)=0x0BDC(16進表示)にすれば,100ms後にタイマ・オーバフローの割り込みが起こります.図2にカウンタの基本回路を示します.



図2 カウンタの基本回路

 

●100MHz程度の信号は測定できるかも...

 内部クロックを使うため,通常の同期回路では内部クロックを超えた周波数は測定できませんが,タイマ・カウンタが内部クロックと非同期で動作する場合は,20MHzを超える測定も可能です.同じプロセス世代のCMOS技術で作られたCPLD(Complex PLD)の最大カウンタ周波数が125MHz程度ですが,これくらいは測定できるかもしれません.ためしに66.666MHzの水晶発振器の信号を入力したところ,きちんと測定できました.表2にカウンタの測定結果を示します.

表2 カウンタの測定結果

 

 表2を見ると,不思議なことに実際の測定値が推定値と等しくなっていません.測定値を約2.4倍してやると,推定値になります.カウンタとしては直線性があるので,これに定数をかけて正確な周波数が得られればOKなのですが,エンジニアとしては気持ちの悪いものです.どうもUSB関連の処理でタイマが途中で止まっているのかもしれません.SLEEP命令が使われていると,その間クロック入力が停止され,回路は止まってしまいます.または,どこかに考え違いの場所があるのでしょうか?

 比例関係は保っているので,実用上は問題ありませんが,精度よく周波数を測定したいときはこのままでは使えません.問題を深く掘り下げてから検討する必要があります.

 

*                 *                  *

 

 次回はMPLABの使い方を含めたファームウェアの作成方法を詳細に説明します.デバッグ結果ともどもご期待ください.


なかにし・しろう
(有)NSL

«  1  2
組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日