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変換手順
- 使用するアナログ入力ピンの設定:
- 該当するTRIS のビットを入力「1」に設定
- 該当するANSEL のビットを「1」に設定
- ADC moduleの設定:
- AD変換クロックを指定
- 基準電圧を指定
- ADC 入力チャネルを指定
- 結果出力のフォーマットを指定
- チャージ時間の指定
- ADC moduleをON
- 必要とするチャージ時間を待つ
- GO/DONE bitをセットして変換を開始
- 変換の終了を以下の方法で待つ:
- GO/DONE bitを常時監視
- ADC からの割込を待つ(割込使用時)
- AD変換の結果を取得
- ADC 割込 flagをクリア (割込使用時)
- 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/RA0 | 0011=AN3/RA3 | 1001=AN9/RB3 | 1100=AN12/RB0 |
0001=AN1/RA1 | 0100=AN4/RA5 | 1010=AN10/RB1 | 1110=Vddcore |
0010=AN2/RA2 | 1000=AN8/RB2 | 1011=AN11/RC2 | 1111=Vbg | |
4 |
CHS2 |
3 |
CHS1 |
2 |
CHS0 |
1 |
GO/DONE |
変換開始/終了 |
開始 |
終了 |
0 |
ADON |
ADModule ON |
On |
Off |
ADCON1 |
7 |
ADFM |
結果出力のフォーマット |
右詰 |
左詰 |
5 |
ACQT2 |
チャージ時間指定: リセット直後は、<000>
000 = 0 | 001 = 2 TAD | 010 = 4 TAD | 011 = 6 TAD |
100 = 8 TAD | 101 = 12 TAD | 110 = 16 TAD | 111 = 20 TAD |
|
4 |
ACQT1 |
3 |
ACQT0 |
2 |
ADCS2 |
AD変換クロック指定: リセット直後は、<000>
000 = Fosc/2 | 001 = Fosc/8 | 010 = Fosc/32 | 100 =Fosc/4 |
101 =Fosc/16 | 110 =Fosc/64 | 011 = FRC | 111 = 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ちらつき防止の遅延
}
}