PIC18F DAC Sinyal Üretimi Sinüs, Üçgen ve Testere Dişi

PIC18F DAC sinyal üretimi için kullandığımız mikrodenetleyici PIC18F46K22’dir. Bu mikrodenetleyicide DAC modülü 5 bit çözünürlüğe sahiptir kısacası 25 = 32 adımda çıkışı değiştirebileceğimiz anlamına gelir. 5V besleme gerilimi kullandığımız zaman 5V/32 = 0.15625 V = 152.25 mV adım gerilim hassasiyetini arttırıp azalatabiliriz. Bu kadar yüksek bir fark olması sebebiyle pratikte kullanmak iyi bir seçenek olmayabilir, bu yüzden yaygın kullanılan DAC modüllerinin neden 8-bit veya 12-bit olduğunu buradan anlayabiliriz.

DAC modülünü kullanmak oldukça kolay. Referans kaynaklarını seçip çıkış kaydedicisine değer yüklendiğinde DAC çıkışı o genlik seviyesinde çıkış vermekte. Bu işlemi elde etmek istediğimiz frekansa göre periyodik olarak yaptığımızda DAC biriminden çok basit bir şekilde analog sinyal elde etmek mümkün. Fakat ıkış işareti DAC biriminin adım büyüklüğü kadar artıp azalacağından bir filtre ile sinyali yumuşatmak gereklidir.

Örnek olması için DAC modülünden sinüs, üçgen, testere dişi çıkış dalgaları elde ettik, kullandığımız RC filtre hesaplanmadan örnek olması için kullanılmıştır. Gerekli sinyali karar verdiğinizde RC filtreyi de bu güncelleme doğrulutusunda tekrar hesaplamanız gerekir. Aktif bir filtre entegre edilerek, parazit ve bozulma olmadan yüksek genlikte sinyal almak mümkün hale gelebilir.

Proje Kodu

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>

#define _XTAL_FREQ 4000000

const unsigned char sin_dalga[32]={
15,17,20,23,25,27,28,29,
30,29,28,27,25,23,20,17,
15,13,10,7,5,3,2,1,
0,1,2,3,5,7,10,13
};

const unsigned char testere_dalga[32]={
0,1,2,3,4,5,6,7,8,9,10,11,12,13,
14,15,16,17,18,19,20,21,22,23,
24,25,26,27,28,29,30,31};

const unsigned char ucgen_Dalga[62]={
0,1,2,3,4,5,6,7,8,9,10,11,12,13,
14,15,16,17,18,19,20,21,22,23,
24,25,26,27,28,29,30,31,30,29,28,
27,26,25,24,23,22,21,20,19,18,17,
16,15,14,13,12,11,10,9,8,7,6,5,4,
3,2,1};

void main(){

    ANSELAbits.ANSA2=1;
    TRISAbits.TRISA2=1;
    LATA2=0;
    uint8_t i,b;
    //DAC init
    //REF vss,vdd
    VREFCON1bits.DACEN=1;
    VREFCON1bits.DACLPS=1;
    VREFCON1bits.DACOE=1;
    VREFCON1bits.DACPSS=0b00;
    VREFCON1bits.DACNSS=0;
    VREFCON2bits.DACR=0; 

    while(1){
        b=100;
        while(b--)
        for(i=0;i<32;i++){
        VREFCON2bits.DACR=sin_dalga[i];
__delay_us(611);
    }
        b=100;
 while(b--)
         or(i=0;i<32;i++){
        VREFCON2bits.DACR=testere_dalga[i];
__delay_us(611);
    }
        b=100;
 while(b--)
        for(i=0;i<62;i++){
        VREFCON2bits.DACR=ucgen_Dalga[i];
__delay_us(305);
    }
    }
}

Simülasyon Görüntüsü

4. pinden çıkış alınır, diğer bağlantılar standart MCLR ve osilatör bağlantılarıdır, eğer dahili osilatörü kullanırsanız, bu bağlantıların sayısını azaltabilirsiniz.

PIC18F DAC Sinyal Üretimi Sinüs, Üçgen ve Testere Dişi PIC18F DAC Sinyal Üretimi,sinüs,üçgen,testere dişi

Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.