Anasayfa > Yazılımlar > Pic16F876A ile 12Bit ADC Denemesi

Pic16F876A ile 12Bit ADC Denemesi

24 Ağustos 2012 Yorum Ekle Yorumlara git

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ı);

İndirmek için Tıklayınız…

Uygulamanın BreadBorad Üzerinde Çalıştırılması;

 

Uygulamamanın Şeması ve BredBoard üzerinden Görüntüler;

no images were found

Kategoriler: Yazılımlar Etiketler: ,
  1. Nazmi
    4 Ekim 2012 10:57 | #1

    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.

  2. 5 Ekim 2012 22:52 | #2

    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 😉

  1. Şimdilik geri izleme yok