Elektronik / Mikrodenetleyici Projeleri/

ARM: DAC

Sponsorlu Bağlantılar

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.

PWM-Sinepulse-sine-wave

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-method

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.

DAC-register

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.

ADC-to-DAC

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.

Sponsorlu Bağlantılar
  • Maytere

    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?

  • FxDev

    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ı.

  • Maytere

    Peki hocam kodu Keil ile mi derlediniz?

  • FxDev

    Evet kod Keil ile derlendi.