14 Mart 2012 Çarşamba

16F877 ile ADC Kullanarak 0-5V Voltmetre

ISIS Simülasyon şeması
Bu uygulamada analog olarak ayarladığımız RA0 portuna potansiyometre üzerinden 0 ile 5 volt arası değişen voltaj uyguluyoruz. ADC biriminde okunan bu analog değer, bize 10 bit çözünürlükte(0-1023 arası) geliyor. Bu değerin durumuna göre B portuna bağlı ledleri sırayla yakıyoruz veya söndürüyoruz. Bu şekilde girişin kaç volt olduğunu 5 adet ledle okuyoruz. Her 1 volt artışta bir led yanıyor. Bu şekilde voltmetre olarak çalışıyor. Bu haliyle okunabilecek en büyük değer 5 volt fakat devrenin girişine gerilim bölücü kurularak çok daha büyük değerleri okumak mümkün. Hatta lcd eklenerek voltaj değeri çok daha hassas bir şekilde gözlemlenebilir. Aşağıda kodların yanında açıklamaları yer alıyor.

Program kodları:
#include <16f877.h>           //derleyiciye mcu'yu tanıtıyoruz
#device adc=10                //adc'nin kaç bit olacağını tanımlıyoruz 8 veya 10bit
#use delay(clock=10000000)    //mcu osilatör frekansı f=10hmz

long giris;                   //giris adında long integer tanımlıyoruz

main()                        //ana döngü
{
   setup_adc_ports(AN0);           //RA0(AN0) bacağını analog giriş olarak ayarlıyoruz
   setup_adc(ADC_CLOCK_INTERNAL);  //adc biriminin clock'unu dahili olarak ayarlıyoruz
   set_adc_channel(0);             //okunacak adc kanalının ra0 olduğunu belirtiyoruz
   delay_us(20);                   //20us gecikme, yukarıdaki işlemden sonra gerekli
   output_b(0);                    //b portunu komple lojik 0 yapıyoruz

   while(1)                        //sonsuz döngü
   {
      giris=read_adc();                           //adcyi oku ve değeri giris'e yaz
      if(giris>=1023)output_b(0b00011111);        //bu kısımda okunan adc'nin değerine
      else if(giris>=818)output_b(0b00001111);    //göre binary olarak b portunun durumunu
      else if(giris>=613)output_b(0b00000111);    //rb7-rb0 arası lojik 1 yada lojik sıfır
      else if(giris>=409)output_b(0b00000011);    //yapıyoruz
      else if(giris>=204)output_b(0b00000001);    //
      else output_b(0);                           //
      delay_ms(200);                              //200ms bekle
   }
}

Upload yapabileceğim uygun bir yer bulduğumda kod ve simülasyon dosyalarının linkini de ekleyeceğim.

1 yorum:

  1. Devre tasarımı doğru fakat Kod kısmına gelice işler karışmış galiba

    YanıtlaSil