PIC18F14K50の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
AD変換

18F14K50には、10ビットのADコンバータ(ADC)が組み込まれています。 9チャンネルの外部入力および、IC内部で発生させる基準電圧(FVR)とDAコンバータ出力の計11チャンネルを切り替えてAD変換することができます。

AD変換チャンネル AN3 AN4 AN5 AN6 AN7
I/O Port RA4 RC0 RC1 RC2 RC3
Pin 番号 3 16 15 14 7
AD変換チャンネル AN8 AN9 AN10 AN11
I/O Port RC6 RC7 RB4 RB5
Pin 番号 6 5 13 12
AD変換手順
  1. 使用するアナログ入力ピンの設定:
    • 該当するTRIS のビットを入力「1」に設定
    • 該当するANSEL のビットを「1」に設定
  2. ADC moduleの設定:
    • AD変換クロックを指定
    • 基準電圧を指定
    • ADC 入力チャネルを指定
    • 結果出力のフォーマットを指定
    • チャージ時間の指定
    • ADC moduleをON
  3. 必要とするチャージ時間を待つ
  4. GO/DONE bitをセットして変換を開始
  5. 変換の終了を以下の方法で待つ:
    • GO/DONE bitを常時監視
    • ADC からの割込を待つ(割込使用時)
    • AD変換の結果を取得
    • ADC 割込 flagをクリア (割込使用時)
  6. AD変換の結果を取得

充電時間(Acquisition time)

AD変換は、CHS信号により入力電圧を選び、その電圧をモジュール内のコンデンサに充電したのちに開始されます。この充電時間(Acquisition time)を十分にとらないと正確な変換ができません。必要時間は、Vddと入力信号のインピーダンス(Rs)で決まります。
Vdd = 5v、Rs = 10KΩの場合、Acquisition time > 7.37uS の時間が必要です。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
TRISA - - TRISA5 TRISA4 - - - -
TRISB TRISB7 TRISB6 TRISB5 TRISB4
TRISC TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC0
ANSEL ANS7 ANS6 ANS5 ANS4 ANS3
ANSELH ANS11 ANS10 ANS9 ANS8
RCON IPEN SBOREN RI TO PD POR BOR
INTCON GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
PIE1 TMR1GIE ADIE RCIE TXIE SSP1IE SSP1IE TMR2IE TMR1IE
PIR1 TMR1GIF ADIF RCIF TXIF SSP1IF SSP1IF TMR2IF TMR1IF
IPR1 ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP
ADCON0 - - CHS <3:0> GO/DONE ADON
ADCON1 - - - - PVCFG <1:0> NVCFG <1:0>
ADCON2 ADFM - ACQT <2:0> ADCS <2:0>
FVRCON FVREN FVRRDY TSEN TSRNG CDAFVR <1:0> ADFVR <1:0>
ADRESH A/D Result Register High
ADRESL A/D Result Register Low
レジスタ BIT 内容 1 0
RCON 7 IPEN 2レベルのインタラプト優先度 使用
INTCON 7 GIEH 高優先度インタラプトを使用許可 許可
6 GIEL 低優先度インタラプトを使用許可 許可
PIR1 6 ADIF ADC割り込みフラグ 発生  
PIE1 6 ADIE インタラプトを使用許可 許可
IPR1 8 ADIP インタラプト優先度
ADCON0 5 CHS3 アナログ入力チャネルの指定:
0011=AN3/RA40110=AN6/RC21001=AN9/RC71110=DAC
0100=AN4/RC00111=AN7/RC31010=AN10/RB41111=FVR
0101=AN5/RC11000=AN8/RC61011=AN11/RB5
4 CHS2
3 CHS1
2 CHS0
1 GO/DONE 変換開始/終了 開始 終了
0 ADON ADModule ON On Off
ADCON1 3 PVCFG1 正基準電圧指定: リセット直後は、<00>
 00=Vdd, 01=外部Pin(RC0・Vref+),  10=内部基準電圧(FVR)
2 PVCFG0
1 NVCFG1 負基準電圧指定: リセット直後は、<00>
 00=Vss, 01=外部Pin(RC1/Vref -)
0 NVCFG0
ADCON1 3 PVCFG1 正基準電圧指定: リセット直後は、<00>
 00=Vdd, 01=外部Pin(RC0・Vref+),  10=内部基準電圧(FVR)
2 PVCFG0
1 NVCFG1 負基準電圧指定: リセット直後は、<00>
00=Vss, 01=外部Pin(RC1/Vref -)
0 NVCFG0
ADCON2 7 ADFM 結果出力のフォーマット 右詰 左詰
5 ACQT2 チャージ時間指定: リセット直後は、<000>
000 = 0001 = 2 TAD010 = 4 TAD011 = 6 TAD
100 = 8 TAD101 = 12 TAD110 = 16 TAD111 = 20 TAD
4 ACQT1
3 ACQT0
2 ADCS2 AD変換クロック指定: リセット直後は、<000>
000 = Fosc/2001 = Fosc/8010 = Fosc/32100 =Fosc/4
101 =Fosc/16110 =Fosc/64011 = FRC111 = FRC
1 ADCS1
0 ADCS0
FVRCON 7 FVREN FVR制御 動作 無効
6 FVRRDY (Read Only) FVR状況 常時「1」 使用可 不可
1 ADFVR1 ADC用バッファ出力倍率
 11 : x4(4.096V), 10 : x2(2.048v), 01 : x1(1.024v), 00 : OFF(初期値)
0 ADFVR0
FoscとAD変換クロック(TAD)の関連
変換クロック Fosc
ソース ADCS 1M 4M 16M 32M 48M
Fosc/2 000 2.0 uS 500 nS 125 nS 63 nS 41.7 nS
Fosc/4 100 4.0 uS 1.0 uS 250 nS 125 nS 83.3 nS
Fosc/8 001 8.0 uS 2.0 uS 500 nS 250 nS 167 nS
Fosc/16 101 16.0 uS 4.0 uS 1.0 uS 0.5 uS 333 nS
Fosc/32 010 32.0 uS 8.0 uS 2.0 uS 1.0 uS 667 nS
Fosc/64 110 64.0 uS 16.0 uS 4.0 uS 2.0 uS 1.33 uS
FRC x11 1.0-6.0 uS 1.0-6.0 uS 1.0-6.0 uS 1.0-6.0 uS 1.0-6.0 uS
  • FRCの中心値は、1.6uS
  • Foscが1MHzより遅い場合や、
    Sleep中は、FRCを使用する。
  • 枠内が赤いTADは、動作保障外

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

PortB - RB5に続されたボリュームで分圧された電圧をAD変換し、その値をLEDに表示するプログラムです。 変換された10ビットの上位4ビットを表示しています。

<回路図>

<プログラム>

//  File name: ADC
//  Description: A/D example
//  A/D結果の上位4ビットを4つのLEDで表示する。
//  Notes: 4MHz内部クロック
//        LED RC0
//        LED RC1
//        LED RC2
//        LED RC3
//        VR  AN11(RB5)
//    Language: MPLABX XC8
//    Target: PIC18F14K50

#include <xc.h>
#define _XTAL_FREQ 4000000      // delay_ms(x) のための定義

#pragma config FOSC = IRC        //  内部クロック
#pragma config USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config IESO  = OFF, FCMEN = OFF, PLLEN  = ON
#pragma config BORV  = 30,  BOREN = OFF, PWRTEN = OFF
#pragma config WDTPS = 32768, WDTEN = OFF
#pragma config MCLRE = OFF, HFOFST = OFF, XINST  = OFF
#pragma config BBSIZ = OFF, LVP    = OFF, STVREN = ON
#pragma config CP1  = OFF, CP0  = OFF, CPD  = OFF, CPB  = OFF
#pragma config WRT1 = OFF, WRT0 = OFF, WRTB = OFF, WRTC = OFF
#pragma config EBTR1 = OFF, EBTR0 = OFF, EBTRB  = OFF


void main(void){
    unsigned char ADResult;

    OSCCON = 0b01010010;        // 内部クロック4Mhz
    TRISC = 0xF0;               // 入出力設定
    ADCON2 = 0b00101100;        // 左詰め出力,AD変換クロックFosc/4
                                // チャージ時間 12_TAD
    ADCON1 = 0b00000000;        // 正基準電圧 VDD, 負基準電圧 VSS
    ADCON0 = 0b00101101;        // アナログ入力 AN11(RB5),ADC ON

    ANSELHbits.ANS11 = 1;       // AN11はアナログ入力に設定
    while(1){
        ADCON0bits.GO = 1;      // AD変換開始
        while(ADCON0bits.GO);   // AD変換終了待ち
        ADResult = ADRESH;      // AD変換結果取得
        LATC = ADResult >> 4;   // 上位4ビットをLEDに表示
        __delay_ms(100);        // LEDちらつき防止の遅延
    }
}