Adc, Pwm ile birlikte en çok kullanılan modüllerdendir. Genellikle sensör okumak için kullandığımız bu modül farklı Pic modellerinde (8 bit Pic modellerinde) farklı sayıda (0-1-2 adet) ve farklı çözünürlükte (8-10-12 bit) bulunmaktadır. Ayrıca 10f,12f ve 16f serilerinin bir kaç modelinde Adc modülü yoktur. Adc modülü genelde 1 tane oluyor. Ancak 1 modüldeki kanal sayısı (2-24 arası) modellere göre değişkenlik gösterebiliyor. Aşağıdaki linkten tüm 8 bit Pic modellerinin karşılaştırmalı özellik tablosuna bakabilirsiniz.
http://www.microchip.com/ParamChartSearch/Chart.aspx?branchID=1012
UART veya LCD, kütüphanesini resmi olarak paylaşmadığım için Adc değerini dijital çıkışlardan binary’e encode ederek okuyacağız. Adc modülünün nasıl çalıştığını çok iyi anlarsanız fonksiyonda parametre olarak değiştiremeyeceğiniz değerleri kendiniz değiştirebilirsiniz. Zaten tüm ayarları 2 registerla yapıyoruz. Yazıda 16F876A kullanılmıştır;
Adc modülü uyku modunda da çalışabilme yeteneğine sahip olduğu için kütüphanede biz de o şekilde kullanacağız. Bunun için Adc clock kaynağı olarak Adc’nin dahili RC osilatörü seçilmelidir. Clock kaynağını <ADCS2> ve <ADCS1:ADCS0> bitleriyle seçiyoruz. Aşağıdaki tablodan yararlanabilirsiniz;
<CHS2:CHS0> : Kanal seçme bitleridir.
GO/DONE (GO_DONE) : Adc okumayı başlatan (GO_DONE=1 okumayı başlatır) ve durumunu gösteren bittir. Okuma tamamlanınca “GO_DONE=0” olur.
ADON : 1 olduğunda Adc modülünü açan, 0 olduğunda kapatan bittir.
ADFM : Adc sonucu ADRESH ve ADRESL registerlarına yazılır. 8 bitlik bir denetleyiciyle çalıştığımız ve 10 bitlik bir veri istediğimiz için 2 adet register kullanılmıştır. Microchip toplamda 16 bit olan kayıt hafızasında (ADRESH+ADRESL) kaydedilmesi gereken 10 bitlik Adc verisinin sağa mı dayalı yoksa sola mı dayalı olacağını seçmemize olanak tanımış. Bu seçimi de ADFM bitiyle aşağıdaki gibi yapıyoruz.
ADFM biti 1 olursa sağa dayalı (Yani arta kalan ADRESH’in en değerli 6 biti sıfır yapılıyor).
ADFM biti 0 olursa sola dayalı (Yani arta kalan ADRESL’in en değersiz 6 biti sıfır yapılıyor).
ADCS2 : ADCON0 registerındaki ADCS1 ve ADCS0 bitleriyle beraber Adc clock kaynağını ayarlıyor.
<PCFG3:PCFG0> : A ve E portunda analog kanal olanları (AN0, AN1, …..) analog giriş olarak kullanabildiğimiz gibi dijital giriş/çıkış olarak ta kullanabiliyoruz. ADCON1 registerını ayarlamadığımız sürece A portu (eğer varsa E portu) analog giriş olarak kullanılacaktır. Referans voltajını da (VREF+ ve VREF- bacaklarıyla) ayarlayabiliyoruz. Tüm VREF ve AN ayarlamalarını PCFG bitleriyle aşağıdaki tabloya göre yapıyoruz.
ADIF ve ADIE : Adc modülü kesmeleridir.
*Önemli : Analog giriş olarak kullanacağımız bacakları TRIS registerıyla giriş olarak seçmeliyiz !
*Önemli : Tüm A veya E portu analog giriş olarak kullanılabilir diye birşey yoktur. Adc kanalları A ve E portunda bulunur. Pin diyagramında AN0, AN1….ANn şeklinde yazanlar Adc kanallarımızdır ve sadece onlar analog giriş olarak kullanılabilirler.
*Önemli : Okumadan önce (Kanalı seçtikten sonra WaitAdc() fonksiyonundan hemen önce) modülün hazırlanması için en az 20 mikro saniye beklemelisiniz.
Adc gerilim hesabı aşağıdaki gibi yapılır;
Giriş Voltajı = ((VREF+) – (VREF-)) * (Okunan Değer / 1024)
Eğer VREF ayarını değiştirmediyseniz.
VREF+ = VDD = 5v
VREF- = VSS = 0v
Aşağıdaki linkten kütüphane dosyalarını indirebilirsiniz.
Bu kütüphaneyi kullanan örnek kod ve şema aşağıdadır;
//*Yazan : Tugay ARSLAN //*Konu : ADC Kullanımı ve Kütüphanesi //*20.02.2013 //*www.TugayArslan.Com/adc-kutuphanesi-s1-0-tum-pic10-12-16-18-serisi-icin #include <pic.h> #include "adc.h" void encoder (int); void main () { TRISA = 255; //A portu giris yapildi. (*Adc icin gerekli) TRISB = 0; //B ve C portu cikis yapildi. TRISC = 0; PORTA = 0; PORTB = 0; PORTC = 0; InitAdc(); //Adc modulunun ayarlari yapiliyor. StartAdc(); //Adc modulu calistiriliyor. int veri = 0; while(1) { SelectAdc(0); //Adc kanali seciliyor. DelayUs(25); //En az 20 mikro saniye gecikme olmalı. veri = WaitAdc(); //Adc okumasi yapiliyor. encoder(veri); //Okunan veri binary'e donustuluyor. } } //Okunan adc verisi, 10 bitlik binary olarak gosteriliyor. void encoder (int input) { if (input < 256) { PORTB = input; PORTC = 0; } else if (input > 255 && input < 512) { PORTB = input - 256; PORTC = 1; } else if (input > 511 && input < 768) { PORTB = input - 512; PORTC = 2; } else if (input > 767 && input < 1024) { PORTB = input - 768; PORTC = 3; } }
Örnek projeyi indirmek için ise;
Eğer kütüphane eklemeyi, projede kullanmayı bilmiyorsanız; Buraya bakınız.
Son Yorumlar