---
---
16F1459には、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変換チャンネル | AN8 | AN9 | AN10 | AN11 | |
I/O Port | RC6 | RC7 | RB4 | RB5 | |
Pin 番号 | 6 | 5 | 13 | 12 |
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 | - | - | - | - |
TRISB | TRISB7 | TRISB6 | TRISB5 | TRISB4 | ||||
TRISC | TRISC7 | TRISC6 | TRISC5 | TRISC4 | TRISC3 | TRISC2 | TRISC1 | TRISC0 |
ANSELA | - | - | - | ANSA4 | - | - | - | - |
ANSELB | ANSA5 | 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, 01011=AN11 00100=AN4, 01000=AN8, 11101=TMP 00101=AN5, 01001=AN9, 11110=DAC 00110=AN6, 01010=AN10, 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の点滅速度を変えるプログラムです。
<プログラム>
// File name: ADC // Description: A/D example // A/D結果(0-1024)x1msの遅延でLEDを点滅させる。 // Notes: 4MHz内部クロック // LED RC2 // VR AN3(RA4) pin3 // Language: MPLABX XC8 // Target: PIC16F1459 // ------------------------------------------------------------------------- #include <xc.h> #define _XTAL_FREQ 4000000 // delay_ms(x) のための定義 #define LED LATCbits.LATC2 #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 int i; OSCCON = 0b00110110; // 内部クロック4Mhz LATC = 0; TRISC = 0b11111011; // 入出力設定 ANSA4 = 1; // AN3はアナログ入力に設定 ADCON2 = 0b00000000; // AD変換はプログラムの命令で開始 ADCON1 = 0b11000000; // 右詰め出力, AD変換クロックFosc/4 // 正基準電圧 VDD ADCON0 = 0b00001101; // アナログ入力 AN3(RA4),ADC ON while(1){ __delay_ms(5); // ADチャージ時間 GO = 1; // AD変換開始 while(GO); // AD変換終了待ち // AD変換結果 X 1ms の遅延 for(i = 0;i < ADRES;i++) __delay_ms(1); LED = !LED; // LED反転 } }