PIC AD変換の方法

PICでのA/D変換の概要

 AD変換の機能を使うとアナログのデータ量をデジタルの値に変換して取り込むことができます。アナログのデータ源は世の中に無数にありますが、これらを予めPICでのAD変換に適した直流電圧(DC5V以下)に整えてPICのアナログポートへ入力します。
 AD変換機能付きのミッドレンジPICは、古いモデルでは8bit(256分解能)でしたが、最近のPICでは10bit(1024分解能)のAD変換能力があります。このページではPIC16F88を例にAD変換の方法について解説したいと思います。
 AD変換は、PIC内部の小さなコンデンサ(CHOLD)に充電をし、その電荷を測定するという手順をとりますので、いくらかの時間が必要です。10bitのA/D変換のPICでは、充電+測定で約40µs要します。

A/D変換に関係するSFR

ANSEL: 対応するポートがアナログかデジタルかを指定します。
-- ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0
 ANS<6:0>はPIC16F88のI/OポートAN0〜AN6に対応し、1でアナログ、0でデジタルとなります。但し、TRISレジスタで同じポートを入力にセットしておかないと、アナログ入力として使用できません。

ADCON0: AD変換制御レジスター0
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE -- ADON
ADCON1: AD変換制御レジスター1
ADFM ADCS2 VCFG1 VCFG0 -- -- -- --
 ADCS<2:0>は2つのレジスタにまたがっているので少しややこしいですが、ADCS2が後から追加されたためにこのような配置になっているようです。このADCSの3ビットはAD変換クロックを決定します。詳細は下の『AD変換クロックの選択方法』を参照して下さい。
 CHS<2:0>はこれからAD変換しようとするチャンネルがどれかを選択します。CHSビットの組み合せと選択されるポートは次のようになります。 000=AN0, 001=AN1, 010=AN2, 011=AN3, 100=AN4, 101=AN5, 110=AN6
 GO/DONEは1をセットするとAD変換(計測)を開始します。AD変換が完了するとこのビットは自動的に0になるので、このビットを監視することでAD変換終了を知ることができます。
 ADONは1をセットするとサンプリング(充電)を開始します。0をセットすると充電を止め放電します。
 ADFMは変換されたデータ(10ビット)がADRESH, ADRESLの16ビットに左詰めで格納するか、右詰めで格納するかを指定します。
 VCFG<1:0>はAD変換のリファレンス電圧を設定します。
リファレンス電圧 通常はAVDDが5V、AVSSが0V。VREF+, VREF-は任意の電圧です。

ADRESH, ADRESL
 デジタルに変換された10ビットの値は下の様に横に並べられたADRESHとADRESLの16ビット幅の中に左詰めまたは右詰めで格納されます。
AD result  もし、必要なデータが8ビット精度で充分な場合には、左詰めにしてADRESHだけを読めば細工無しで8ビットのデータを取得できます。

A/D変換クロックの選択方法

 AD変換の為のクロックがTADと呼ばれ、出来るだけ小さな値の方が速くAD変換を完了させる事が可能です。TADは1.6µs ≤ TAD ≤ 6.4µs であることがデータシートで指示されていますので、この範囲でできるだけ小さな値を取るようにADCSの3ビットを使ってToscを選択します。TADはPICの動作クロックに影響を受け、次のような関係があります。
 TAD=(PICクロックの周期)×(Tosc)
例えば10MHzのクロックでPICが動作している時には、クロック周期が0.1µsです。16Toscを選択すると、TADは丁度1.6µsになります。8MHzの時には周期が0.125µsで16Toscを選択し、TADは2µsとなります。
TADの選択方法
 データシートにはRCの時のTADは代表値として4µsですが、2から6µsの範囲で変動すると記されています。A/D変換が終了するタイミングが若干ばらつくことが予想されます。

A/Dアクイジション

 ADONビットに1をセットするとアナログポートとCHOLDが繋がり、充電が開始されます。10ビットA/D変換のアクイジションタイム(CHOLDへの充電に必要な時間)TACQは19.72µsです。PIC16F88のデータシートによるとソース用抵抗Rsは10kΩ以下にする旨が記されています。(PIC16F819のデータシートでは2.5kΩ以下と記されています。)
AD Input Model
 アクイジションタイムについての詳細は各PICのデータシートの"A/D Acquisition Requirements"を参照して下さい。

A/D変換(計測)

 GO/DONEビットに1をセットするとCHOLDに蓄えられた電荷を元に電圧の値を測定し始めます。AD変換に要する時間は12TAD+αです。TADに最短の1.6µsを選んだ時のAD変換の計測に要する時間は12*TAD+α=19,2µ+α(約20µs)となります。
AD変換のTADサイクル

A/D変換の実際の手順

1.A/D変換モジュールの設定
 ・アナログかデジタルかポートを設定 (ANS<6:0>)
 ・リファレンス電圧を設定 (VCFG<1:0>)
 ・A/D入力チャンネルを選択 (CHS<2:0>)
 ・A/D変換クロックを選択 (ADCS<2:0>)
 ・A/D変換モジュールを有効にする(充電開始) (ADON)
2.(完了に割り込みを使う場合には)割り込みの設定
 ・ADIFビットをクリア
 ・ADIEビットをセット
 ・PEIEビットをセット
 ・GIE ビットをセット
3.アクイジョンタイム(充電時間)を待つ
4.計測を開始
 ・GO/DONEビットをセット
5.計測終了を待つ(次のどちらかの方法で)
 ・GO/DONEビットがクリアされるのを監視
 ・A/D割り込みを待つ
6.A/Dリザルトレジスタのペアの値を読む
7.次の変換の為、1または2へ進む
 ・次のアクイジョンを繰り返す為に2TAD以上の時間を待たなければならない。

A/D変換のプログラム例

INIT	;初期化部分
	BSF	STATUS, RP0	;バンク0へ
	CLRF	OPTION_REG
	MOVLW	B'00000011'
	MOVWF	TRISA		;ポート0と1を入力に
	MOVLW	B'00000001'
	MOVWF	ANSEL		;ポート0をアナログに
	MOVLW	B'01000000'
	MOVWF	ADCON1		;ADCS2にビットセット
	MOVLW	B'00011111'
	MOVWF	TRISB	
	BCF	STATUS, RP0	;バンク0へ
	MOVLW	B'01000000'
	MOVWF	ADCON0		;ADCS0にビットセット

------------------------------------------------------------------

ADC0
	MOVLW	B'01000001'
	MOVWF	ADCON0		;AN0を準備(充電開始)
	
	MOVLW	D'16'
	MOVWF	temp
AQU_TIM				;アクイジション用20µsタイマ@10MHz
	DECFSZ	temp, F
	GOTO	AQU_TIM
	
	BSF	ADCON0, GO	;AD変換開始
AD_WAIT				;AD変換完了待ち
	BTFSC	ADCON0, GO
	GOTO	AD_WAIT
	
	;ここでA/D変換は完了し、ADRESHとADRESLにデータが格納されている
	;もし7bitのデータが欲しい時(オマケ)
	BCF	STATUS, C
	RRF	ADRESH, W	;W-レジスタに7bitのデータが入る

------------------------------------------------------------------



PICマイコンと電子工作 HOME



inserted by FC2 system