DAC (Digital to analog converter) herkesin bildiği üzere ADC’nin yaptığı işlevin tam tersini yapan, verilen dijital bilgiye göre analog çıkış üreten özel bir birimdir. Pulse, Binary, R2R, Oversampling, Hibrid ve bir çok DAC metodu olmasına rağmen Pulse, Binary ve R2R metotları günümüz uygulamalarında oldukça fazla tercih edilmektedir.
Bu yöntemleri çok kısa açıklarsak:
Pulse DAC Metodu: Günümüzde bir çok mikrodenetleyici içerisinde bulunan PWM birimi kullanılarak DAC yapmak mümkündür. Bunun için örneklenen verinin genliği, PWM sinyalinin zamanı ile orantılanır ve dijital çıkış bir filtre kullanılarak (genellikle LP) istenilen analog sinyalin üretilmesi sağlanır. Günümüzde düşük frekanslı sinyal üretmede başarılı olan bu teknik, yüksek çözünürlüklü ve frekanslı sinyal üretmede başarısız kalır.
Binary DAC Metodu: Verilen herhangi bir binary sayının çözünürlüğe oranıyla çalışan bu metot yüksek frekanslı sinyaller oluşturmak için uygundur. Yalnız bu yöntemde de analog sinyaller merdiven gibi basamaklı bir şekil alacağından bu basamaklı şekli yok etmek için çıkışta yine bir filtre yapısı kullanılır. Bir çok mikrodenetleyici gibi ARM’ın da DAC birimi bu özellikle çalışmaktadır.
Yaptığım uygulamada kullandığım LPC2368 DAC biriminin aşağıda özellikleri görülebilecek sadece bir adet registeri bulunmaktadır.
Uygulamada öncelikle DAC’ın hangi hızda çalıştırılacağı belirlenir.
Daha sonra DAC’ın çıkışı [(V/Vref)x1024] formülü ile bulunabilir. Değerin DAC registerine yazılmasından sonra istenilen sinyal BIAS değerine göre 1us veya 2.5us içerisinde çıkış pinine yansıtılır.
Ben bu uygulamada, DAC çıkış gerilimini ADC0.0 kanalından gelen bilgi değiştirerek, bir ledin kısık ya da parlak yanmasını sağladım. Bu uygulamaya ait kodları aşağıda görebilirsiniz.
/* * Yazar : FxDev - Fırat DEVECİ * Konu : DAC Uygulaması * Yazar WEB Sitesi : localhost/ff */ #include "LPC23xx.H" unsigned int adc_read(unsigned char channel) { unsigned int i; // ADC bloğu açılıyor PCONP|= (1 << 12); // PCLK=12MHz, kanal seçimi yapılıyor AD0CR = 0x00200300 | ((0x01) << channel); // A/D çevrimi başlatılıyor AD0CR|= 0x01000000; while(!(AD0GDR& 0x80000000)); i = AD0GDR; // Çevrim bilgisi okunuyor return ((i>>6) & 0x03FF); // 15:6 arasındaki 10 bitlik veri ADC data } int main(void) { int adc_1=0; PINSEL0=0x00000000; // İlk 16 pin GPIO olarak ayarlanıyor PINSEL1=0x00214000; IODIR0=0xFFFFFFFF; for(;;) { adc_1=adc_read(0); DACR=adc_1<<6; } }
Uygulamaya ait resim parçalarını aşağıda görebilirsiniz.
ARM’ın DAC’ını kullanmak yukarıdan da görülebileceği gibi oldukça basittir. DAC birimi kullanılarak ses, ve görüntü uygulamalarının yanında özellikle dijital kontrolde de oldukça fazla kullanılabilir.
Yayım tarihi: 2010/12/30 Etiketler: arm, arm adc, arm binary, arm dac, arm projeleri
Hocam yukarıda DAC çıkışının verebileceği akım değerleri uA seviyelerinde gösterilmiş. Bu seviyedeki akım ile LED’i nasıl yakabildiniz? Transistör ile mi sürülüyor ledler kit üzerinde? Bir de kodu Keil ile mi derlediniz?
Açıkçası bunun olacağını ben de beklemiyordum fakat led yanınca denemeye karar verdim. ARM’a ilk başladığım zamanlarda ben de bu soruyu sormuş ama bir yanıt bulamamıştım açıkçası.
Peki hocam kodu Keil ile mi derlediniz?
Evet kod Keil ile derlendi.