LED回路 工作部屋 > PIC16F886 A/D変換の使い方 【最終更新日:2011/2/1】
PIC16F886 A/D変換の使い方
A/D変換の設定手順

@ A/D変換に使用するポートを入力にする (TRIS設定)

A A/D変換に使用するポートをアナログにする (ANSEL設定)

B ADCON0の設定
   ADCSの選択(クロック)、CHSの選択(使用チャンネル)、ADONを"1"にしてA/D変換を使用可能にする

C ADCON1の設定
   ADFMの選択(結果を、0=左詰め 1=右詰め)、VCFGの選択(基準電圧)

D 選択されたチャンネルでアクィジションする (20μSほど?Wait)

E ADCON0のGO/DONEを"1"すると変換開始。終了すると自動で"0"に戻る
   btfsc ADCON0,GO で検査

F 結果がADRESH、ADRESLに出力される

G 再度A/D変換する際はDへ戻る

PIC16F886 のピン配置図
主に使用するレジスタ
Bank0
ADRESH A/D Result Register High Byte
ADCON0 ADCS1 ADCS0 CHS3 CHS2 CHS1 CHS0 GO/DONE ADON
Bank1
ADRESL A/D Result Register Low Byte
ADCON1 ADFM - VCFG1 VCFG0 - - - -
Bank3
ANSEL ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0
ANSELH - - ANS13 ANS12 ANS11 ANS10 ANS9 ANS8
レジスタの説明
ADCS A/D変換クロック選択ビット
ADCS<1:0>
00 = Fosc/2
01 = Fosc/8
10 = Fosc/32
11 = FRC
※【図1】参照。1.6μS〜6.4μsの範囲でで選択
CHS アナログチャンネル選択ビット
CHS<3:0>
0000 = CN0
0001 = CN1
0010 = CN2
0011 = CN3
0100 = CN4
0101 = CN5
0110 = CN6
0111 = CN7
1000 = CN8
1001 = CN9
1010 = CN10
1011 = CN11
1100 = CN12
1101 = CN13
1110 = CVREF
1111 = Fixed REF
GO/DONE A/D変換開始ビット
"1"(set)でA/D変換開始。変換終了後、自動で"0"(リセット)になる
ADON A/D使用開始ビット
1 = A/D変換を使用する
0 = A/D変換を使用しない
※A/D変換の設定をしても、ここが"1"じゃないとA/D変換は使用できないので注意!!
ADFM A/D変換結果(10bit)の格納選択
0 = 左詰め (ADRESHに8bit、ADRESLに2bit格納)
1 = 右詰め (ADRESHに2bit、ADRESLに8bit格納)
VCFG1 基準電圧選択(下限)
0 = Vss
1 = VREF- Pin
VCFG0 基準電圧選択(上限)
0 = Vdd
1 = VREF+ Pin
ANSEL
ANSELH
ポートのアナログ・デジタル選択
0 = アナログ
1 = デジタル
【図1】クロック選択表 (白の部分が周波数ごとの選択できるクロック)
【写真1】A/D変換実験写真
プログラム記述例

;テスト概要:半固定抵抗の分圧値をA/D変換して7セグLEDに表示する。半固定抵抗をグルグル回すと分圧値が変化し7セグの表示が0〜Fの16段階で変化する
;使用パーツ:1桁7セグメントLED(1個)、10kΩ半固定抵抗(1個)、PIC16F886(1個)
;ポート設定:半固定抵抗からの入力はRA1。7セグ出力はRC0〜RC7。基準電圧はVdd、Vss
;クロックは内臓クロックを8MHzで使用
;
;
list p=16f886
#include
ERRORLEVEL -302,-205,-305

__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V



CBLOCK 020h
Time1
Time2
Time3
Time4
Data
ENDC

org 0
goto Setup

Setup
;// アナログ・デジタル設定 //
call Bank3
movlw b'00000010'
;(ANSEL)
movwf ANSEL
;(ANSELH)<-><->
clrf ANSELH

;// I/Oポート設定 //
call Bank1
movlw B'00000010'
movwf TRISA ; 0=出力 1=入力
movlw B'00000000'
movwf TRISB movlw B'00000000'
movwf TRISC

;// 内臓クロック設定 //
;(OSCCON)<-> ;(IRCF2-0)
;111 = 8MHz
;110 = 4MHz
movlw B'01110000'
movwf OSCCON

;// ポートクリア //
call Bank0
clrf PORTA
clrf PORTB
clrf PORTC

;// A/Dコントロール設定 //
call Bank1
;(ADCON1)<-><-><-><-><->
; 0=左詰 1=右詰
; 0=Vss 1=Vref- 基準電圧
; 0=Vdd 1=Vref+ 基準電圧
movlw b'00000000'
movwf ADCON1

call Bank0
;(ADCON0)
movlw b'10000101'
movwf ADCON0

;//// A/D変換開始 ////
Main
call Wait_01ms ;適当にアクィジションの待ちを入れる
;// A/D変換 実行 //
bsf ADCON0,GO ;GOをセット
Main_1
btfsc ADCON0,GO ;GOクリアを待つ
goto Main_1 ;

;A/D変換の結果、上位4bitをPORTCの7セグメントLEDへ出力します
movfw ADRESH ;上位8bitの値をWへ
movwf Data ;wの値をDataへ
movlw b'11110000' ;
andwf Data1,1 ;下位をクリア
swapf Data1,1 ;上位を下位を入れ替えて、7セグで出力
call seg7 ;テーブルから参照
movwf PORTC ;参照データをPORTCへ出力
call Wait_500ms ;500msecごとにA/D変換を行う際の待ち時間
goto Main

;// 7セグ表示用テーブル //
seg7
movfw Data
addwf PCL,f
retlw b'00010010' ;0
retlw b'10011111' ;1
retlw b'00110001' ;2
retlw b'00010101' ;3
retlw b'10011100' ;4
retlw b'01010100' ;5
retlw b'01010000' ;6
retlw b'00011111' ;7
retlw b'00010000' ;8
retlw b'00010100' ;9
retlw b'00011000' ;a
retlw b'11010000' ;b
retlw b'11110001' ;c
retlw b'10010001' ;d
retlw b'01110000' ;e
retlw b'01111000' ;f


;/// 時間 ///
Wait_500ms
movlw d'50'
movwf Time1
T_500ms
call Wait_10ms
decfsz Time1,1
goto T_500ms
return
;*****************
Wait_10ms
movlw d'98'
movwf Time2
T_10ms
call Wait_01ms
decfsz Time2,1
goto T_10ms
call Wait_101cycle
return
;*****************
Wait_01ms
movlw d'65'
movwf Time3
T_01ms
decfsz Time3,1
goto T_01ms
return
;*****************
Wait_101cycle
movlw d'32'
movwf Time4
T_101cycle
decfsz Time4,1
goto T_101cycle
return


;/// Bank変更 ///
Bank0
bcf STATUS,RP1
bcf STATUS,RP0
return
Bank1
bcf STATUS,RP1
bsf STATUS,RP0
return
Bank2
bsf STATUS,RP1
bcf STATUS,RP0
return
Bank3
bsf STATUS,RP1
bsf STATUS,RP0
return

end