Pic16F876A ile 12Bit ADC Denemesi
Bazen 12 Bit Dijital Analog Çeviriciye ihtiyacınız olur ama donanımınız bunu desteklemez veya yeni nesil donanımlara geçmek istemiyorsunuzdur.
Ben referans girişlerini akıllıca yöneterek çözümü 16F876A ile buldum. Ani dalgalanmaları okumayacaksanız ve boşda pinde varsa örneğin Volt okuma gibi uygulamalarda işe yarayacağını düşünmekteyim.
Uygulamada fazladan 3 Output kullanarak referans uçlarını değiştiriyoruz, böylece 0-5V arasında 4 bölgede ADC ölçümü yaptırıyoruz. Ve gördüğünüz gibi sonuç olumlu 5V Vdd referanslı bir mikrodenetleyicide 0 ile 4092 arasında okuma yapabiliyoruz. Burada bilinmesi gereken nokta dirençler üzerinde gerilim bölümü yapıldığı için dirençleri düşük toleranslı seçmek hassasiyeti doğru oranda arttıracaktır.
Uygulamanının Hitech-C kodları;
/* Coşkun ERGAN Pic16F876A ile 12Bit ADC denemesi */ #include <pic.h> #include "delay.h" #include "Lcd.h" /************************************************************/ __CONFIG( 0x3F75 ); /************************************************************/ void port_init() { TRISA = 0b00001101; TRISB = 0b00000000; TRISC = 0b00000000; OPTION=0x0F; // wdt on PORTB=255; PORTA=255; } /************************************************************/ void ADC_oku() { unsigned int a=0,u=0; ADCON0 = 0xC1; ADCON1 = 0x85; TRISC0=0; RC0=1; TRISC1=1; RC2=0; DelayUs(100); ADCON0|=4; while(ADCON0&4)CLRWDT(); DelayMs(1); a =ADRESH; a=a<<8; a|=ADRESL; //----------------------------------- ADCON1 = 0x8F; RC0=0; RC2=1; DelayUs(100); ADCON0|=4; while(ADCON0&4)CLRWDT(); u =ADRESH; u=u<<8; u|=ADRESL; a+=u; //----------------------------------- TRISC0=1; TRISC1=0; RC1=1; DelayUs(100); ADCON0|=4; while(ADCON0&4)CLRWDT(); u =ADRESH; u=u<<8; u|=ADRESL; a+=u; //---------------------------------- TRISC0=0; RC0=1; TRISA3=0; RA3=1; DelayUs(100); ADCON0|=4; while(ADCON0&4)CLRWDT(); u =ADRESH; u=u<<8; u|=ADRESL; TRISA3=1; a+=u; //---------------------------------- lcd_gotoxy(2,8); veri_yolla((a/1000)+48); veri_yolla((a%1000)/100+48); veri_yolla((a%100)/10+48); veri_yolla(a%10+48); } /************************************************************/ void main() { port_init(); DelayMs(50); lcd_init(); lcd_yaz("12Bit ADC X-Fi..."); lcd_gotoxy(2,1); lcd_yaz(" ADC="); do{ DelayMs(100); ADC_oku(); }while(1); } /************************************************************/
Uygulamaya Ait Dosyalar(İsis Similasyonu ve mplab proje dosyası);
Uygulamanın BreadBorad Üzerinde Çalıştırılması;
Uygulamamanın Şeması ve BredBoard üzerinden Görüntüler;
no images were found
Merhabalar.
Coşkun bey, öncelikle bu güzel çalışmanız için çok teşekkürler. sizi eskilerden beri takip ediyorum.
Bu uygulamada Referans voltajını değiştirerek daha yüksek çözünürlük elde etmişiniz, ancak PIC datasheetinde sayfa 176 daki tabloda referans geriliminin en az 2v olabileceği yazıyor. bu değerin altına düşemeyiz.
önceleri bende buna benzer bir yöntem düşünmüştüm. referansı 2.5v yapıp 2 ayrı analog giriş kullanayım dedim. birine okunacak gerilimi direk verip dierinede direnç ile 2ye bölüp uygulayım dedim. elde ettiğin iki ayrı 10bitlik sonucu toplayım ve daha yüksek çözünürlük elde etmiş olabilirdim ama yapmaya pek içim atmadı. işe yarar bişey olacağını hiç sanmadım o nedenle denemedim bile 🙂
neyse, paylaşımın için tekrardan teşekkürler.
Evet datasheet öyle gösteriyor bu ayrıntı gözümden kaçmış 🙂 ve aksine uygulamada çalıştı linerlik bozuluyormu bilmiyorum çok kapsamlı testler yapamadım tabiki sizde haklısınız kesinliklere ulaşmak önemlidir. Sonuç olarak bu bir deneme yanılma uygulaması yanılsam bile bişeyler kazanırım düşüncesiyle yapılmış bir uğraş. Cevabınız için teşekkürler hocam iyi çalışmalar 😉