---
---
12F1822 には、10ビットのADコンバータ(ADC)が組み込まれています。 4チャンネルの外部入力、IC内部の温度センサ、基準電圧(FVR)、DAコンバータ出力の計7チャンネルを切り替えてAD変換することができます。
| AD変換チャンネル | AN0 | AN1 | AN2 | AN3 |
|---|---|---|---|---|
| I/O Port | RA0 | RA1 | RA2 | RA4 |
| Pin 番号 | 7 | 6 | 5 | 3 |
AD変換は、CHS信号により入力電圧を選び、その電圧をモジュール内のコンデンサに充電したのちに開始されます。この充電時間(Acquisition time)を十分にとらないと正確な変換ができません。必要時間は、Vddと入力信号のインピーダンス(Rs)で決まります。
Vdd = 5v、Rs = 10KΩの場合、Acquisition time > 7.37uS の時間が必要です。
| レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
|---|---|---|---|---|---|---|---|---|
| TRISA | - | - | - | TRISA4 | TRISA3 | TRISA2 | TRISA1 | TRISA0 |
| ANSELA | - | - | - | ANSA4 | - | ANSA2 | ANSA1 | ANSA0 |
| 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> | |||
| 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 | アナログ入力チャネルの指定: (規定値 0000) 00000=AN0, 00001=AN1, 11101=TMP 00010=AN2, 11110=DAC 00011=AN3, 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 | ||
| 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 |
| Fosc/2 | 000 | 2.0 uS | 500 nS | 125 nS | 63 nS |
| Fosc/4 | 100 | 4.0 uS | 1.0 uS | 250 nS | 125 nS |
| Fosc/8 | 001 | 8.0 uS | 2.0 uS | 500 nS | 250 nS |
| Fosc/16 | 101 | 16.0 uS | 4.0 uS | 1.0 uS | 0.5 uS |
| Fosc/32 | 010 | 32.0 uS | 8.0 uS | 2.0 uS | 1.0 uS |
| Fosc/64 | 110 | 64.0 uS | 16.0 uS | 4.0 uS | 2.0 uS |
| FRC | x11 | 1.0-6.0 uS | 1.0-6.0 uS | 1.0-6.0 uS | 1.0-6.0 uS |
PortA - RA4 (AN3) に続されたボリュームで分圧された電圧をAD変換し、その値をシリアル送信するプログラムです。 得られた10ビットの値は10進数に変換しシリアル送信しています。 下の写真は、左のPICでAD変換し、左のシリアル信号LCD表示器に表示しています。
<回路図>
<プログラム>
/*********************************************************************
// AD変換した値をUARTでデータ送信する。
//
// 4MHz (内部クロック)
//
* 1 VDD 8 VSS
* 2 RA5 7 RA0 TX
* IN 3 RA4 6 RA1
* 4 MCLR 5 RA2
*
* PIC12F1822 MPLAB X IDE with XC8 Ver1.32
* Copyright (c) 2012 iwamoto All Rights Reserved
* *******************************************************************/
#define _XTAL_FREQ 4000000 // delay_ms(x) のための定義
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
//******************* コンフィグレーション ****************************
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, BORV = LO, LVP = OFF
//
// ================= printf関数を使用するための定義 =================
void putch(unsigned char ch) {
while (!TXIF); // 送信終了待ち
TXREG = ch;
}
// ******************* main ******************************************
void main() {
OSCCON = 0b01101010; // 内部クロック4Mhz
PORTA = 0x00;
TRISA = 0b11111111; // Port すべて入力
ANSELA = 0x00; // すべてデジタル
WPUA = 0b00000000; // RA3 弱プルアップ OFF
nWPUEN = 1;
//------------ Initialize UART -------------------
RCSTA = 0b10000000; // 非同期送信 9600baud
TXSTA = 0b00100100;
BAUDCON = 0b00001000;
SPBRGH = 0;
SPBRG = 103;
// --------- Initialize ADC -----------------
ANSA4 = 1; // AN3はアナログ入力に設定
ADCON1 = 0b11000000; // 右詰め出力, AD変換クロックFosc/4
// 正基準電圧 VDD
ADCON0 = 0b00001101; // アナログ入力 AN3(RA4),ADC ON
__delay_ms(500); // LCD表示器安定待ち
printf("¥x01"); // 画面クリア
printf("A/D conv"); // 上段に表示
// ----------- 繰返し ----------------------------------
while(1){
__delay_ms(100); // LEDちらつき防止の遅延
GO = 1; // AD変換開始
while(GO); // AD変換終了待ち
printf("¥x03"); // 下段先頭にカーソル
printf("%4d",ADRES); // AD変換結果送信
}
}
<プログラム 2>
基準電圧に内部 FVR を使用し、ADC用バッファの倍率を x2(2.048v)に設定。AD変換した値を2倍することで、0-2vまで mV直読のデジボルとなる。
/*********************************************************************
* AD変換した値をUARTでデータ送信する。
* 基準電圧に内部 FVRx2 を使用し、0-2vまでは直読とした
* 4MHz (内部クロック)
*
* 1 VDD 8 VSS
* 2 RA5 7 RA0 TX
* IN 3 RA4 6 RA1
* 4 MCLR 5 RA2
*
* PIC12F1822 MPLAB X IDE with XC8 Ver1.32
* Copyright (c) 2012 iwamoto All Rights Reserved
* *******************************************************************/
#define _XTAL_FREQ 4000000 // delay_ms(x) のための定義
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
//******************* コンフィグレーション ****************************
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, BORV = LO, LVP = OFF
//
// ================= printf関数を使用するための定義 =================
void putch(unsigned char ch) {
while (!TXIF); // 送信終了待ち
TXREG = ch;
}
// ******************* main ******************************************
void main() {
OSCCON = 0b01101010; // 内部クロック4Mhz
PORTA = 0x00;
TRISA = 0b11111111; // Port すべて入力
ANSELA = 0x00; // すべてデジタル
WPUA = 0b00000000; // RA3 弱プルアップ OFF
nWPUEN = 1;
//------------ Initialize UART -------------------
RCSTA = 0b10000000; // 非同期送信 9600baud
TXSTA = 0b00100100;
BAUDCON = 0b00001000;
SPBRGH = 0;
SPBRG = 103;
// --------- Initialize ADC -----------------
ANSA4 = 1; // AN3はアナログ入力に設定
ADCON1 = 0b11000011; // 右詰め出力, AD変換クロックFosc/4
// 正基準電圧 FVR
ADCON0 = 0b00001101; // アナログ入力 AN3(RA4),ADC ON
// --------- Initialize FVR -----------------
FVRCON = 0b10000010; // ADC用出力 x2(2.048v)に設定
__delay_ms(500); // LCD表示器安定待ち
printf("¥x01"); // 画面クリア
printf("A/D conv"); // 上段に表示
// ----------- 繰返し ----------------------------------
while(1){
__delay_ms(100); // LEDちらつき防止の遅延
GO = 1; // AD変換開始
while(GO); // AD変換終了待ち
printf("¥x03"); // 下段先頭にカーソル
printf("%4d",ADRES<<1); // AD変換結果送信
}
}