JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1705 DAC テスト

2019-05-07 23:01:15 | PIC16F1705

 PIC16F1705は、8bit(0~255)のDAコンバータ(DAC)を内蔵しています。

 そのDACを利用して、1000Hzの三角波を作り、内蔵OPアンプ1(ボルテージフォロア接続)に接続して、出力してみます。

 正確なクロックを得るために外部クロックとし、20MHzのクリスタルオシレータの信号をRA5(CLKIN)に入れます。

 TMR2割り込みを利用して、10us(100KHz)ごとに割り込みを発生させ、割り込みごとにDACのデータ(DACR)をインクリメント、ディクリメントして、三角波を発生させます。

 DACの構造です。(PIC16F1705の説明書より)

 

  DACの設定は、DAC1CON0レジスタで行います。bit7(DAC1EN)=1として、DACを使えるようにします。bit3:2=DAC1PSS=00として、VSOURCE+=VDD(5V)とします。bit0=DAC1NSS=0として、VSOURCE-=Vssとします。DAC1OUT1とDACOUT2は、0として、ピンには出力しません。DAC1_Outputは、OPA1に接続します。

 つまり、DAC1CON0=0b10000000 とします。

 次に、OPA1の設定です。OPアンプの使い方(ボルテージフォロア)は、当ブログのこちらを参照してください。

 OPA1の正入力は、DAC_Outputとしますので、OPA1CH=10としますので、

 OPA1CON = 0b10010010 とします。

 プログラムです。

---------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
 
// CONFIG1
#pragma config FOSC = ECH      //外部クロックHigh Power mode(4?20MHz)
#pragma config WDTE = OFF       //ウォッチドックタイマー無効
#pragma config PWRTE = ON       //パワーアップタイマーを有効にする
#pragma config MCLRE = OFF      //MCLRピンをRA3として使用する
#pragma config CP = OFF         //プログラムメモリを保護しない
#pragma config BOREN = ON       //ブラウンアウトリセットを有効にする
#pragma config CLKOUTEN = OFF   //クロック出力を無効とし、RA4ピンとして使用する
#pragma config IESO = OFF       //内部・外部クロックの切り替えでの起動を行わない
#pragma config FCMEN = OFF      //外部クロックを監視しない
 
// CONFIG2
#pragma config WRT = OFF        //フラッシュメモリを保護しない
#pragma config PPS1WAY = OFF    //ロック解除シーケンスで何度でもPPSLOCKをセット/クリアできる
#pragma config ZCDDIS = ON      //ゼロクロス検出回路無効
#pragma config PLLEN = OFF      //×4PLLを動作させさない
#pragma config STVREN = ON      //スタックオーバーフローリセットを行う
#pragma config BORV = HI        //ブラウンアウトリセット電圧を高(2.7V)に設定
#pragma config LPBOR = OFF      //低消費電力ブラウンアウトリセット無効
#pragma config LVP = OFF        //低電圧プログラミングを行わない
 
#define _XTAL_FREQ 20000000

unsigned char i = 0;
unsigned char j = 0;
 
void __interrupt() isr(){
    TMR2IF = 0;         //TMR2IFクリア
    DAC1CON1 = j;
    if(i <= 50){
        j++;
    }else{
        j--;
    }
    i++;
    if(i == 100){
        i = 0;
        j = 0;
    }
}
 
void main() {
    ANSELA = 0b00000000 ;     // AN0-AN3は使用しない
    ANSELC = 0b00000000 ;     // AN4-AN6は使用しない
    TRISA  = 0b00100000 ;     // RA5は入力、他は出力
    TRISC  = 0b00000000 ;     // PORTCは全て出力
    PORTA  = 0b00000000 ;     // PORTA初期化
    PORTC  = 0b00000000 ;     // PORTC初期化
   
    /* OPアンプ1設定 */
    OPA1CON = 0b10010010;     // OPA1EN=1,OPA1UG=1,OPA1CH=10=DAC
   
    /* DAC設定 */
    DAC1CON0 = 0b10000000;    // DAC1EN=1,DAC1OE1=0,DAC1OE2=0,DACPSS=00=Vdd
   
   
    TMR2IE = 1;               //TMR2割り込み許可
    PEIE = 1;                 //周辺割り込み許可
    GIE = 1;                  //全割り込み許可
   
    /* PR2の計算
     * PR2=(Fosc/(Fout×4×TMR2 Prescaler Value))-1
     *    =((20000000/(100000×4×1))-1
     *    =49
     */
 
    PR2 = 49;                 //TMR2出力周波数100KHz
    T2CON = 0b00000100;       //prescaller 1:1,postscaler1:1, TMR2 start
   
    while(1){
       
    }
}

---------------------------------------------------------------

 TMR2から10usごとに割り込みがかかり、その都度jの値をインクリメントします。jが50を超えたらディクリメントします。iは割り込みの度にインクリメントされi=100になったら、i=0,j=0とします。これで三角波ができます。

 DACの出力電圧の最高値は、5.0×(50/256)=0.98Vです。

 実際に発生した波形です。

 一部を拡大してみます。ピークは、0.97Vです。

 階段状になると思ったのですが、かなりギザギザしています。

 周波数を測定してみました。

 1周期は、10us×100=1000us=1msですから、1000Hzです。実測値も1000Hzです。

 工夫すれば、いろいろな波形を作れそうです。


最新の画像もっと見る

コメントを投稿