---
---
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反転
}
}