PIC16F675でADC入力7セグLED表示(車電圧計予備実験その3) |
PIC12F675使用バッテリー電圧テスター予備実験その3です。
CPUはPIC16F675で、ADC入力からの電圧を7セグメントLEDに表示します。7セグメントLEDとの表示接続の信号数をけちり4ポートで表示するためバイナリーカウンタTC4040Bの力を借ります。TC4040Bは14段バイナリーリップルカウンタです。
PIC16F88でADC電圧取得、7セグメントLED点灯の基本をやって、次同じくPIC16F88とTC4040V組み合わせを実験。これで自信を得最終のPIC12F675まで来ました。でも回路をまずブレッドボード上にでっち上げます。次はちょっと小ましなケースを探してきて仕上げですが、今回は回路方式が旨く行くかどうかまでの検証実験です。
仕様はPIC16F88で行った実験その1、その2を踏襲しています。IOポートをケチってカウンタでLEDを多数駆動するというのはEDN誌10年6月号のdesign ideas欄に掲載されています。その前には同じEDN05年9月号にも同様記事が載っているようです。PIC12F675ではシンボリックデバッギングはできませんので、PIC16F88で実験を重ね、なるだけリスクを少なくして一発動作を狙います。
項番 | 項目 | 内容 | 備考 |
1 | シガーライタ接続 | 電圧をシガーライターからとるので、3端子レギュレータ5Vを入れます。車の発電系統からのサージ電圧対策のチョークコイルとツェナーダイオードを保護に入れます。 | 車の発電系統からの百ボルトを越えるサージ電圧からの保護回路。 |
2 | ADC入力 | AN0を使い3端子電圧の入力部から5.35分の1に分圧して取り込みます。 | ADC電圧取得ソフトUART出力実験のルーチンを流用。 |
3 | ADC仕様 | 参照電圧はVddとVssです。減電圧とか飽和電圧を考慮すると4.8VをADRESHへ256分割か。(4.8V/256)*5.35=0.1となり、ADCされた後の1ビットの重みが0.1Vになります。 | Vddにも依存するし5.35分の1の分圧は難しそうなので、固定抵抗と半固定抵抗にして調整することにします。 |
4 | 表示電圧仕様 | AN0からのADC入力、ADRESHの8ビットを0.1V単位と思い数字表示します。 | |
5 | 7セグメント変換 | ADC出力のADRESHをバイナリから3桁のバイナリー電圧値をデシマルに変換、得た数字を桁ごとにセグメントabcdefgに分解します。、 | abcdefgDPは4040Bの各段の出力につなぎます。 |
6 | カウンタ値変換 | 4040Bのカウンタ段出力がabcdefgDPにあたるので、該当カウンタ段をトグルことができる値に変換します。 | 光らせたいカウンタ段が1になる値を足し算します。 |
7 | ダイナミック表示 | 人間視覚の残像現象を利用し、2m秒間程度各桁を表示して、桁切り替えします。 | 同時駆動セグメントが多いとセグメントあたりの電流が減るので、セグメント数に応じ駆動時間を加減します。 |
8 | 小数点表示 | 2桁目LEDの小数点を光らせます。 | DPもカウンタにつながっており、128カウントで光るはず。 |
9 | ゼロサプレス | 10の位が0のときは表示をやめます。 |
以上の仕様ができたところで回路図を書きました。PIC12F675はポートが6つありますが、そのうちGP3はMCR兼用の入力専用端子です。アナログ入力はGP0,1,2、4にしかアサインできません。そんな条件をくぐりぬけて、7セグメントの表示にあてられるのは4本。カウンタの接続はカウント入力とリセット共用。桁ドライバは3本ということになります。
回路図はBSch、水魚堂さんのものを利用。また記号類は公表されているライブラリーを流用しました。ご提供感謝します。
7セグメントLEDは3桁カソードコモンを使用し、LED電流制限抵抗は桁に一個とし、表示セグメントが多いときは表示駆動時間を延ばして見た目の輝度を上げるようにします。
一点要改良点があります。桁駆動は2SC2458ですが、入力OFF時にICBOがもれて別桁で表示されるセグメントがわずかに光ります。ここに使用するトランジスタはベースがグランドにクランプされるデジトラの方が良いようです。もちろんBE間に抵抗を入れてもよいです。
7セグメントLEDのセグメント駆動信号はカウンタをトグルことで作り出します。たとえばDPはQ8なので、128パルス入れてやると出力がHになります。セグメントaは1、bは2という様に光らせたいカウンタ段をトグルことのできる値を足し算してTC4040BPに与え、該当桁の光らせたいセグメント分のパルスを与えた後、桁をダイナミック駆動します。7セグメントの表示ルーチンは独立、hファイルを利用し引き込みます。delay関数を使うのでdelay.hも必要です。そしてmain関数です。
ADC入力をソフトUARTでPCに出力する実験をPIC12F675で一度やってますので、確実に動かすため、main関数はそのソフトを流用します。7セグメントLED表示はPIC16F88でこなしましたので、大体わかったつもり。
今回PIC12F675ではPICKIT2はプログラマとしてしか使えませんから、コンパイルしたら一発必中です。デバッグは結構スムーズに進行しました。PIC16F88ではPICKIT2では動くのに、チップ単体では動かなくなるといういやらしい不具合に見舞われています。このPIC12F675ではそんなことはありませんでした。プログラムでの設定が悪いのかと思ってましたが、こっちでは動くのでやっぱりコンパイラが怪しいですね。V9.70でもV9.71aでも同じです。
なお今回からMPLABはリビジョンアップになりました。開発デバッグ環境はMPLAB IDE V8.53 HiTECH C V9.71aです。
2番目に小さいブレッドボードに収まりました。CPUとICSPは、ブレッドボードへ差込できるICSP実験基板を使っています。この基板にはデバッグ用LEDも乗っており、GP2にあたる小数点以下桁ドライブ信号がでているのが確認できました。
せっかくここまでできたので、こぎれいなケースに入れて見たいと思っております。
内容と表現は著作権法で保護されています。by nobcha 2010