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 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)<-> ;111 = 8MHz ;110 = 4MHz movlw B'01110000' movwf OSCCON ;// ポートクリア // call Bank0 clrf PORTA clrf PORTB clrf PORTC ;// A/Dコントロール設定 // call Bank1 ;(ADCON1) ; ; ; 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 |