Posted by : Unknown 21 Temmuz 2015 Salı

PİC PROGRAMLAMA -14

Dogada bulunan tüm sistemler analog düzendedir.Bizim kullanıdıgımız entegreler ise dijital düzendedir.Bu analog sistemlerden(ışık,ses,sıcaklık...) veri almak için bunları dijitale dönüştürmek gerekir.Bu işlem için ADC entegreleri kullanılır.Pic 16f877 de adc modulü bulunmaktadır.Şekilde gösterilmiştir.



.n bitlik bir adc en fazla 2^n kadar analog veri örnekleyebilir.Bu örnekleme sayısı adc'nin çözünürlügü olur.Çözünürlük ne kadar yüksekse o kadar iyi bir dönüştürme olur.Adc nin dijital büyüklüge dönüştürülecegi en küçük birime ise adım büyüklügü denir.
Adım büyükügü=(Vref(+)-Vref(-))/(2^n) ile hesaplanır.

ADC KOMUTLARI:

-Setup_adc()=Bu komut ile adc kapatılır,açılır veya frekans degeri belirlernir.
-Setup_adc_ports(x)=Bu komut ile analog giriş komutlarına karar verir.Bu komut  yani x degişkeni kullanılan denetleyiciye göre degişir.
-Set_adc_channel(x)=Bu komut ile okuma yapacagımız kanal seçilir.X degişkeni yerine şunlar yazılır;
0=RA0,1=RA1,2=RA2,3=RA3,4=RA5,5=RE0,6=RE1,7=RE2
örnegin;set_adc_channel(0) gibi
-read_adc()=Bu komut ile analog veri okuması yapılır.Bu komuttan önce üstteki komutlar kesinlikle tanımlanmalıdır.
örnegin; setup_adc(adc_clock_div_32)//adc frekansı osiloskop frekansı/32 degerindedir
                setup_adc_ports(all_analog)//tüm portlar analog giriştedir.
              set_adc_channel(0)//RA0 pininden okuma yapılacak
                veri=read_adc()//RA0 pininde okunan analog sinyal okunur
Not=read_adc(adc_start_and_read) komutu ile read_adc() komutu aynı görevi görür.
Gelelim uygulamamıza;
#use delay(clock=4000000)//pic frekans degeri
#define use_portd_lcd true//lcd'mizin d portuna baglı
#include <lcd.c>//lcd kütüphanesi
long int veri=0;
float sayi;
void main()
{
   set_tris_b(0*00);
   output_b(0*00);
   setup_adc_ports(AN0);//RA0 pini analog giriş yapılacak pin
   setup_adc(adc_clock_div_32);//F_adc=F_pic/32
   set_adc_channel(0);//RA0 pininden okuma yapılacak
   delay_us(20);//Kanal seçiminden sonra muhakkak konmalıdır.
   lcd_init();//lcd hazırlanıyor
   printf(lcd_putc,"\fPOTANSIYOMETRE\nUYGULAMASI");//ekrana yazdırılıyor
   delay_ms(1000);//1 saniye bekleniyor
     while(true)
   {
   veri=read_adc(adc_start_And_read);//kanal 0 daki deger okunur ve veri degişkeninin içine atılır.
   if(veri>240)output_b(0b11111111);//veri degeri 240 tan büyükse B portunun hepsini yak
   else if(veri>210)output_b(0b01111111);//veri degeri 210 dan büyükse B portunun sadece RB7 yanmasın
   else if(veri>180)output_b(0b00111111);//veri degeri 180 den büyükse B portunda RB7 ve RB6 yanmasın
   else if(veri>150)output_b(0b00011111);//RB7,RB6,RB5 yanmasın
   else if(veri>120)output_b(0b00001111);// RB7,RB6,RB5,RB4 yanmasın
   else if(veri>90)output_b(0b00000111); //RB7,RB6,RB5,RB4,RB3 yanmasın
   else if(veri>60)output_b(0b00000011); //RB7,RB6,RB5,RB4,RB3,RB2 yanmasın
   else if(veri>30)output_b(0b00000001); //RB7,RB6,RB5,RB4,RB3,RB2,RB1 yanmasın
   else if(veri>0)output_b(0b00000000);// RB7,RB6,RB5,RB4,RB3,RB2,RB1,RB0 yanmasın
   sayi=veri*0.01953;//veri degerimizin dijital ortamdaki karşılıgını bulduk.Bunu yaparken şu yolu izledik.8 bit üzerinde işlem yaptıgım için; (5-0)/(2^8)=0.01953   .sonra veri degişkeni ile de bu ifadeyi çarptım
   printf(lcd_putc,"\fVoltaj=%f V",sayi);//ekrana yazdırdım
   delay_ms(1000);  //1 sn bekledim
   }
   setup_psp(PSP_DISABLED);//psp devre dışı
   setup_spi(SPI_SS_DISABLED);//spı devre dışı
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);//timer0 devre dışı
   setup_timer_1(T1_DISABLED);//timer1 devre dışı
   setup_timer_2(T2_DISABLED,0,1);//timer2 devre dışı
}


yorumlarınız bizim için önemli

Bültene abone ol | Yorumlara abone ol

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger