Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

ADC verilerini sıralama

Başlatan ugurer, 18 Şubat 2017, 10:38:59

ugurer

Merhabalar, öncelikle konuyu nereye açacağımı bilemedim umarım doğru yerdir. Şimdi load cell kullanarak elektronik ağırlık indükatörü yapmaya çalışıyorum. Proje iyi kötü belli bir aşamaya geldi fakat maalesef stabil bir ölçüm yapamıyorum. Yani örnek vermek gerekirse 500 gram koyduğumuzda değerde bir değişme olmuyor fakat 500,xx şeklinde gösterim yaptığımda xx kısmı sürekli değişiyor. Filtre olarak üçgen filtre kullanıyorum örnek sayısı da 5 ile 40 arasında değişiyor. Örneği çok fazla da artıramam çünkü hızlı ölçüm yapmam da gerekiyor. Bu yüzden aklıma sıralama algoritmaları geldi örneğin 20 örnek alıp en düşük 3 ve en yüksek 3 örneği silip geri kalanları üçgen filtreye sokmayı düşünüyorum. Ama sıralama algoritmalarından bubble'ı çalıştırabildim sadece istediğim gibi onda da geri dönüş problemi var. Shell ya da quick ile çalışmak istiyorum fakat bir türlü beceremedim onlarda hem sıralama yapıp hem de  kilo bilgisi üretmeyi. Kabaca şuan için yaptığım şu şekilde;
for(i=0;i<filtre;i++)// filtre değeri kadar okuma yap
kilo=ADC_Oku;
a[i]=kilo;
sırala(a);
kilo+=a[i];
kilo/=filtre;

Şimdi şöyle bir durum da var tüm okumaları yapıp sonra sıralama yapmam da beni çok yavaşlatır diye düşünüyorum özellikle örnek sayısı arttıkça sorun oluşturur bu durum. O yüzden sizce nasıl bir yol izleyebilirim ne yapmam lazım. Donanım konusunda da başka bir firmanın yapmış olduğu hex dosyası var orada gayet stabil çalışıyor sistem yani donanım kötü olabilir ama aşırı kötü değil.

JKramer

Önce ham veriye (adc değeri) bakmak lazım. Sonra, bunun kaç grama karşılık geldiğine bakıp ,xx değerine göre karşılaştırmak lazım. Bir de ölçümü neye göre kontrol ediyorsunuz? Ekranda görünen değerin gayet stabil olması gerçeği yansıtmayabilir :).

fahri-

Aşağıdaki kodu kendinize göre ayarlayıp kullanabilirsiniz.

int16 read_adc_ort8(int adc_ch, int delayms) {
unsigned int8 i;  
unsigned int16 accum=0;  
unsigned int16 s, b[16]; 
int1 didswap=1;
   set_adc_channel(adc_ch);    	
   delay_ms(1);
   for ( i = 0 ; i < 16;  i++ ) { 
           b[i]= read_adc(ADC_start_and_read);
           delay_ms(delayms);  
   } 
   while(didswap){            // bubble sort 
     didswap=0; 
     for (i=0; i<15; i++){    // i 0-15 
      if(b[(i)]>b[(i+1)]){    // if low element greater than next  -do  swap 
           s=b[i];            // hold upper 
           b[i]=b[(1+i)]; 
           b[(1+i)]=s; 
           didswap=1; 
      }                        
     }
    }

   for (i=4; i<12; i++){  accum +=b[i];  } 
   return(accum>>3);
}

Murat Mert

@fahri-  nin verdiği yazılımsal analog filitreli bir kod. Bunu anı klasöre adc_oku diye kaydet.
int16 adc_deg[8];
int i;
........
......
adc_deg[i]=adc_oku(i,1);

bu kadar
mert07

ugurer

#4
Teşekkürler yardımlarınız için şuan deneme şansım yok fakat pazartesi günü ilk iş deneyeceğim @fahri- @Murat Mert
@JKramer  tartım sistemlerinde taksimat diye bir olay var 1,2,5,10,20... şeklinde ilerliyor. Örneğin taksimat 5 ise son değer 5'in katları oluyor yani 505,500,495 gibi. Ölçülen değer hangisine yakınsa ona eşitleyip ekrana yazdırıyoruz.

AKAY989

son durumda filtrelenmiş integer accum mu oluyor? en son hangi değeri okuyacağız anlamadım bir türlü?
Alıntı yapılan: fahri- - 18 Şubat 2017, 11:48:16Aşağıdaki kodu kendinize göre ayarlayıp kullanabilirsiniz.

int16 read_adc_ort8(int adc_ch, int delayms) {
unsigned int8 i;  
unsigned int16 accum=0;  
unsigned int16 s, b[16]; 
int1 didswap=1;
   set_adc_channel(adc_ch);    	
   delay_ms(1);
   for ( i = 0 ; i < 16;  i++ ) { 
           b[i]= read_adc(ADC_start_and_read);
           delay_ms(delayms);  
   } 
   while(didswap){            // bubble sort 
     didswap=0; 
     for (i=0; i<15; i++){    // i 0-15 
      if(b[(i)]>b[(i+1)]){    // if low element greater than next  -do  swap 
           s=b[i];            // hold upper 
           b[i]=b[(1+i)]; 
           b[(1+i)]=s; 
           didswap=1; 
      }                        
     }
    }

   for (i=4; i<12; i++){  accum +=b[i];  } 
   return(accum>>3);
}

AKAY989

Alıntı yapılan: fahri- - 18 Şubat 2017, 11:48:16Aşağıdaki kodu kendinize göre ayarlayıp kullanabilirsiniz.

int16 read_adc_ort8(int adc_ch, int delayms) {
unsigned int8 i;  
unsigned int16 accum=0;  
unsigned int16 s, b[16]; 
int1 didswap=1;
   set_adc_channel(adc_ch);    	
   delay_ms(1);
   for ( i = 0 ; i < 16;  i++ ) { 
           b[i]= read_adc(ADC_start_and_read);
           delay_ms(delayms);  
   } 
   while(didswap){            // bubble sort 
     didswap=0; 
     for (i=0; i<15; i++){    // i 0-15 
      if(b[(i)]>b[(i+1)]){    // if low element greater than next  -do  swap 
           s=b[i];            // hold upper 
           b[i]=b[(1+i)]; 
           b[(1+i)]=s; 
           didswap=1; 
      }                        
     }
    }

   for (i=4; i<12; i++){  accum +=b[i];  } 
   return(accum>>3);
}

fahri abi selamlar bu örnekte filtrelenmiş final değeri hangisi oluyor accum mu? b mi? b mi anlamış değilim

fahri-

accum/8

accum>>3 demek accum=accum/8 demek.