PIC16F819による電圧計の追加
デジタル式タコメーターの製作6
ANALOG DIGITAL CONVERTER |
2004年 1月24日(土) 「前回はこちらから」
●オードバイ用 総合計測器へ
デジタル式タコメーターは既に完成しておりましたが、市販品のように、電圧、温度計も計れれば・・・と考えておりました。
所がタコメーターは回転パルスを受けるのでデジタル的な信号の処理でしたが電圧や温度は完全なアナログ量になります。
今回のはデジタル表示式なので、アナログ量をデジタル量にするA/D変換器が必要になります。
●アナログ・デジタル変換(量子化) - ADC
|
|
A/D変換は一般的に上図のブロックのようになっており、被測定電圧をキャパシターに一旦蓄え、
この電圧とDACから一定ステップで発生させるリファレンス電圧とを比較し、一致したときに変換が完了します。
DACの出力は2進(今回は10ビット)のカウンターとなっており、比較一致した時点でカウントが停止します。
このカウント値がアナログ入力に対する変換値となります。
アクイジョンタイムはキャパシターに被測定電圧を蓄える時間です。
●A/D付きCPUの選定
既に完成したタコメーターに採用したCPUにはA/D変換器は搭載されておりませんので、まずはA/D変換機能を持ったCPUの選定です。
回路は出来上がっておりますので、回路変更は最小限にと、ほぼピンコンパチのPIC16F819に差し替えることにします。
●A/DCの実装
次にアナログ入力系の回路追加、プログラムの追加、変更です。これで実現するからお手軽です。
しかしながら、電圧計までは良かったのですが、温度計ラインを追加するにはポートが一つ足りなくなってしまいました。
よって、仕方なくクリック音用のブザーを取り外すことにしました。
このブザーはモード切替えスイッチを押したときのクリック音ですが、エンジンがかかっていれば、聞こえない位のものなので、
これを温度入力に転用しました。
●PIC16F819 ADC関係のレジスタ設定
・ADCON0の設定 今回の設定値 「10000x0x」
|
|
★ADCS1:ADCS0 A/D 変換用クロック選択
ADCS2=1 ADCS1=1 ADCS0 =0 FOSC/64
クロックは20MHzなので変換クロックは3.2uSとなります。
ちなみに
ADCS2=0 の場合は ADCS1=1 ADCS0 =1 FOSC/32
★CHS2:CHS0 アナログ入力端子の設定
000 = Channel 0 (RA0/AN0)
今回、変換を実行するポートの設定をします。
複数のポートがある場合はここを変換前に切り替える必要があります。
★A/D変換開始→完了ビット
1=変換開始
0=変換完了
被測定電圧を内部キャパシターへ充電をし、その後、このビットに1をセットすると
ADCS2-0で設定されたクロックでA/D変換を実行し、このビットが0になる事で完了を
知らせます。
ADC完了割り込みもありますが、今回は変換完了をループによって監視する事で
完了を認識しております。
★BIT1 未使用
★ADC有効
使用しないときは0
・ADCON1の設定 今回の設定値 「11001110」
|
|
★ADFM
変換結果は10ビットなので、8ビットのレジスタ、2つに格納されます。
この時、ADRESH(8)、ADRESL(8)=16ビットと並べたときに、右寄せか左寄せ
かを設定します。今回は右寄せです。従ってHレジスターのビット7-2には常に0が入ります。ちなみにレジスタのアドレスはADRESHが1Eh、
ADRESLが9EhとなっておりますのでADRESL側の参照ではバンク切り替えが必要です。
★BIT5-4は未使用
★PCFG3-PCFG0
VREF+/−の設定並びにAN0-AN5に対し、アナログかデジタル入力かを設定
します。選択肢が限られておりますので、回路作成時に確認が必要です。今回はAN0をアナログ入力にし、
その他はデジタルとします。又、VREF+にはVDD+5V、VREF-はGNDとしました。
測定された電圧との校正は入力段の抵抗分圧と微調整ボリームで行います。
温度計用のアナログポートは次のステップで検討します。
●AD変換と表示の流れ
-------------------------------
ADC関係初期設定〜メイン
-------------------------------
・TRISA アナログ入力は入力に設定
・ADCON1の設定 BANK1
「11001110」
・ADCON0の設定 BANK0
「10000000」
・メインループ
LOOP (300mSループ)
CALL 7セグメント表示
IF A/D 実施の確認。実行しない場合は GOTO LOOP
CALL A/D変換
CALL BIN-BCD変換
GOTO LOOP
表示サイクルよりも、変換サイクルの方が遥かに早いので、表示サイクルでA/D変換を実施しております。
表示サイクルは300mS。
-------------------------------
ADCサブルーチン
-------------------------------
・ADCON0のADONをONする。AD機能が有効になる。
・アクイリジョンのためのウェイト 20-40US
被測定電圧を内部キャパシターに充電
・ADCON0のGOを1にし、このビットが0に戻るのを待つ。ループで実施。
ADC完了割り込みもあるが今回はループ待ちとした。
・ADRESHLをWORKレジスタに転送
・RETURN
●測定精度
今回のADCは10ビット=1024の分解能です。VREFは5Vとしましたので、最小分解能
は 5V/2^10=0.00488Vとなります。
測定値の表示は3桁で小数点以下1桁の設定です。
・VDD(VREF)の変動に対する測定誤差
入力部の分圧抵抗比は1:20、したがって12Vの入力で → 0.6VがAN0に入ることに
なります。よく検討せずに製作したので、VDD(VREF)変動が仮に4.9〜5.1Vとして、表示値は±0.3Vは確実に振られます。ですが、今回はバイクの電圧表示ということで、少数点以下はおまけとしました。次回、測定電圧範囲は狭まりますが抵抗分圧比率を下げて、これと共にADC値も内部で比率換算して表示すると精度があがると思います。次回温度計の搭載時はこの方法でやってみましょう。
●回路図とプログラム
「回路図」
電圧測定部分のみ 「プログラム」 全体は製作中
これにより、電圧計が追加され、電圧計により温度の測定も可能になります。
従って、デジタル式タコメーターはエンジンの回転計、温度計、そして全体の電圧計が一体化されたものになります。
各測定機能はモード切替スイッチにより切り替えて見る事になります。
|
|