目次 > 9章PIC18編 > PIC18F2320 > A/D変換を使う

A/D変換を使う

更新日2009.8.1

ここでは、PIC18F2320のA/D変換機能を使って見ます。PIC16とほとんど同じように使えます。
オシレータは内部クロックを使い8MHzとしました。

実験回路

今回の実験回路は「液晶ディスプレイ(LCD)を使う」の回路に、A/D変換用に可変抵抗を追加したものです。

RA0/AN0に5KΩの可変抵抗を接続し、可変抵抗で分圧した電圧をA/D変換します。

A/D変換の最大入力インピーダンスは2.5KΩが推奨値ですが、今回は精度もスピードも要求しませんので5KΩの可変抵抗とし、RA0/AN0に接続しています。

LCDは、SD1602を使いましたが、SC1602でも互換があります。

ブレッドボードに組んだ状態
回路図の可変抵抗は、5.1KΩの固定抵抗にしています。

コントラスト調整が必要な場合は回路図通りに可変抵抗にして下さい。

左上の5ピンのヘッダピン周りは回路図には有りませんがICSP用です。

A/D変換について

PIC18のA/D変換は、PIC16とほとんど同じです。

PIC18F2320では、AN0〜AN4AN8〜AN12の10ポートをアナログポートに設定可能で、プログラムによりピン毎にデジタル/アナログどちらかに設定できます。
ただし、10ポートから任意に選択できるのでは無く、アナログポート番号の小さい方からn個をアナログ設定にすると言う選択方法になります。PIC16F87xなどと同じです。

ピン番号デジタル設定アナログ設定
2RA0AN0
3RA1AN1
4RA2AN2
5RA3AN3
7RA5AN4
23RB2AN8
24RB3AN9
22RB1AN10
25RB4AN11
21RB0AN12
アナログ入力に設定したポートは、入力電圧を10ビットのデジタルデータに変換することができます。
変換は、基準電圧(後述)を1024として測定電圧を表現します。

ADres=Vin/(Vref/1024)

ただし、ADresの最大値は1023です。(10ビットの最大値で、16進表現で'3FF'まで)

例えば、基準電圧が5Vで測定電圧が2.5Vの場合、AD変換の結果(ADres)は512になります。

ADres=Vin/(Vref/1024)
=2.5/(5/1024)
=512
【参考】
基準電圧は、+と−の両方が指定できます。(Vref+/Vref-)
ここでは、−側を0Vとして記載しています。


A/D変換の手順

A/D変換を行う手順は以下の通りです。(詳細設定は後述)

(1)A/D変換機能の初期設定
以下の5つのレジスタ設定を行います。

TRISA/BA/D変換で使うポートを入力モードに設定
ADCON0A/D変換チャネルの指定,A/D変換を有効に設定
ADCON1ANポートの設定,基準電圧の選択
ADCON2A/D変換のクロック設定,アクィジション時間の設定,A/D変換結果の格納方法を設定

(2)A/D対象ポートの選択
1回のA/D変換動作で対象とできるポートは1ポートだけですので、今回対象とするポートを選択します。
この選択は、ADCON0レジスタのCHS3−0で指定します。
使用するアナログ入力が1ポートだけであれば、この処理は初期設定で1回やっておけばOKです。

(3)A/D変換準備完了を待つ
PIC内蔵のA/D変換用コンデンサ充電完了を待ちます。
この時間をアクィジション時間と言い、入力抵抗が推奨値の2.5KΩの時、約13μ秒です。

PIC16では、A/D変換開始前にプログラムで待つ必要がありましたが、PIC18ではA/D変換の中で待つ事が可能になりました。(ADCON2レジスタのACQT2-0で時間設定)

(4)A/D変換を開始する
ADCON0レジスタのGO/DONEビットをONにしてA/D変換を開始します。
ADCON2レジスタのACQT2-0で指定したアクィジション時間だけ待った後、A/D変換が開始されます。

(5)A/D変換完了を待つ
ADCON0レジスタのGO/DONEビットがOFF(A/D変換完了)になるのを待ちます。

(6)A/D変換結果を使う
A/D変換結果が、ADRESHADRESLレジスタに格納されていますので、目的に応じて使用します。

(7)繰り返す
繰り返す場合は、(2)に戻ります。

【参考】
A/D変換完了を待つ方法として、上ではADCON0レジスタのGO/DONEビットがOFFになるのを待っていますが、A/D変換完了割込みを使う方法もあります。
A/D変換完了割込みを使う場合、以下のレジスタ操作が必要です。
 INTCON,PIR1,PIE1,IPR1

更に別の方法として、A/D変換完了までSLEEP状態で待つ事もできます。



A/D変換の設定

A/D変換の以下の設定について説明します。

(1)入力ポートの選択
(2)基準電圧
(3)A/D変換のクロック選択(TAD
(4)A/D変換のアクィジション時間設定
(5)A/D変換結果の格納

(1)入力ポートの選択

A/D変換で使えるポートは、以下の10ポートがあります。
AN0〜AN4
AN8〜AN12
【参考】
AN5〜AN7が欠番になっていますが、40ピンのPIC18F4320などではサポートされています。


どのポートをアナログモードにするかはADCON1レジスタのPCFG3−0ビットで以下のように指定します。

ADCON1レジスタ
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--VCFG1VCFG0PCFG3PCFG2PCFG1PCFG0
VCFG1,0ビットは基準電圧設定ビットであり後述します。

PCFG3-0ビット

PCFG3-0AN12AN11AN10AN9AN8AN4AN3AN2AN1AN0
0000AAAAAAAAAA
0001AAAAAAAAAA
0010AAAAAAAAAA
0011DAAAAAAAAA
0100DDAAAAAAAA
0101DDDAAAAAAA
0110DDDDAAAAAA
0111DDDDDAAAAA
1000DDDDDAAAAA
1001DDDDDAAAAA
1010DDDDDAAAAA
1011DDDDDDAAAA
1100DDDDDDDAAA
1101DDDDDDDDAA
1110DDDDDDDDDA
1111DDDDDDDDDD
A:アナログポート,D:デジタルポート

今回は、AN0のみをアナログポートとして使いますので、b'1110'をセットします。
A/D変換を使わない場合(全てのピンをデジタルポートとして使う場合)は、b'1111'をセットします。
パワーオンリセット時は、b'1111'になっています。


また、1回のA/D変換動作では、1つのポートだけを選択する必要がありますが、このポート選択は、ADCON0レジスタのCHS3−0ビットで設定します。

ADCON0レジスタ
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--CHS3CHS2CHS1CHS0GO/DONEADON
Bit0,1については後述します。

CHS3-0ビット

CHS3-0ANポート
0000AN0
0001AN1
0010AN2
0011AN3
0100AN4
1000AN8
1001AN9
1010AN10
1011AN11
1100AN12

今回は、RA0のみをアナログポートとして使用しますので、CHS3-0にはb'0000'をセットします。

(2)基準電圧

基準電圧は、以下のいずれかを組み合わせて選択します。
−側の基準電圧:電源電圧VssまたはAN2/Vref−
+側の基準電圧:電源電圧VddまたはAN3/Vref+

これらは、ADCON1レジスタのVCFG1−0ビットで設定します。

ADCON1レジスタ
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
--VCFG1VCFG0PCFG3PCFG2PCFG1PCFG0
PCFG3-0ビットは前記の入力ポートの選択を参照して下さい。

VCFG1-0ビット

VCFG1-0Vref-Vref+
00VssVdd
01VssAN3/Vref+
10AN2/Vref-Vdd
11AN2/Vref-AN3/Vref+

今回は、精度は要求されませんので、電源電圧(Vdd,Vss)を基準電圧にしました。

【参考】
温度計や照度計などのように精度が要求される場合は基準電圧ICなどを使います。


(3)A/D変換のクロック(TAD)選択

A/D変換のクロック(TAD)はA/D変換機能の基準時間で、PICを動作させるオシレータの周波数により設定値が決まります。
設定は、ADCON2レジスタのADCS2−0ビットで以下のように設定します。

ADCON2レジスタ
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
ADFM-ACQT2ACQT1ACQT0ADCS2ADCS1ADCS0
Bit7-3については後述します。

ADCS2-0ビット

オシレータ周波数A/Dクロック設定
時間ADCS2-0
〜1.25MHz2Tosc000
〜2.50MHz4Tosc100
〜5.00MHz8Tosc001
〜10.00MHz16Tosc101
〜20.00MHz32Tosc010
〜40.00MHz64Tosc110
1.00MHz(RC)A/D RCx11
<TADの時間計算例>
オシレータの周波数が8MHzの場合、上の表で5〜10MHzの範囲ですので16Toscを指定します。
8MHzの1サイクルの時間(Tosc)は、
 1/8MHz = 0.125u秒 です。

ADはこれの16倍(16Tosc)ですので、
 0.125u秒 × 16 = 2u秒 になります。

【Tosc】
Toscはオシレータの1クロック(1サイクル)の時間であり、8Toscはオシレータ1クロックの時間の8倍という意味です。


(4)A/D変換のアクィジション時間設定

A/D変換のために内部にホールドコンデンサがあり、このコンデンサに充電してからA/D変換が行われます。
ホールドコンデンサに充電する時間をアクィジション時間と言い、A/D変換対象の抵抗が2.5KΩの場合、約13u秒です。

この時間を、ADCON2レジスタのACQT2−0ビットで指定します。

ADCON2レジスタ
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
ADFM-ACQT2ACQT1ACQT0ADCS2ADCS1ADCS0
Bit7については後述します。Bit2-0は前を参照して下さい。

ACQT2-0ビット

ACQT2-0アクィジション時間
0000 TAD
0012 TAD
0104 TAD
0116 TAD
1008 TAD
10112 TAD
11016 TAD
11120 TAD
<算出例>
以下のケースでACQT2-0の設定値を求めて見ます。
オシレータ周波数8MHz
アクィジション時間13u秒

まず、TADはオシレータが8MHzの場合、16Toscで2u秒でした。(前の例参照)
アクィジション時間は13u秒ですので、
 13u秒/2u秒 = 7 (切り上げ)
となり、
上の表から8TADがもっとも近い値であり、ACQT2-0はb'100'を選択します。
【ANの入力抵抗とアクィジション時間】
アナログの入力抵抗の最大値は2.5KΩが推奨値です。
そして、2.5KΩであればアクィジション時間は、約13u秒です。
今回の回路では、5KΩの可変抵抗にしていますので、アクィジション時間を長くする必要がありますが、精度は気にしませんので8TADの設定にしました。


(5)A/D変換結果の格納

A/D変換結果は10ビットです。一方、PICのレジスタは8ビットです。
そのままでは格納できませんので、ADRESHレジスタとADRESLレジスタの2つを連結した16ビットに格納されます。

ADRESHADRESL
Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
A/D変換結果(10ビット)000000
000000A/D変換結果(10ビット)

上の図の水色部分にA/D変換結果が格納されます。
2列で表しているように、格納方法は2パターンあります。どちらにするかは、ADCON2レジスタのADFMビットで指定します。
 ADFM=0:左詰め(2列の上のパターン)
 ADFM=1:右詰め(2列の下のパターン)

今回は右詰めとしました。


プログラムの仕様

RA0(AN0)の可変抵抗の電圧をA/D変換し、その結果を3桁の16進数でLCDに表示します。
A/D変換の分解能は10ビットですので、可変抵抗の状態により16進数で000〜3FFが表示されるはずです。


プログラム

今回のプログラムはこちらです。

LCDの使い方については、液晶ディスプレイを使う(PIC16F84A)を参考にして下さい。プログラムもほぼ同じです。

A/D変換に関する処理は、初期処理とメイン処理で全て行っています。


動作させた状態。