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

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
DAC(デジタル アナログ変換)回路

16F145xは、32段階(5bit)のDA変換回路を持っています。DACより出力される電圧は、以下の式であらわされます。  基準電圧 x (DACR<4:0> / 32)基準電圧として内部FVR x1(1.024V)を使用した場合、0v から 0.98V までを出力することができます。

*注意*
DACOUTxは、外部回路を十分に駆動する能力がないため、出力を利用する場合には、ハイインピーダンスのOPアンプなどで受ける必要があります。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
DACCON0 DACEN - DACOE1 DACOE1 DACPSS<1:0> - -
DACCON1 - - - DACR<4:0>
レジスタ BIT 説明 1 0
DACCON0 7 DACEN DAC動作 有効 無効
5 DACOE1 DAC出力ピン 1 出力制御 有効 無効
4 DACOE2 DAC出力ピン 2 出力制御 有効 無効
3 DACPSS1 正基準電圧選択ビット
10 = 内部FVR 01 = VREF+ピン 00 = VDD(初期値)
2 DACPSS0
DACCON1 <4:0> DACR 5 bits DA変換値

DACのプログラム例

代表例として、1KHz正弦波を出力するプロブラムを示します。元となる正弦波データは、22.5度毎のサイン波で、波高は、0から31まで変化する用に計算し、wav[ ]としてプログラム内に定数データとして保存してあります。16MHzのクロックをTimer2でカウントし、16KHzの周期で繰返しリセットするように設定します。リセットするとTMR2IFがセットされるので、そのたびごとに正弦波データ定数を更新し、DA変換のDACCON1にセットします。16回更新するとまた、初めに戻り定数の更新を繰返します。DA変換には、内部基準電圧(FVR)からの1.024vが加えられ、変換された電圧は、OPアンプでバッファされ出力されます。 右図が、出力をオシロスコープで観察したものです。1周期16段階に変化しているのが良く分かります。
<回路図>

<プログラム>

//  File name: DAC
//  Description: DAC example
//  正弦波周波数は
//  クロック16MHzで 1KHz、 4MHzで250Hz
//    Language: MPLABX XC8
//    Target: PIC16F1455
// Copyright (c) 2013 iwamoto All Rights Reserved
//*********************************************************
#include <xc.h>

//************* Config  ***********************************
#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

//********************************************************

// 正弦波定数
const unsigned char wav[] = {  // 5bit 16分割
            0, 1, 5,10,16,21,26,30,31,30,26,21,16,10, 5, 1
           };

//////////// Main //////////////////////////////////
void main(void){
    unsigned char wcnt;
    OSCCON = 0b00111100;         // 内部クロック16Mhz
                                 //
    FVRCON  = 0b10000100;        // FVR ON, CDA Buffer x1(1.024v)
    DACCON0 = 0b10011000;        // DACOUT2 ON, 基準電圧 FVR
                                 // Timer2 16KHz(16MHz/4/250)毎にリセット
    T2CON = 0b00000100;          // PS_1/1 POST_1/1
    PR2 = 249;                   // PR設定
    wcnt = 0;
    while(1){                    // 繰り返しループ
        while(! TMR2IF);         // Timer2 のタイムアップを待つ
        TMR2IF  = 0;             // Timer2 フラッグをクリア
        DACCON1 = wav[wcnt];     // 正弦波データの更新
        if(++wcnt > 15)wcnt = 0; // 16回でリセットする
   }                             // ここまで繰り返し
}