Geçen dersimizde ADC konusuna bir başlangıç yapmış ve ADC ile registerleri tanımıştık. Hatırlarsanız ADCON0 ve ADCON1 adlı iki adet kaydedici vardı ve biz bunları ihtiyacımıza göre konfigure ederek kullanabiliyorduk. Bu dersimizde, geçen dersimizdeki teorik konuyu pratiğe dökelim.

Aşağıdaki programı MikroC derleyicimize proje oluşturduktan sonra yazalım:

unsigned temp_res; void main()

{ ADCON1 = 0x80;

TRISA = 0xFF;

TRISB = 0x3F;

TRISD = 0;

do {

temp_res = ADC_Read(2);

PORTD = temp_res; //ilk sekiz biti PORTD'ye gönderir.

PORTB = temp_res >> 2; //kalan son iki biti PORTB'nin 6 ve 7.pinine gönderir.

} while(1);

}

ADCON1 kaydedicisine 80 hex değerini yüklemişiz. Bunun manası nedir? Hemen geçen hafta verdiğimiz tabloyu gözünüzün önüne getirin:

adcon1

Bunun manası şudur ki bizler A7’den A0’a kadar herhangi bir girişi ANALOG giriş olarak kullanabiliriz. Üstelik VREF+ beslemeye, VREF- ise GND’ye bağlanacaktır. ADFM=1 ne demekti? 10 Bitlik dijital Sonucu sağa hizalayarak göstereceğiz demekti.

Böylece program kodlarıyla ADCON1 ayarlandıktan sonra TRISA komutuyla PORTA’yı giriş olarak ayarladık. TRISD komutuyla çıkışı ayarladık. TRISB komutuyla da RB7 ve RB6’yı çıkış olarak ayarladık. Niye? Çünkü PORTD 10 bitlik dijital çıkışı göstermeye yetmez, sadece 8 bit gösterebilir. O yüzden komşudan 2 bit borç almış olduk.

Burada değişik bir döngü görüyorsunuz. Ben size bunu göstermemiştim, çünkü fazla kullanılmıyor.

do

{ temp_res = ADC_Read(2);

PORTD = temp_res;

PORTB = temp_res >> 2;

} while(1);

Buradaki döngü komutunu bizim kullandığımızla değiştrebilirsiniz. Yani:

While (1)

{ temp_res = ADC_Read(2);

PORTD = temp_res;

PORTB = temp_res >> 2;

}

Satırları da aynı işi yapacaktır. Üstelik bu daha basit. ADC_read(2) komutuyla A2 pininden Analog veriyi okuyor ve temp_res değişkenine atıyoruz. ADC_read() komutunun parantez içine 0 ila 7 sayılarından birini yazabilirsiniz.

Çünkü ADCON1 kaydedicisini biz A’nın bütün pinlerini (0’dan 7’ye) Analog giriş olarak kullanabileceğimiz şekliyle ayarlamıştık. Okuduğumuz değeri temp_res’e aktardıktan sonra bu değeri de PORTD’den çıkıyoruz. 0,1,2,3,4,5,6,7 bitleri kullandık ama 2 bit daha lazım bize. Dolayısıyla onu da PORTB’den borç almıştık. PORTB = temp_res >> 2 komutuyla kalan 2 biti de PORTB’nin pinlerinden çıkıyoruz. Bu iki bit 10 bitlik sayının başına gelecek yani MSB olacak:

adcon1

Arkadaşlar, programı yazıp derledikten sonra PROTEUS ISIS programına giderek aşağıdaki devreyi aynen kurunuz.:

adocon1

Vref=+5V Vref-=GND olduğuna göre ve çıkışımız 10 bit (1023) olduğuna göre, girişteki her kaç voltluk artışta dijital çıkış 1 artacak onu hesaplayalım: (5V-0)/1023=0,00488 Bu demek oluyor ki her 0,00488 Voltluk artışlarda dijital çıkışım 1 artacak.

Şimdi devredeki 100K’lık Pot’u en aşağı uca getirin yani voltmetreden 0V gözükecek şekliyle ayarlayın. Çıkışta en aşağıdaki LED’in yandığını görüyorsunuz. Çünkü ha 0,00488 Volt ha 0 Volt ikisi de aynı şey. Peki Şimdi, pot’u bir kademe yukarı alın ve Voltmetre’de 0,50V görün.

Çıkışta ne görmem gerek? Her 0,00488 Voltta 1 artıyorsa, 0,50 Voltta kaç olur. Doğru orantı. O zaman 0,50 / 0,00488 = 102 çıkar. Gerçekten de yanan ledlerin değerlerini alırsanız: 2+4+32+64 değerli EDLER yanıyor, Toplam=102 yapar. Siz de Potla kademe kademe oynarak değişik değerlerin sağlamasını yapınız.

adcon şema devre

TAGS: mikroc adc examples, how to adc in pic mikro, pic analog dijital çevrim

Anahtar Kelimeler: Mikrodenetleyici, Analog Digital Conversion, Analog Digital Dönüşüm, CCS PIC C Örnekleri, Mikroc PIC Örnekleri, PIC ADC örnekleri, PIC ile ADC dönüşüm, PIC ile Termometre, PIC ile Voltmetre, PIC ile Vumetre

peynir6 suyu tozu , 16/05/2008-17:13 Facebook'ta Paylas