Haberler:

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

Ana Menü

ccs c adc ortalama alma sorunu

Başlatan WrtM, 07 Eylül 2013, 10:36:25

WrtM

 Merhaba arkadaşlar ısı sensörü okuyup 7 segment ekranda göstermek istiyorum herşey güzel çalışıyor ancak ekrandaki yazılar çok sık değişiyor (birler ve onlar hanesi) bende ortalamasını almayı denedim ancak buda işe yaramadı ortalama alma kodları aşağıda yardım ederseni sevinirim.


               for(fr=0;fr<=9;fr++)  //süslü parantezler arasında 10kez döngü olacak
               {
               set_adc_channel(3);
               delay_us(10);
               deg=read_adc();
               count=count+deg;     // her döngü sonrası okunan değer count değişkenine aktarılıp toplanıyor
               }

               i=count/10;   //    toplanan örnekler alınan örnek sayısına bölünüyor ekranda gösterilecek değer i

esensoy

aynı kanaldan okuyorsan sürekli kanal seçtirmene gerek yok, döngüye girmeden kanal seçtir, beklemeyi ver, sonra döngüde sırayla okursun,
öte yandan adc girişinde parazit olabilir, o sebepten farklı sayılar alabiliyor olabilirsin,
çözüm önerisi;
10 ölçüm aldın, büyükten küçüğe ya da küçükten büyüğe sırala,
en büyük ve en küçük n tane sayıyı at, kalanın ortalamasını al,
yazılımsal filtre yapmış oldun,

farklı yazılım filtreleri de denenebilir, mesela kalman filtresi

donanım filtresi de eklenebilir gerekirse, rc filtre veya aktif opamplı bir filtre ihtiyaca göre eklenebilir,


ps:ben ccs üzerinde adc okurken mutlaka adc interruptını kurarak okuma yaptırıyorum,
yani adc çevrim işlemi bittiğinde değişkene aktarıyorum, dolayısıyla işlem yarıdayken okuma yapıp yanlış değeri almamış oluyorum
En tehlikeli an "zafer" anıdır.

sadogan

Alıntı yapılan: WrtM - 07 Eylül 2013, 10:36:25
Merhaba arkadaşlar ısı sensörü okuyup 7 segment ekranda göstermek istiyorum herşey güzel çalışıyor ancak ekrandaki yazılar çok sık değişiyor (birler ve onlar hanesi) bende ortalamasını almayı denedim ancak buda işe yaramadı ortalama alma kodları aşağıda yardım ederseni sevinirim.


               for(fr=0;fr<=9;fr++)  //süslü parantezler arasında 10kez döngü olacak
               {
               set_adc_channel(3);
               delay_us(10);
               deg=read_adc();
               count=count+deg;     // her döngü sonrası okunan değer count değişkenine aktarılıp toplanıyor
               }

               i=count/10;   //    toplanan örnekler alınan örnek sayısına bölünüyor ekranda gösterilecek değer i
Ortalama alırken her 2 örnek arasında zaman farkı olsun.
örneğin 1sn boyunca 100 örnek alabilirsiniz. Buda 2 örnek arasında 10ms demek.
Ayrıca donanım olarakta önlemler alınabilir. adc önüne RC filitre , ısı sönsörü beslemesi ni gürültüden arındırmak gibi.

ofk58

ısı sensorunun data ıle gnd arasına 10uf kondansator koyulursa gerılım degısımı azalabılır

WrtM

@esensoy hocam haklısınız kanal seçtirmeyi döngünün dışına çıkardım böylesi daha mantıklı ilginç olan nokta şu ortalama almadan direk okutduğumda değişimler az da olsa azalıyor.

esensoy

#5
count u int olarak tanımlamadın umarım,
adc 8 bit ise 255 * 10 eşit 2550 min 16 bit yani word tanımlamalısın ki sorun olmasın,
adc 10 bit ise 1024 * 10 eşit 10240  yine 16 bit kurtarır
En tehlikeli an "zafer" anıdır.

WrtM

uyarı için sağolun hocam başta o hatayı yaptım ancak sonra düzeltdim.