pic16877 analog girisine sensör bagladım ama bagladıgım sensor en fazla 0.45 volt cıkıs veriyor, devreyi kurdugumda adc cevrim olmuyor, hata bende mi yoksa picin en düsük algılama voltajının altındamı bu deger bu sınırı bilen var mı :(
verdiğin detay kadar ancak şöyle cevap verilebilir
"hata sende"
yani picin boyle bir sınırı yok tesekkur ederim hemen gözden gecireyim devremi
Hata kesinlikle sende. PIC'in 10 bit ADC si var. Bu da demek oluyor ki 5V'u 2^10 = 1024 adımda görebilirsin.
5/1024=48mV hassasiyetle ADC'yi kullanabilirsin.
programım isis'ta sorunsuz calısıyor ama devreyi kurdugumda ledi bile yakamıyor,sharp sensörü kullanıyorum lm35 i sadece 0,45-0 volt arasını pice girebilmek icin kullandım yoksa onu kullanmıyorum programım ve devre semam bu sekilde, o soylediginiz adım boyunu 0.45/1024 ten tekrar buldum elimdeki orneklerde o sekilde yapmıslar hatalı oldugum bir yer var ama bir türlü bulamadım
[IMG]http://img837.imageshack.us/img837/5417/isid.png[/img] (http://imageshack.us/photo/my-images/837/isid.png/)
#include <16f877.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(c)
#use fast_io(e)
#define use_portb_lcd TRUE
#include <lcd.c>
#INT_AD
void ADC_Kesmesi ( )
{
output_high(pin_c5);
delay_ms(200);
output_low(pin_c5);
}
unsigned long int bilgi;
float i;
float mesafe;
int8 j;
void main ( )
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_c(0x00);
set_tris_e(0x0F);
output_c(0x00);
setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);
lcd_init();
printf(lcd_putc,"\f UZAKLIK OLCUM");
delay_ms(1500);
while(1)
{
set_adc_channel(5);
delay_us(20);
bilgi=read_adc();
i=(0.000439453125*bilgi);
if (i<0.0200)
mesafe=80;
if ((i<=0.0228) && (i>0.0200))
mesafe=75;
if ((i<=0.0235) && (i>0.0228))
mesafe=70;
if ((i<=0.0245) && (i>0.0235))
mesafe=65;
if ((i<=0.0263) && (i>0.0245))
mesafe=60;
if ((i<=0.0271) && (i>0.0263))
mesafe=55;
if ((i<=0.0287) && (i>0.0271))
mesafe=50;
if ((i<=0.0302) && (i>0.0287))
mesafe=45;
if ((i<=0.0325) && (i>0.0302))
mesafe=40;
if ((i<=0.0355) && (i>0.0325))
mesafe=35;
if ((i<=0.0391) && (i>0.0355))
mesafe=30;
if ((i<=0.0436) && (i>0.0391))
mesafe=25;
if ((i<=0.0460) && (i>0.0436))
mesafe=20;
if ((i<=0.0463) && (i>0.0460))
mesafe=10;
if ((i>0.0460))
mesafe=0;
printf(lcd_putc,"\fDijital=%lu",bilgi);
printf(lcd_putc,"\nUZAKLIK=%f",mesafe);
delay_ms(25);
if ((mesafe<=80) && (mesafe>=60))
{
{output_high(pin_c0);
delay_ms(400);
output_low(pin_c0);
delay_ms(400);
}
}
if ((mesafe<60) && (mesafe>=40))
{
{output_high(pin_c0);
delay_ms(200);
output_low(pin_c0);
delay_ms(200);
}
}
if ((mesafe<40) && (mesafe>=20))
{
{output_high(pin_c0);
delay_ms(100);
output_low(pin_c0);
delay_ms(100);
}
}
if ((mesafe<20) && (mesafe>=0))
{
{output_high(pin_c0);
}
}
}
}
sensörü kontrol et.
Önce sensöre 5V gerilim ver
çıkışına bir voltmetre bağla
voltmetrede en kısa mesafedeki gerilimle en uzun mesafedeki gerilimi ölç
sensörün doğru çalıştığından emin ol
sharplar hassas en ufak ters bağlantıda yanıyor.
problem o degil onun cıkısını kontrol ettım dedigim gibi 0.45 volt cıkıs veriyor sharp GP2D12
hangi sharp sensörünü kullanıyorsunuz? Kodu nedir. Bazı modellerde( çin mallarının hepsi de diyebiliriz) bağlantı şekilleri sihay gnd, kırmızı +5, sarı data şeklinde olmayabiliyor.
yukarıda soyledıgım sensör, sensörde problemim yok bu degerleri zaten ölcerek size söyledim
Şimdi internetten baktım da, o sensörün mesafeye göre 0.45 - 2.45 volt aralığında bir çıkış vermesi gerekiyor. Burada (http://zuff.info/SharpGP2D12_E.html) bir grafik var. Öncelikle buradaki değerlerin yaklaşık olarak tutup tutmadığını kontrol et.
evet ama datasheette 2 deger var 0.45-2.45 üstünde 0.25-0.55, aldıgım yerde hepsini denedm 5 volt girise hepsi aynı cıkısı veriyor bende orada tıkanıyorm zaten
adc yaparken, denetleyici ref+ ve ref- arasındaki gerilimi senin istediğin çözünürlükte böler, eğer dışardan birşey bağlamışsan, piclerde ref+ - ref-= 5v dur, yani yaptığın çevrimde sana gelen bilgiler 5v=1024, 0v=0 olarak gelecektir, eğer sen 0.45-0 arasında çok çok hassas ölçüm yapmak istiyorsan ref+ - ref- =0.45v değerini sağlayacak besleme vermen gerekir, ama ben sanıyorum ki senin burda yaptığın işlemde buna gerek yok sen " i=(0.000439453125*bilgi);" bu çarpım işleminin doğru olduğuna emin misin, 0.45/1024 yapmışsın ama bunu 5/1024=0.0048828125 ile değiştir misin, büyük ihtimalle bu işlem sonucunda istediğin çıkışı alacaksın, eğer olmazsa, 0.00217265625 dene bu ikisinden biriyle istediğin sonuca kesinlikle ulaşacağını düşünüyorum.
bir tavsiye: sharp ile mesafe ölçümü için bu kadar if caseleri oluşturmana gerek yok, sharpın grafiğindeki değerleri olduğu gibi excele yaz, excel sana grafiğin fonksiyonun çıkarsın :) sen de milimetrik ölçümlerle eğlenme bak :)
Bence sensör bozuk. Son olarak sensöre yakın bir yerde beslemeler arasına 10 - 20 uF gibi bir kapasitör koy. Datasheet'te öyle yazıyordu diye hatırlıyorum ama bundan da pek umutlu değilim.
ben kullanıyorum aynısından ve bu şekilde kullanıyorum, dediğim excel fonksiyonunu da çıkardım, her bir santimi tek tek hesaplayabililyorum, biraz daha kasarsam, yani 16 bit adc kullansam milimetre bile ölçerim gibi geliyor :)
sarıya gnd, kırmızı +5 vererek multimetre yardımıyla bir ölçüm yap istersen hocam. bağlantı şekli o şekilde de olabilir.
dediklerini hemen yapıyorum...tavsiyen icin tesekkürler ama hicbir grafige uymuyor ki cıkıs hangi grafigin degerlerini aktarayım excele :) birde senin yaptıgın programı buraya kopyalayabilirmisin.....nerelere kondansatör atmadım ki ama datasheet dısına cıktım hep.
thayır söylemek istediğim grafik şu şekilde, senin sharpın datasheetindeki grafikte her bir voltaja karşılık gelen mesafe değerleri vardır, excelde bir sütüna 8 den başlayarak 80( 8 den 80 e dedim çinkü benim kullandığım 8 cm altını ölçmeiyor, tabi bunu mekanik bir uyanıklık ile çözdüm ben de :) ) e kadar satır satır yazarsın, bir başka sütuna da bunların denk geldiği voltaj değerlerini yazarsın,( internette biraz araştır excelde grafik çizme diye ) daha sonra excel sana bunun grafiğini de verir, voltaja bağlı olarak mesafenin fonksiyonunu da verir, hatta fonksiyonun kaçıncı dereceden olmasını istersen ezcel o dereceden fonksiyonu çıkarır
dedigini anladım ama datasheetteki degerlere hic ugramıyo kac tane denedım yine aynı cıkıs gerilimini veriyo(düsük olan) ama datasheetteki grafik 2.45 voltlardan bahsediyor.
adc hesaplamada söylediğim değişiklikleri yaptın mı
Alıntı yapılan: yasir - 25 Mayıs 2011, 22:24:04
sarıya gnd, kırmızı +5 vererek multimetre yardımıyla bir ölçüm yap istersen hocam. bağlantı şekli o şekilde de olabilir.
Kırmızı +5V
Sarı Çıkış
Siyah GND
Olmalıydı, eğer dediğiniz gibi yaptıysanız sensör bozulmuş olabilir
Kırmızı +5V
Sarı Çıkış
Siyah GND
Olmalıydı, eğer dediğiniz gibi yaptıysanız sensör bozulmuş olabilir
[/quote]
bu genel format zaten.. bazı sharplardaki bağlantı şekli dediğim şekilde de olabiliyor. 2ya021(kodundan tam emin değilim)de öyle mesela. belki bu modelde de böyle bi saçmalık vardır diye düşünerek söylemiştim. bu arada daha önce çok kez ters veya yalnış voltaj verdiğim oldu sharplara. hala bi sharp bozmuş değilim.
yinede olmuyor... eger ben bu gelen voltajı opamp yardımıyla yükseltsem cok dalgalanmalar olur mu?
Alıntı yapılan: Tagli - 25 Mayıs 2011, 22:04:57
Bence sensör bozuk. Son olarak sensöre yakın bir yerde beslemeler arasına 10 - 20 uF gibi bir kapasitör koy. Datasheet'te öyle yazıyordu diye hatırlıyorum ama bundan da pek umutlu değilim.
bu dedigini yaptıktan sonra 0.5-1.8V arası cıkıs alıyorum artık teşekkür ederim ama bu sefer de 60 cm den sonra sadece 0.01 V degisiyo simdi de bu sorunu halletmem gerekiyor
Alıntı yapılan: jackal183 - 25 Mayıs 2011, 23:00:05
adc hesaplamada söylediğim değişiklikleri yaptın mı
adım büyüklügünü degistirdim dedigin gibi programdaki sorun cözüldü gibi, board üzerine kurdugumda calısmıyordu(programda lcd var ama ben board üzerinde kullanmıyordum) programdan lcdyi kaldırınca adc okuyup led yaktıran bir program yazdım calıstırdı 0.50 lik degerleri pic algılayabildi
değişim 0.01 volt ise adc çzönürlüğünü artır, 16 bit yap ya da daha önce söylediğim ref+ ve ref- gerilimleri harici olarak kendin ver
aynen öyle yapmam gerekiyor cok tesekkür ederim
ancak aklında bulunsun 16 bit yapmak tek başına çzöüm olamaybilir, 16 bit yaptığın zaman filtre eklemen gerekebilir
isiste o devre calıstı ama bu sefer de lcd yi calıstımadım :'( 2*16 lcd 16 bacaklı, simulasyondaki degerlerin aynısını girdim yanı bacakları bagladım calısmadı besleme gerilimi 5v deiil mi acaba orada mı yanılıyorum acm1602KA
boarda kurmanın kotu yanı temassızlık cok oluyor lcd de calıstı tesekkür ederm ilgine...
kullandığınız pic de adc 16 bit olmaz. max 10 bit.
arkadaslar hepinize tesekkür ediyorun hersey yoluna girdi ilginize tesekkürler
Sorunu nasıl çözdün?
kondansatoru 100nf bagladım gerilim deger aralıkları duzelti 0.01 degil daha yuksek sekilde oldu