
24EPxxxMC202のアナログピン構成図です。
AN0-AN5までがアナログ使用可能で、VREF-/VREF+がリファレンス電圧用ピンです。
又、AVDD/AVSSとアナログ専用電圧入力ピンが有ります。
VREF+ = AVDD = VDD = 3.3V(MAX3.6V)
| チャンネル0 | チャンネル1 | チャンネル2 | チャンネル3 | |
| CH-A | AN0-AN5 | AN0(AN3) | AN1(AN4) | AN2(AN5) |
| CH-B | AN0-AN5 | AN3(AN0) | AN4(AN1) | AN5(AN2) |
| 10ビット | 〇 | 〇 | 〇 | 〇 |
| 12ビット | 〇 | - | - | - |
| CHPS | チャンネル0 | チャンネル1 | チャンネル2 | チャンネル3 |
| 00 | 〇 | - | - | - |
| 01 | 〇 | 〇 | - | - |
| 11(10) | 〇 | 〇 | 〇 | 〇 |
| チャンネル0 | チャンネル1 | チャンネル2 | チャンネル3 | |
| CH-A | AN1(RA1) | AN0(RA0) | AN1 | AN2 |
| CH-B | AN2(RB0) | AN3(RB1) | AN4 | AN5 |
ANSELA = 0b0000000000000011 ;// AN0/1はアナログ、他はデジタルI/Oに割当
ANSELB = 0b0000000000000011 ;// AN2/3はアナログ、AN4/5アナログは使用しない
TRISA = 0b0000000000000011 ;// RA0/1は入力、RA2-4は出力に設定、1で入力 0で出力
TRISB = 0b0000000000000011 ;// RB0/1は入力、その他は出力に設定
AD1CHS0 = 0b0000001000000001 ; // CH0=A(AN1)B(AN2)
AD1CHS123 = 0b0000000100000000 ; // CH1=A(AN0)B(AN3)
AD1CON1bits.SIMSAM = 1 ; // 同時にサンプリングする
AD1CON2bits.CHPS = 1 ; // チャンネル0と1を使う
AD1CON2bits.ALTS = 1 ; // サンプルABチャンネルを使う
上記の様にバッファリングされますが、もし、"ANSELB"で"AN2"をデジタルとした場合、(ADC関連レジスタ)
ADC関連レジスタの詳しい内容は、日本語のリファレンスマニュアルを見て下さい。(参考回路)
半固定抵抗(20KΩ)使った実態配線図(サンプルプログラム)
I2C接続でLCDに表示を行う為の記事やソースファイルはこちらのページを参照下さい。
void analogRead(int *value)
{
AD1CON1bits.SAMP = 1; // サンプリングの開始
__delay_us(10) ; // サンプリングの終了まで待つ(10usも待たなくて良い様な気が....)
AD1CON1bits.SAMP = 0 ; // 変換の開始
while (!AD1CON1bits.DONE) ; // 変換の終了まで待つ
*value = ADC1BUF0 ; // アナログ値(AN0)を読み出す
}
int main(void)
{
// A/D変換情報の設定(CH0:10bit:DMA無:手動サンプリング:手動変換)
AD1CHS0 = 0b0000000000000000 ; // CH0=A(AN0)B( )
AD1CHS123 = 0b0000000100000000 ; // CH1/2/3使用しない
AD1CON1 = 0b0000000000000000 ; // 10bit,符号なし整数変換,手動モード、チャンネルは逐次サンプリング
AD1CON2 = 0b0000000000000000 ; // AVDD/AVSS,CH0のA用チャンネルのみ使う,1回サンプリングのみ
AD1CON3 = 0x0007 ; // 変換クロックはFCY,0TAD,変換クロック分周=8
AD1CON4 = 0b0000000000000000 ; // DMAは使用しない
AD1CON1bits.ADON = 1 ; // A/D変換モジュールを有効にする
__delay_us(20) ; // アナログ段が安定するまで待機する
while(1) {
analogRead(ad_dt) ;
// LCDに値を表示する
sprintf(buf,"AN0=%d ",ad_dt[0]) ;
LCD_SetCursor(0,1) ;
LCD_Puts(buf) ;
__delay_ms(500) ;
}
}
※ サンプリングの終了を待つのに10usでなく1us待てば十分と思われるがぁ....
同時サンプリングは1回で読むとして、逐次サンプリングの場合はアナログピンの分のサンプリング時間を
確保しないとダメなのかが今一解らない。
ここはリファレンスマニュアルのサンプルプログラム通りにして置きます。
void analogRead(int *value)
{
while (!_AD1IF) ; // 変換完了まで待つ
_AD1IF = 0 ; // フラグクリア
*value = ADC1BUF0 ; // アナログ値(AN0)を読み出す
value++ ;
*value = ADC1BUF1 ; // アナログ値(AN1)を読み出す
}
int main(void)
{
// A/D変換情報の設定(CH0:12bit:DMA無:自動サンプリング:自動変換)
AD1CHS0 = 0b0000000100000000 ; // CH0=A(AN0)B(AN1)
AD1CHS123 = 0b0000000100000000 ; // CH1/2/3使用しない
AD1CON1 = 0b0000010011100100 ; // 12bit,符号なし整数変換,自動モード、チャンネルは逐次サンプリング
AD1CON2 = 0b0000000000000101 ; // AVDD/AVSS,CH0のABチャンネル交互に読む,2回サンプリングする
AD1CON3 = 0x0307 ; // 変換クロックはFCY,3TAD,変換クロック分周=8
AD1CON4 = 0b0000000000000000 ; // DMAは使用しない
AD1CON1bits.ADON = 1 ; // A/D変換モジュールを有効にする
__delay_us(20) ; // アナログ段が安定するまで待機する
while(1) {
analogRead(ad_dt) ;
// LCDに値を表示する
sprintf(buf,"AN0=%d ",ad_dt[0]) ;
LCD_SetCursor(0,0) ;
LCD_Puts(buf) ;
sprintf(buf,"AN1=%d ",ad_dt[1]) ;
LCD_SetCursor(0,1) ;
LCD_Puts(buf) ;
__delay_ms(500) ;
}
}
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.