目次PIC入門873ハード

PIC16F873のA/Dコンバータ機能
A/Dコンバータ機能はアナログの入力信号の電圧を計測し、計測結果をデジタル情報に変換する機能です。PIC16F873では10ビットのデジタル情報に変換します。ですから、計測の最大範囲に対して1/1024の精度で計測することができます。最大計測範囲を0Vから+5Vまでの5Vとすると5/1024=0.004883(約5mV)の精度で計測できることになります。

入力ポート

PIC16F873では最大5ポートをアナログ入力ポートに指定することができます。A/D変換をするモジュールは1つしかないので、同時には1ポートの測定しかできません。でも、各ポートを順番に計測すれば、複数のポートの電圧を計測することはできます。一回の測定は約40μ秒なので、多少変動のあるアナログ電圧でもポートを切り替えながら測定することができると思います。周波数の高い信号の測定はできません。
PCFG
3210
ポート 備考
AN4AN3AN2AN1AN0
0000AAAAA
0001AVREF+AAA
0010AAAAA0000と同じ
0011AVREF+AAA0001と同じ
0100DADAA
0101DVREF+DAA
0110DDDDD
0111DDDDD0110と同じ
1000AVREF+VREF-AA
1001AAAAA0000と同じ
1010AVREF+AAA0001と同じ
1011AVREF+VREF-AA1000と同じ
1100AVREF+VREF-AA1000と同じ
1101DVREF+VREF-AA
1110DDDDA
1111DVREF+VREF-DA

どのポートをアナログポートにするかはADCON1レジスタのPCFG0からPCFG3の4ビットで指定します。この4ビットで指定できるパターンはあらかじめ決められているので、その中から選択します。
A/D変換モジュールに接続するポートはADCON0レジスタのCHS0,CHS1およびCHS2で指定します。ここで指定されるポートはTRISAレジスタの該当ビットを1にして入力モードにする必要があります。

同じパターンがあるのは、このパターンがPIC16F87xシリーズで共用にしているためです。
PIC16F874/877(40ピンタイプ)は上記ポート以外にAN5,AN6,AN7を持っており、そのパターンも考慮されています。


A:アナログポート
D:デジタルポート
VREF+:上限基準電圧
VREF-:下限基準電圧






計測レンジと計測精度

計測レンジはVSS(0V)からVDD(+5V)の範囲が基本ですが、それ以外にVREF-(下限電圧)とVREF+(上限電圧)で設定することができます。ただし、VREF-,VREF+ともVSSからVDDの範囲内でなければいけません。
例えば低電圧側をVSSとし、高電圧側をVREF+で3Vと設定した場合、計測範囲は3Vになります。この範囲が1/1024の精度で計測されるので、この場合の計測精度は3/1024=0.002929(約3mV)になります。
VREF-またはVREF+を使うのにはADCON1レジスタのPCFG0-3のパターンで指定します。
計測レンジとしてADCON1レジスタのPCFG0からPCFG3のパターン指定でVREF-とVREF+が指定されている場合にはAN2およびAN3に入力される電圧の差が計測範囲になります。
VREF+だけが指定されている場合、下限電圧はVSSになります。
VREF-、VREF+が指定されていない場合、下限電圧はVSS、上限電圧はVDDになります。




A/D変換の結果

アナログ電圧をA/D変換した結果はADRESHおよびADRESLレジスタに格納されます。この2つのレジスタは組み合わせて1つの16ビットのレジスタとして使われます。ADRESHが上位側、ADRESLが下位側です。変換された結果は10ビットなので16ビットの下側に寄せるか、上側に寄せるかを指定することができます。ADCON1レジスタのADFMビットがその指定ビットで、1は右寄せ、0は左寄せになります。




アナログ電圧の計測の仕組み

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が立ち、割り込み動作が行われます。


アナログ入力電圧によりサンプル/ホールド・コンデンサ(CHOLD)が充電される回路は左図のようになります。サンプル・スイッチ(SS)が閉じた時に充電が行われます。ダイオードはVDD以上の電圧または接地以下の電圧が入力に加わった場合の保護用です。

CHOLD:サンプル/ホールド・コンデンサ ( 120pF )
RSS:サンプリング・スイッチ抵抗( VDD=5Vで約7KΩ )
SS:サンプリング・スイッチ
RIC:内部抵抗 ( =<1KΩ )
CPIN:入力容量 ( 5pF )
ANx:入力ピン
RS:被測定回路内部抵抗 ( =<10KΩ )
VA:被測定アナログ電圧




A/D変換クロック

A/D変換動作はA/D変換クロックに基づいて動作します。1ビットの変換を行うのには約1.6μ秒の時間が必要です。(TAD)
ADCON0レジスタのADCS0ビットおよびADCS1ビットで4種類のクロックパターンを選択することができます。変換時間は1.6μ秒あれば良いので、これ以上長くしても変換に時間がかかるだけなので、なるべく1.6μ秒に近づけた方が良いわけです。A/D変換クロックはPICのデバイスクロックをベースにしているので、1.6μ秒に近づけるように選択します。
パターンは4種類しかないので、以下のような選択基準になります。

デバイスクロック選択ADCS1ADCS0計算
1.25MHz以下Fosc/200(1/1.25)*2=1.6μS
5MHz以下Fosc/801(1/5)*8 =1.6μS
20MHz以下Fosc/3210(1/20)*32=1.6μS
内部RCクロックRC11約4μS

RCはSLEEPモードでA/D変換を行うときに使用します。

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コンバータのソフトウェア処理概要

割り込み処理を使用しない場合
1.A/Dモジュールの構成を設定 (初期化処理)
アナログポート、基準電圧ポート、デジタルポートを構成ADCON1/PCFG0-3

A/D変換クロックを選択ADCON0/ADCS0-1

A/DモジュールをON状態にするADCON0/ADON
2.入力チャネル指定

A/D入力ポートを選択ADCON0/CHS0-2
3.サンプル/ホールド・コンデンサ充電時間確保

入力取得時間経過を待つ20μ秒
4.変換開始

変換開始ビットを設定ADCON0/GO=1
5.変換終了確認

変換開始ビットがクリアされるのを周期的にチェックするADCON0/GO=0?
6.変換結果読み込み

変換結果レジスタを読み込むADRESH,ADRESL
7.次の変換のために1.または2.を必要に応じて実行

割り込み処理を使用する場合
1.A/Dモジュールの構成を設定 (初期化処理)
アナログポート、基準電圧ポート、デジタルポートを構成ADCON1/PCFG0-3

A/D変換クロックを選択ADCON0/ADCS0-1

A/DモジュールをON状態にするADCON0/ADON
2.入力チャネル指定

A/D入力ポートを選択ADCON0/CHS0-2
3.割り込み条件を設定

A/D割り込みビットをクリアPIR1/ADIF=0

A/D割り込み使用ビットを設定PIE/ADIE=1

グローバル割り込み使用ビットを設定INTCON/GIE=1
4.サンプル/ホールド・コンデンサ充電時間確保

入力取得時間経過を待つ20μ秒
5.変換開始

変換開始ビットを設定ADCON0/GO=1
6.変換終了確認

割り込みを待つ
7.変換結果読み込み

変換結果レジスタを読み込むADRESH,ADRESL

A/D割り込みビットをクリアPIR1/ADIF=0
8.次の変換のために1.または2.を必要に応じて実行

割り込み処理を使う場合には、基本処理と割り込み処理の機能分担を検討する必要があります。



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モードの解除は割り込み動作で行われるので、変換完了確認は割り込み方式を使う必要があります。