ADC Yüzdelik Çevrim Sorunu

Başlatan omersn, 17 Ağustos 2015, 23:50:59

omersn

Merhabalar
ADC den okuduğum 1.3 ile 3.8 arası voltaj değerini yüzdelik olarak 7 segment displayde (0-99 arası olarak) göstermek istiyorum. ADC'nin referans değerlerini 1.3 volt ile 3.8 volt olarak belirledim. 1.3 volt ile 3.8 volt arasındaki değerlerin desimal olarak değerleri 0-1023 arası olarak çevrileceğinden yüzdelik çevirme hesabını yuzde=(Çevrilen Desimal Değer x 100)/1024 şeklinde yaptım. Program  2.90  volt değerine kadar yani %63' e kadar doğru çalışıyor fakat 2.95 volt değerinde yüzdelik sıfırlanıyor ve  displayde %01 değeri görünüyor.  ADC ye gelen voltaj değerini 3.8 kadar yükseltmeye devam ettiğimde %01 den artmaya devam ediyor 3.8 volt değerinde %35 değerine ulaşıyor.  Yuzdelik değerini direkt olarak displayde gösteremediğim için integer değere çeviriyorum. Acaba bu problemin sebebi nedir? çevirmelerde veya veri değişkenlerinde mi yanlışlık yapıyorum yoksa farklı bir hata mı var?

#include <16f877a.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)
unsigned long int A;
long t=0, s=0;
float volt=0, yuzde=0;
char birler=0, onlar=0;
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
#define   display_1   pin_d0    
#define   display_2   pin_d1     

void goster(){
birler=s%10;     
onlar=s/10;  
														                   
output_low(display_2); 
output_b(digit[birler]); 
delay_ms(5);               
output_high(display_2);
output_low(display_1); 
output_b(digit[onlar]);  
delay_ms(5);             
output_high(display_1);
}

void main()
{
set_tris_a(0b00000001);
set_tris_b(0);
set_tris_d(0);
output_a(0);
output_b(0);
output_d(0);
setup_adc(adc_clock_div_32);
setup_adc_ports(AN0_VREF_VREF);
set_adc_channel(0);
delay_us(20);
output_high(display_1);      
output_high(display_2);      

while(1)
 {
A=read_adc();
volt=1.3+(0.00244140625*A);
yuzde=(A*100)/1024;
s=(int)yuzde;
goster();
 }
}
     

sadogan

ADC nin referans değerini 1.3 v 3.8 volt olarak nasıl berirledin.
-vref e 1.3 volt +vref 3.8 voltmu verdin ?

tekosis

yuzde kayıtçısını unsigned int32 olarak tanımlar mısın? sonra ne olduğunu inceleyelim.

birde s kayıtçısını aradan çıkar s ile yaptıklarını direk yuzde üzerinden yap.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

omersn

#3
Alıntı yapılan: sadogan - 18 Ağustos 2015, 00:24:13
ADC nin referans değerini 1.3 v 3.8 volt olarak nasıl berirledin.
-vref e 1.3 volt +vref 3.8 voltmu verdin ?

Evet o şekilde yaptım

mesaj birleştirme:: 18 Ağustos 2015, 13:47:27

Alıntı yapılan: tekosis - 18 Ağustos 2015, 01:32:06
yuzde kayıtçısını unsigned int32 olarak tanımlar mısın? sonra ne olduğunu inceleyelim.

birde s kayıtçısını aradan çıkar s ile yaptıklarını direk yuzde üzerinden yap.

Hocam dediğin şekilde tanımladım s kayıtçısını da aradan çıkardım ama problem aynı bir değişme yok malesef

sadogan

1.3 vol ile 3.8 volt arasındaki değeri 3.8-1.3 aralığının yüzde kaçı olduğunu bulmak için
adc degerini 10.24 bölmek yeterli.

z

yuzde=(A*100)/1024;

yerine

yuzde=A/10.24; dene. Bakalım sonuç değişecekmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

omersn

sadogan hocam ve z hocam teşekkürler  dediğiniz gibi A değerini 10.24 e bölünce problem çözüldü.
demek ki bazı matematik işlemlerini bizim yapmamız gerekiyormuş  :)
peki neden önceki formülde bu hata ortaya çıktı ?

z

A, 0..1024 aralığında değişir.

Bunu 100 ile çarparsan 102400 gibi bir sayı ortaya çıkar ve senin kullandığın float değişkene sığmaz görünüyor.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

omersn


Klein

Alıntı yapılan: omersn - 18 Ağustos 2015, 14:11:22
sadogan hocam ve z hocam teşekkürler  dediğiniz gibi A değerini 10.24 e bölünce problem çözüldü.
demek ki bazı matematik işlemlerini bizim yapmamız gerekiyormuş  :)
peki neden önceki formülde bu hata ortaya çıktı ?
float işlemler yaparken eşitliğin karşısındaki değerlerin float olduğunun kesin bir şekilde bildirilnmesi gerek. aksi durumda değerler int olarak yapılıp çıkan sonuç float değişkene aktarılır.

yuzde = (A*100f)/1024f
veya
yuzde = (A*100.0)/1024.0 

omersn

Bilgi için teşekkürler Klein hocam haklısın belirttiğin gibi sayıları float olarak yazdığımızda yuzde=(A*100.0)/1024.0 işlemini yapıyor ve çalışıyor.