---
			---
		 
		16F1455には、10ビットのADコンバータ(ADC)が組み込まれています。 5チャンネルの外部入力および、IC内部で発生させる基準電圧(FVR)とDAコンバータ出力の計8チャンネルを切り替えてAD変換することができます。
 
					| AD変換チャンネル | AN3 | AN4 | AN5 | AN6 | AN7 | 
|---|---|---|---|---|---|
| I/O Port | RA4 | RC0 | RC1 | RC2 | RC3 | 
| Pin 番号 | 3 | 16 | 15 | 14 | 7 | 
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 | - | - | - | - | 
| TRISC | TRISC7 | TRISC6 | TRISC5 | TRISC4 | TRISC3 | TRISC2 | TRISC1 | TRISC0 | 
| ANSELA | - | - | - | ANSA4 | - | - | - | - | 
| ANSELC | ANSC7 | ANSC6 | - | - | ANSC3 | ANSC2 | ANSC1 | ANSC0 | 
| 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 | 
| ADCON0 | - | CHS<4:0> | GO/DONE | ADON | ||||
| ADCON1 | ADFM | AADCS<2:0> | - | - | ADPREF<1:0> | |||
| ADCON2 | - | TRIGSEL<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 | 
|---|---|---|---|---|---|
| INTCON | 7 | GIE | 全インタラプトの使用許可 | 許可 | 否 | 
| 6 | PEIE | 周辺機能インタラプトの使用許可 | 許可 | 否 | |
| PIE1 | 6 | ADIE | AD変換のインタラプト許可 | 許可 | 否 | 
| PIR1 | 6 | ADIF | AD変換完了フラグ | 完了 | 未完 | 
| ADCON0 | 6 | CHS4 | アナログ入力チャネルの指定: (リセット直後は、00000) 00011=AN3, 00111=AN7, 00100=AN4, 11101=TMP 00101=AN5, 11110=DAC 00110=AN6, 11111=FVR | 1 | 0 | 
| 5 | CHS3 | 1 | 0 | ||
| 4 | CHS2 | 1 | 0 | ||
| 3 | CHS1 | 1 | 0 | ||
| 2 | CHS0 | 1 | 0 | ||
| 1 | GO/DONE | 変換開始/終了 | 開始 | 終了 | |
| 0 | ADON | ADモジュール On/Off | ON | OFF0 | |
| ADCON1 | 7 | ADFM | 変換結果の出力フォーマット | 右詰 | 左詰 | 
| 6 | ADCS2 | AD変換クロック指定: リセット直後は、<000> 000 =Fosc/2, 010 =Fosc/32, 101 =Fosc/16, 011 =FRC 001 =Fosc/8, 100 =Fosc/4, 110 =Fosc/64, 111 =FRC | 1 | 0 | |
| 5 | ADCS1 | 1 | 0 | ||
| 4 | ADCS0 | 1 | 0 | ||
| 1 | ADPREF1 | 基準電圧指定: リセット直後は、<00> 00=Vdd, 10=外部Pin, 11=内部基準電圧(FVR) | 1 | 0 | |
| 0 | ADPREF0 | 1 | 0 | ||
| ADCON2 | 6 | TRIGSEL2 | トリガモード: リセット直後は、<000> 000 = 手動, 011 = TMR0, 100 = TMR1, 101 = TMR2, 110 = C1OUT, 111 = C2OUT | 1 | 0 | 
| 5 | TRIGSEL1 | 1 | 0 | ||
| 4 | TRIGSEL1 | 1 | 0 | ||
| 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 | |||||
|---|---|---|---|---|---|---|
| ソース | 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 | 
PortA - RA4 (AN3) に続されたボリュームで分圧された電圧を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  AN3(RA4) pin3
//    Language: MPLABX XC8
//    Target:   PIC16F1455
// -------------------------------------------------------------------------
#include <xc.h>
#define _XTAL_FREQ 4000000      // delay_ms(x) のための定義
#define LED        LATC
#pragma config FOSC  = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP  = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO  = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF
void main(void){
    unsigned char ADResult;
    OSCCON = 0b00110110;        // 内部クロック4Mhz
    TRISC  = 0b11110000;        // 入出力設定
    ANSA4 = 1;                  // AN3はアナログ入力に設定
    ADCON2 = 0b00000000;        // AD変換はプログラムの命令で開始
    ADCON1 = 0b01000000;        // 左詰め出力, AD変換クロックFosc/4
                                // 正基準電圧 VDD
    ADCON0 = 0b00001101;        // アナログ入力 AN3(RA4),ADC ON
    while(1){
        __delay_ms(100);        // LEDちらつき防止の遅延
        GO = 1;                 // AD変換開始
        while(GO);              // AD変換終了待ち
        ADResult = ADRESH;      // AD変換結果取得
        LATC = ADResult >> 4;   // 上位4ビットをLEDに表示
    }
}