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ちらつき防止の遅延
    }
}