PIC16F1459の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
AD変換

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変換手順
  1. 使用するアナログ入力ピンの設定:
    • 該当するTRIS レジスタのビットを入力「1」に設定
    • 該当するANSEL レジスタのビットを「1」に設定
  2. ADC moduleの設定:
    • AD変換クロックを指定
    • 基準電圧を指定
    • ADC 入力チャネルを指定
    • 結果出力のフォーマットを指定
    • チャージ時間の指定
    • ADC moduleをON
  3. 必要とするチャージ時間を待つ
  4. GO/DONE bitをセットして変換を開始
  5. 変換の終了を以下の方法で待つ:
    • GO/DONE bitを常時監視
    • ADC からのinterrupt を待つ(interrupts使用時)
    • AD変換の結果を取得
    • ADC interrupt flagをクリア (interrupts使用時)
  6. 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 - - 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と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変換のプログラム例

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