---
---
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変換値 |
代表例として、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回でリセットする } // ここまで繰り返し }