Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: ugurer - 18 Şubat 2017, 10:38:59

Başlık: ADC verilerini sıralama
Gönderen: ugurer - 18 Şubat 2017, 10:38:59
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.
Başlık: Ynt: ADC verilerini sıralama
Gönderen: JKramer - 18 Şubat 2017, 11:43:38
Ö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 :).
Başlık: Ynt: ADC verilerini sıralama
Gönderen: fahri- - 18 Şubat 2017, 11:48:16
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);
}

Başlık: Ynt: ADC verilerini sıralama
Gönderen: Murat Mert - 18 Şubat 2017, 15:14:38
@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
Başlık: Ynt: ADC verilerini sıralama
Gönderen: ugurer - 18 Şubat 2017, 22:40:01
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.
Başlık: Ynt: ADC verilerini sıralama
Gönderen: AKAY989 - 01 Ekim 2020, 03:00:22
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);
}

Başlık: Ynt: ADC verilerini sıralama
Gönderen: AKAY989 - 01 Ekim 2020, 10:41:49
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
Başlık: Ynt: ADC verilerini sıralama
Gönderen: fahri- - 12 Ekim 2020, 09:31:39
accum/8

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

Başlık: Ynt: ADC verilerini sıralama
Gönderen: selimkoc - 12 Ekim 2020, 11:17:12
https://elektrokod.wordpress.com/2020/04/02/adc-filtreleme/ (https://elektrokod.wordpress.com/2020/04/02/adc-filtreleme/)