PIC 16F886 İLE GERİLİM ÖLÇÜMÜNDE 0.7V LUK SAPMA OLUYOR????

Başlatan artapon, 31 Ocak 2013, 23:14:57

artapon

Arkadaşlar pic16f886 ile gerilim ölçmeye çalışıyorum, ölçme işlemini yapıyorum ama 0.7V 'luk bir sapma oluyor(+0.7V fazla gösteriyor.)

Acaba problem nerde? Bi yardımcı olur musunuz?





#include <16f886.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

//***********Denetleyici konfigürasyon ayarları************
#device adc=10
#fuses INTRC_IO, NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)        // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor
#use fast_io(a) //Port yönlendirme komutları A portu için geçerli
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli


#define     display_1      pin_a5   // display_1 ifadesi pin_a0 ifadesine eşleniyor
#define     display_2      pin_a6   // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define     display_bilgi  output_b


   char  birler=0; 
   char  onlar=0;
   int16 sayac, rakam;
   int i;
   int16 adcsonuc, gerilim; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
   char modul_oku;

// Ortak ANOT display için veri değerleri
int digit[14]={40,   123,  28,    25,   75,    137,  136,  59,   8,    9,    223,   228,  192,   134};
//            [0,    1,    2,     3,    4,     5,    6,    7,    8,    9,     -,    L.    b.     F.]


      void ekran()
         {    
        if (sayac<=1023)
            {
               sayac++; rakam=0;
               output_high(display_2);  // 2. display aktif durumda
               display_bilgi(digit[birler]); // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_low(display_2);   // 2. display pasif durumda
               output_high(display_1);  // 1. display aktif durumda
               display_bilgi(digit[onlar]);  // displaye bilgi gönderiliyor
               delay_ms(5);             // gecikme veriliyor
               output_low(display_1);   // 1. display pasif durumda  
            }
            
    /***** Eğer 10 Sn boyunca Herhangi Bir Veri Akışı Olmazsa Displayler - Şeklinde Flip-Flop Yapacak*****/
                  else
                     {
                        if (rakam<=64)       //10 Saniye Süre içinde bir aktivite olmazsa Pic FF yapmaya Başlayacak.
                           {
                              rakam++;
                              output_high(display_1);  
                              output_low(display_2);   
                              display_bilgi(253);       //253= -
                              delay_ms(10);       
                           }
                  else
                        {
                        rakam++;
                        if (rakam==128)
                           {
                              rakam=0;
                           }
                              output_high(display_2);  
                              output_low(display_1);
                              display_bilgi(253);        // g segmenti FF yapacak
                              delay_ms(10);       
                        }
                     }
         }
         
         void gerilim_oku()

          {
               set_adc_channel(0);   // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
               delay_ms(1);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
               adcsonuc=read_adc(ADC_START_AND_READ);     // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

               gerilim=(0.0048828125*adcsonuc)*10; //gerilim=((adcsonuc*5)/1024)*10;// Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
               birler=gerilim%10;  // birler hanesi hesaplanıyor
               onlar=gerilim/10;   // onlar hanesi hesaplanıyor
               
               
               output_high(display_2);          // 2. display aktif durumda
               display_bilgi(digit[birler]);    // displaye bilgi gönderiliyor
               delay_ms(5);                     // gecikme veriliyor
               output_low(display_2);           // 2. display pasif durumda 
               output_high(display_1);          // 1. display aktif durumda
               display_bilgi(digit[onlar]);     // displaye bilgi gönderiliyor
               output_low(PIN_B3);              //nokta
               delay_ms(5);                     // gecikme veriliyor
               output_low(display_1);           // 1. display pasif durumda
               
         
            }
     
            
         
      /********* ANA PROGRAM FONKSİYONU********/

void main ()
   { 
      
      setup_adc_ports(sAN0|sAN3|VSS_VREF);   //AN3 Vref+, AN4 Analog Giriş, (VSS_VREF)VSS
      setup_adc(ADC_CLOCK_DIV_2);      //ADC clock frekansı Fadc=Fosc/2
      setup_oscillator(OSC_4MHZ|OSC_INTRC);
      setup_comparator(NC_NC_NC_NC);
      setup_spi(SPI_SS_DISABLED);
      setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
      setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
    
      
      
         set_tris_a(0x1F);    // A portu A0 ve A1 ÇIKIŞ Diğer uçlar GİRİŞ olarak yönlendiriliyor
         set_tris_b(0x00);    // B portu tümüyle ÇIKIŞ olarak yönlendiriliyor
         set_tris_c(0xFF);    // C portu tümüyle GİRİŞ olarak yönlendiriliyor
         
         
         display_bilgi(255);  // EKRANI TEMİZLE
         
         
         for(i=0;i<100;i++)
         {
         gerilim_oku();
         }
 
         // Modülden Data Oku Ve Porta Aktar.
          while(TRUE)
          {
               
                  modul_oku = 0b00000001+(input(pin_C7)*0b10000000)+(input(pin_C6)*0b01000000)+(input(pin_C5)*0b00100000)+(input(pin_C4)*0b00010000)+(input(pin_C3)*0b00001000)+(input(pin_C2)*0b00000100)+(input(pin_C1)*0b00000010)+(input(pin_C0)*0b0000001);
                  delay_ms(1);
                  
                  
                  birler=modul_oku%10;  // birler hanesi hesaplanıyor
                  onlar=modul_oku/10;   // onlar hanesi hesaplanıyor
                  ekran();
                  sayac=0;
                  
 /******************* Düşük Batarya Kontrol Birimi***************************/
           if(!input(PIN_A4)) 
               {
               while (!input(PIN_A4))
                  { 
                  sayac=0;
                  if (sayac<=1023)
                     { 
                     sayac++;
                     rakam=0;
                     output_high(display_2); 
                     output_b(192);   // ekrana b. yaz
                     delay_ms(5);            
                     output_low(display_2);  
                     output_high(display_1); 
                     output_b(228);   // ekrana L. yaz
                     delay_ms(5);          
                     output_low(display_1);
                     }
                  }
               }
               
            }
          
          
         }// ana döngü sonu.
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

sadogan

selam,
Kullandigin işlemcinin adc si 10 bit.
Dışardan uyguladıgın referans ise 2.5 volt
gerilim=(0.0048828125*adcsonuc)*10;

0.0048828125 katsayısı 5 volt referans için
2.5 volt icn 2500/1024 mv olmalı
gerilim ve adcsonuç değişkenlerin 16bitlk değişkenler ama siz floating point
hesaplama yapıyorsunz.
hızlıca baktığımda gördüğüm hatalar bunlar
hesap satırını şu şekilde değiştirin.
gerilim=(float)(2.4414*adcsonuc);

Sonuc mili volt cinsinden

mustafa_cmbz

referans beslemesini kart beslemesinden alyorsanız röle vs. varsa devrede bunlardan dolayı dalgalanmalar olabilir...adc girişlerine 100nf atabilirsiniz beslemelere de 100n olması çok iyi olur..

artapon

Alıntı yapılan: mustafa_cmbz - 01 Şubat 2013, 00:51:38
referans beslemesini kart beslemesinden alyorsanız röle vs. varsa devrede bunlardan dolayı dalgalanmalar olabilir...adc girişlerine 100nf atabilirsiniz beslemelere de 100n olması çok iyi olur..
Selam A. Hocam:
devrede pic beslemesine ve ana beslemeye paralel 100nf kondansatörler var, ayrıca devrese salınım yapacak herhangi birşey yok. röle switch vb.:(


Alıntı yapılan: sadogan - 01 Şubat 2013, 00:14:07
selam,
Kullandigin işlemcinin adc si 10 bit.
Dışardan uyguladıgın referans ise 2.5 volt
gerilim=(0.0048828125*adcsonuc)*10;

0.0048828125 katsayısı 5 volt referans için
A.selam hocam...
ewet hocam verdiğim referans değeri 5V için. bunu bilinçli olarak yaptım çünkü 5V için yapmasaydım max2.5V ölçebilirdim. ve tabii ki min:yine 2.5Völçebilirdim.

Alıntı yapılan: sadogan - 01 Şubat 2013, 00:14:07

2.5 volt icn 2500/1024 mv olmalı
gerilim ve adcsonuç değişkenlerin 16bitlk değişkenler ama siz floating point
hesaplama yapıyorsunz.
hızlıca baktığımda gördüğüm hatalar bunlar
hesap satırını şu şekilde değiştirin.
gerilim=(float)(2.4414*adcsonuc);

Sonuc mili volt cinsinden

yinede dediğiniz değişiklikleri yaptım ama pek bir işe yaramadı...:( problem nerde anlamıyorum.
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

gnc

hocam zener diyottan  kaynaklanıyor olabilir?
pin girişine sabit bir gerilim vererek ölçmeyi dener misin ?
diyotların üzerinde 0.7 yada 0.3 voltluk bir gerilim ölçebilirz

mehmet

1N4370 2,4V zener. Tam 2,5V isteniyorsa eğer;
TL431, LT1004-2.5 gibi referans malzemesi
kullanmanız gerekli...

Saygılar...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

Maxim

yukarıda arkadaş bahsetmiş ama nedendir bilinmez iletişimde hatlar koptu sanırım

siz 4 volt ölçeceksiniz değilmi ? ben öyle görüyorum,
4 voltluk bir pil var ve 2 tane gerilim bölücü direnç ile picin AN0 girişine girilmiş
buraya kadar tamammı ?

birde gene bu beslemeden 1k direnç + zener ile adc için referans voltajı alınmış
bu da doğru heralde

son olarak birde pic işlemci için +5 volt bir besleme var, şemada gözükmeyen..
doğrumu ?

öncelikle eğer buraya kadar yanlış anlamadıysam neden böyle yaptınız ? bir açıklarmısınız ?

olması gereken:
1- pil + ucuna seri bir 10k direnç ile picin an0 girişine
pic an0 girişi ile şase arasına 100nf
(2 adet 4k7 direnç iptal)

2-o neden koyulduğunu anlamadığım 2.5volt referans alınmaya çalışılmış olan 1k ve zener komple iptal..

3-picin adc ayarlarındaki (adcon1) referans uçlarını vss-vdd pic besleme ayaklarına veriyoruz.
yani referansımız 5volt oluyor

4- ve an0 girişinden 10bit analog ölçümü yapıp ekrana veriyoruz

*beslemenin tam 5.0 volt olduğunu var sayıyoruz.

artapon

Alıntı yapılan: Maxim - 03 Şubat 2013, 09:27:12
yukarıda arkadaş bahsetmiş ama nedendir bilinmez iletişimde hatlar koptu sanırım

siz 4 volt ölçeceksiniz değilmi ? ben öyle görüyorum,
4 voltluk bir pil var ve 2 tane gerilim bölücü direnç ile picin AN0 girişine girilmiş
buraya kadar tamammı ?

birde gene bu beslemeden 1k direnç + zener ile adc için referans voltajı alınmış
bu da doğru heralde

son olarak birde pic işlemci için +5 volt bir besleme var, şemada gözükmeyen..
doğrumu ?

öncelikle eğer buraya kadar yanlış anlamadıysam neden böyle yaptınız ? bir açıklarmısınız ?

olması gereken:
1- pil + ucuna seri bir 10k direnç ile picin an0 girişine
pic an0 girişi ile şase arasına 100nf
(2 adet 4k7 direnç iptal)

2-o neden koyulduğunu anlamadığım 2.5volt referans alınmaya çalışılmış olan 1k ve zener komple iptal..

3-picin adc ayarlarındaki (adcon1) referans uçlarını vss-vdd pic besleme ayaklarına veriyoruz.
yani referansımız 5volt oluyor

4- ve an0 girişinden 10bit analog ölçümü yapıp ekrana veriyoruz

*beslemenin tam 5.0 volt olduğunu var sayıyoruz.

Maxim Hocam cevap için Teşekkürler:

benim beslemem aslında 5V değil. pil aynı zamanda devrenin de beslemesi. Ve pil değeri zamanla değiştiği için referans alamam... bu nedenle zener diyot ile sabit 5V referans gerilimi verdim.

Alıntı yapılan: mehmet - 03 Şubat 2013, 02:50:38
1N4370 2,4V zener. Tam 2,5V isteniyorsa eğer;
TL431, LT1004-2.5 gibi referans malzemesi
kullanmanız gerekli...

Saygılar...

Mehmet Hocam Cevap için Teşekkürler:

ayrıca zener diyotun değerini 2.5V olarak değiştirdim. hem ayrıca 2.4V ile 2.5V arasında çok büyük bir fark yok. en azında 0.7 V olacak kadar bir fark olmaz heralde değil mi hocam?
Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

Maxim

adam gibi birşey olsun istiyorsanız 2.5 volt TL431 kullanmanız lazım
zenerle falan olmaz o iş

pwm.c

proteustan kaynaklı bir sorun olabilir.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-