A/Dコンバータ機能はアナログの入力信号の電圧を計測し、計測結果をデジタル情報に変換する機能です。PIC16F873では10ビットのデジタル情報に変換します。ですから、計測の最大範囲に対して1/1024の精度で計測することができます。最大計測範囲を0Vから+5Vまでの5Vとすると5/1024=0.004883(約5mV)の精度で計測できることになります。 入力ポート PIC16F873では最大5ポートをアナログ入力ポートに指定することができます。A/D変換をするモジュールは1つしかないので、同時には1ポートの測定しかできません。でも、各ポートを順番に計測すれば、複数のポートの電圧を計測することはできます。一回の測定は約40μ秒なので、多少変動のあるアナログ電圧でもポートを切り替えながら測定することができると思います。周波数の高い信号の測定はできません。
計測レンジと計測精度 計測レンジはVSS(0V)からVDD(+5V)の範囲が基本ですが、それ以外にVREF-(下限電圧)とVREF+(上限電圧)で設定することができます。ただし、VREF-,VREF+ともVSSからVDDの範囲内でなければいけません。 例えば低電圧側をVSSとし、高電圧側をVREF+で3Vと設定した場合、計測範囲は3Vになります。この範囲が1/1024の精度で計測されるので、この場合の計測精度は3/1024=0.002929(約3mV)になります。
A/D変換の結果
アナログ電圧の計測の仕組み A/Dモジュールではアナログ入力ポートに加えられた電圧によりモジュール内部のサンプル/ホールド・コンデンサを充電し、このコンデンサの電圧を測定してデジタル値に変換します。ですから、入力ポート(チャネル)をADCON0レジスタのCHS0,CHS1およびCHS2で指定した後、コンデンサの充電が完了するまで変換開始を待つ必要があります。この時間は自動的には行われないので、ソフトウェアの処理でチャネル指定してから変換開始指示までのタイミングをとる必要があります。この時間は約20μ秒です。 充電完了を見計らってA/D変換を開始させます。変換時間は変換クロックにより異なりますが最短で約20μ秒です。変換中、入力ポートは変換モジュールから切り離されるので、変換中に入力電圧が変動しても、変換結果に影響しません。 A/D変換はADCON0レジスタのGOビットを1に設定することにより開始されます。変換が完了するとGOビットが0になります。変換完了を検出する方法はGOビットが0になるかどうかを周期的に確認する方法と割り込み機能を使う方法があります。割り込み機能を使った場合(PIEレジスタのADIEビットおよびINTCONレジスタのGIEビットを1に設定)、変換が完了するとPIR1レジスタのADIFビットに1が立ち、割り込み動作が行われます。
A/D変換クロック A/D変換動作はA/D変換クロックに基づいて動作します。1ビットの変換を行うのには約1.6μ秒の時間が必要です。(TAD) ADCON0レジスタのADCS0ビットおよびADCS1ビットで4種類のクロックパターンを選択することができます。変換時間は1.6μ秒あれば良いので、これ以上長くしても変換に時間がかかるだけなので、なるべく1.6μ秒に近づけた方が良いわけです。A/D変換クロックはPICのデバイスクロックをベースにしているので、1.6μ秒に近づけるように選択します。 パターンは4種類しかないので、以下のような選択基準になります。
PIC16F873では変換に12ビット相当の時間がかかります。実際に変換するのは10ビットですが、前後に1ビットづつ前処理時間、後処理時間がかかります。1ビットの変換時間を1.6μ秒とした場合、変換時間は1.6x12=19.2μ秒になります。1ビットの変換時間がもっと長い場合にはもっと時間がかかります。10MHzクロックの場合、Fosc/32を選択することになり、その場合の1ビット変換時間は(1/10)*32=3.2μ秒で12ビット相当では38.4μ秒かかることになります。 A/Dコンバータのソフトウェア処理概要 割り込み処理を使用しない場合
割り込み処理を使用する場合
割り込み処理を使う場合には、基本処理と割り込み処理の機能分担を検討する必要があります。 SLEEPモードでのA/D変換 PIC動作の雑音がA/D変換に影響しないようにSLEEP状態でA/D変換を実行することができます。 SLEEPモードで変換する場合にはA/D変換クロックとしてRC発振器を使う必要があります。RC発振器にするのにはADCON0レジスタのADCS0およびADCS1を両方とも1に設定します。この場合、1ビットの変換時間は約4μ秒になります。SLEEPモードにするタイミングはADCON0レジスタのGOビットを1にして変換起動指示をした直後のステップでSLEEP命令を実行してPICをSLEEPモードにします。SLEEPモードの解除は割り込み動作で行われるので、変換完了確認は割り込み方式を使う必要があります。 |