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

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

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

AD変換チャンネル AN4 AN3 AN2 AN1 AN0
I/O Port RA5 RA3 RA2 RA1 RA0
Pin 番号 7 5 4 3 2
AD変換チャンネル AN12 AN11 AN10 AN9 AN8
I/O Port RB0 RC2 RB1 RB3 RB2
Pin 番号 21 13 22 24 23
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 TRISA7 TRISA6 TRISA5   TRISA3 TRISA2 TRISA1 TRISA0
TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
TRISC TRISC7 TRISC6       TRISC2 TRISC1 TRISC0
ANCON0 PCFG4 PCFG3 PCFG2 PCFG1 PCFG0
ANCON1 VBGEN PCFG12 PCFG11 PCFG10 PCFG9 PCFG8
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 VCFG1 VCFG0 CHS <3:0> GO/DONE ADON
ADCON1 ADFM ADCAL ACQT <2:0> ADCS <2: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 7 VCFG1 負基準電圧指定 外部 Vss
6 VCFG0 正基準電圧指定 外部 Vdd
5 CHS3 アナログ入力チャネルの指定:
0000=AN0/RA00011=AN3/RA31001=AN9/RB31100=AN12/RB0
0001=AN1/RA10100=AN4/RA51010=AN10/RB11110=Vddcore
0010=AN2/RA21000=AN8/RB21011=AN11/RC21111=Vbg
4 CHS2
3 CHS1
2 CHS0
1 GO/DONE 変換開始/終了 開始 終了
0 ADON ADModule ON On Off
ADCON1 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
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に続されたボリュームで分圧された電圧をGO/DONE bitを常時監視する手法でAD変換し、LEDに結果の上位4ビットを表示します。

<回路図>

<プログラム>

//  File name: LED
//  Description: A/D example
//  A/D結果の上位4ビットを4つのLEDで表示する。
//  Notes: 4MHz内部クロック
//        LED RB0
//        LED RB1
//        LED RB2
//        LED RB3
//        VR  AN0(RA0)
//    Language: MPLAB xc8
//    Target: PIC18F26J50

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

//
     #pragma config WDTEN = OFF, PLLDIV = 2, STVREN = ON, XINST = OFF
     #pragma config CPUDIV = OSC1, CP0 = OFF
     #pragma config OSC = INTOSC, T1DIG = OFF
     #pragma config LPT1OSC = OFF, FCMEN = OFF, IESO = OFF
     #pragma config WDTPS = 32768
     #pragma config DSWDTOSC = INTOSCREF, RTCOSC = T1OSCREF
     #pragma config DSBOREN = OFF, DSWDTEN = OFF, DSWDTPS = 8192
     #pragma config IOL1WAY = OFF, MSSP7B_EN = MSK7
     #pragma config WPFP = PAGE_1, WPEND = PAGE_0, WPCFG = OFF
     #pragma config WPDIS = OFF

void main(void){
    unsigned char ADResult;
    OSCCON = 0b01100010;        // 内部クロック4Mhz
    LATB = 0;                   // PortBのすべてのビットを「0」
    TRISB = 0b11110000;         // LEDの接続ポートを出力に設定
    ADCON1 = 0b00101100;        // 左詰 クロックFosc/4 12_TAD
    ADCON0 = 0b00000001;        // Vdd-Vss AN0(RA0) ADC_ON
    ANCON0 = 0b00011110;        // CH0をアナログ入力にする
    ANCON1 = 0b00011111;
    while(1){
        ADCON0bits.GO = 1;      // AD変換開始
        while(ADCON0bits.GO);   // AD変換終了待ち
        ADResult = ADRESH;      // AD変換結果取得
        LATB = ADResult >> 4;   // 上位4ビットをLEDに表示
        __delay_ms(100);        // LEDちらつき防止の遅延
    }
}