pic adc girisi

Başlatan electricman, 24 Mayıs 2011, 19:31:11

electricman

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ı :(

Maxim

verdiğin detay kadar ancak şöyle cevap verilebilir
"hata sende"

electricman

yani picin boyle bir sınırı yok tesekkur ederim hemen gözden gecireyim devremi

VFR

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.

electricman

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]

#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);
    
    }
    }
   }
   
}

emin1

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.

electricman

problem o degil onun cıkısını kontrol ettım dedigim gibi 0.45 volt cıkıs veriyor sharp GP2D12

yasir

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.

electricman

yukarıda soyledıgım sensör, sensörde problemim yok bu degerleri zaten ölcerek size söyledim

Tagli

Şimdi internetten baktım da, o sensörün mesafeye göre 0.45 - 2.45 volt aralığında bir çıkış vermesi gerekiyor. Burada bir grafik var. Öncelikle buradaki değerlerin yaklaşık olarak tutup tutmadığını kontrol et.
Gökçe Tağlıoğlu

electricman

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

jackal183

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 :)

Tagli

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.
Gökçe Tağlıoğlu

jackal183

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 :)

yasir

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.