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(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ışı
}
Benzer Konular :
- Ana Sayfaya Dön »
- adc nasıl kullanılır , adc nedir , ccs c ile pic programlama , pic ile adc kullanma , pic ile analog deger okuma , pic ile analog ditijal cevrim , pic ile otomasyon , pic nasıl programlanır , pic programlama »
- PIC PROGRAMLAMA 14 ANALOG DIGITAL DONUSUM