Analog Digital Converter
Analog Digital Converter |
Merhabalar.. Bu yazımda Pic18f452 ile Analog sensörden veriyi digital e çevirip bunu terminalde göstereceğiz.. Yazdığım kod eskiden yapmış olduğum bir projeye ait..İçinde sadece ADC yok ..Şimdiden söyliyim..
Şimdi.. Neden ADC ye ihtiyaç duyarız? Bir analog sinyali düşünün.. Bunu pic ile bağdaştırmamız gerek. Pic in çalışma mantığı 5v ve 0v bildiğiniz üzere. E peki nasıl değişken voltajları pic e uyarlayabilicez?işte alttaki formul sayesinde.
ADC girisine uygulanan analog gerilimin değeri= (Sayısal çıkısın onlu değeri x Adım Büyüklüğü)
Şimdi bu formüller ne işe yarıyor onu açıklayalım ardından örneklere geçelim..
Diyelim ki bizim sensörümüz mesafe algılayıcı (sharp) sensörü olsun..Alttaki resimde anlaşılacağı gibi bu sensör Farklı mesafelerde farklı voltaj verir.Biz pic e mesafeyi ölçtürtmek için voltaj üzerinden hesap yapmamız gerekir. O zaman analogdan dan yani değişen voltajdan dijitale çevirdiğimizde yani pic in anlayabileceği formata çevirdiğimizde birkaç fonksiyonla mesafeyi bulabiliriz
Şimdi tek yapmamız gereken birazcık matematik..
Öncelikle 10 bit çözünürlükte olsun kabul edelim bunu açıklıycam birazdan.Adım büyüklüğü yukardaki formülden hesaplamamız gerekiyor.. Örneklenicek maksimum değer herzaman 5v tur . 5/1024 ten 0,0048828125 çıkar.. Bu demektir ki her 0,0048828125 Voltta yani 4.8 mV ta Pic bize bir digital deger verir..Çözünürlük hassasiyeti belirtir.. Ne kadar çok olursa o kadar hassas ölçüm yapabiliriz..
Değişen voltajı ise ADC girisine uygulanan analog gerilimin değeri= (Sayısal çıkısın onlu değeri x Adım Büyüklüğü) formülünden buluruz..
Yani Volt=Pic in bize verdiği değer*0,0048828125
eğer sensörün ilk değeri 0 değilse okuduğu voltaja grafikteki minimum değerini eklemeliyiz..Çünkü minimum değerde 0 veya 0 a yakın değerler vericektir. Aksi halde okumada hata olur..
Şimdiye kadar herşey iyi gitti.. Ama biz hala mesafeyi ölçemiyoruz.. Bu konuda çok sorunlar çektim. Çünkü tamam değişen mesafeye göre voltajı okuyabiliyorum ama voltaj ile mesafe arasındaki bağıntıyı pic e nasıl belirtmeliydim? Bunun çözümünü çok araştırdım… Eğer sağlıklı bir okuma istiyorsanız kesinlikle kendi fonksiyonunuzu yazmanız gerekiyor..Yukardaki sharp sensörün grafiğinde mesafe ve volt ilişkisini vermiş.. Bu grafiğin fonksiyonunu çıkartırsak pic e gömüp sonucu elde ederiz..
Curve expert programı bize kolaylıkla bunu sağlıyor.. tek yapmamız gereken istediğimiz değerleri excell gibi x ve y koordinatlarını girmek
tek tek girdikten sonra calculate diyip fonksiyonunuzu çıkartabilirsiniz..Burdan indirebilirsiniz
Örnek Kod aşşağıdadır .
#include <18F452.h>
#device adc=10
#include
#include
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#use delay(clock=10M)
#use fast_io(a)
#use fast_io(b)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
int16 digitalvalue; //int default olarak 8 bittir adc den okuyacağımız
değer 10 bit olduğundan 16 bitlik tanımlamamız şart aksi halde deger taşar ve saglıklı ölçmez//
int8 deger=0;
float volt,distance;
void main()
{
set_tris_a(0x01); //A0 ı analog girişi olarak kullanıcağız
set_tris_b(0b00000100);
set_tris_d(0b00000000);
setup_adc(adc_clock_div_32);
setup_adc_ports(AN0); //a0 adc belirtme
set_adc_channel(0);
delay_us(50);
while(1)
{
digitalvalue=read_adc(); //adc den veri oku
volt=(0.0048828125*digitalvalue); //alınan voltajı hesapla
distance=(173*pow((volt+0.7611),-1.77));//mesafe-volt fonksiyonu
if (distance>55){ //55 cm den küçükse ledi yakma-söndürme tesit
distance=distance-7;
output_low(pin_d7);
}
else{
output_high(pin_d7);
}
printf("rvalude=%f distance=%f deger=%d max=%d ",volt,distance,deger,max);
delay_ms(250);
//değeri rs232 ile yada rf ile gönderip yazdırma
}
}
Tüm simülasyon ve ccs kodları ektedir. Lütfen indirin