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: 対応するポートがアナログかデジタルかを指定します。
ANS<6:0>はPIC16F88のI/OポートAN0〜AN6に対応し、1でアナログ、0でデジタルとなります。但し、TRISレジスタで同じポートを入力にセットしておかないと、アナログ入力として使用できません。
-- ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0
ADCON0: AD変換制御レジスター0
ADCON1: AD変換制御レジスター1
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE -- ADON
ADCS<2:0>は2つのレジスタにまたがっているので少しややこしいですが、ADCS2が後から追加されたためにこのような配置になっているようです。このADCSの3ビットはAD変換クロックを決定します。詳細は下の『AD変換クロックの選択方法』を参照して下さい。
ADFM ADCS2 VCFG1 VCFG0 -- -- -- --
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ビット幅の中に左詰めまたは右詰めで格納されます。
もし、必要なデータが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となります。
データシートには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Ω以下と記されています。)
アクイジションタイムについての詳細は各PICのデータシートの"A/D Acquisition Requirements"を参照して下さい。
A/D変換(計測)
GO/DONEビットに1をセットするとCHOLDに蓄えられた電荷を元に電圧の値を測定し始めます。AD変換に要する時間は12TAD+αです。TADに最短の1.6µsを選んだ時のAD変換の計測に要する時間は12*TAD+α=19,2µ+α(約20µs)となります。
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