girilen son 36 değeri göstermek ve ortalamasını almak

Başlatan ei, 26 Haziran 2015, 17:39:32

ei

Merhaba,
Bir Geiger Müller sayacı yaptım. COUNTER komutu ile 3600ms darbe sayıp ekrana CPM (Count per minute) olarak yazdırıyorum. Bu sistemde, ancak dakikalar içinde veri güncelleniyor. Bunun yerine, 100ms'lik aralıklarla 36 saydırma yaptırıp toplamını almak istiyorum. Bu arda devamlılığı sağlamak üzere şöyle bir düşünce var kafamda:
1) 100ms'lik zaman aralıkları ile saymaya başla, bir sayacı 0'dan başlat, her bir ölçüm sonucunu bir önceki ile topla
2) Sayaç 35'e gelince ölçüm sonuçlarının toplamını ekranda yazdır.
3) Bundan sonra, 36. ölçümde, 1. ölçümü sil, 37. ölçümde 2. ölçümü sil ... diyerek dinamik bir şekilde 36 ölçüm toplamını güncelle
Belirttiğim 3. adım için nasıl bir yol izlemeliyim?

boreas

Ölçüm değerine göre 8 (byte) ya da 16 (word) array değişken tanımla ölçümdeki counter'ı 1den 36ya gideni arrayde, array sıra değeri olarak ver yani deger[0] = xx, deger[1] = yy gibi eğer ki counter 36'ı geçiyorsa counter değerini mod 36 yap her 36'de değer sıfırlansın. Yani modülüs komutunu kullan.
cnt = count // 36; deger[cnt] = XX gibi

skara1214

seninki bildigin moving avarage filter.36 elemanlı ADC filtresi yaptığını varsayıyorum sen kendine göre değiştir
unsigned int32 toplam=0,sonuc=0;
unsigned int16 filtre[36],dummy=0;
int8 i=0;
for(i=0;i<=35;i++)// ilkönce filtreyi doldurman gerekiyor
{
filtre[i]=read_adc();
toplam+=filtre[i];
delay_ms(100);
}
i=0;
while(1)
{
dummy=read_adc();
toplam-=filtre[i];
toplam+=dummy;
filtre[i]=dummy;
i++;
if(i==36)
i=0;
sonuc=toplam/36;
printf("%lu",sonuc);
}
Herkes ölür ama herkes gerçekten yaşamaz

ei


diot

Alıntı yapılan: ei - 26 Haziran 2015, 17:39:32
Bir Geiger Müller sayacı yaptım. COUNTER komutu ile 3600ms darbe sayıp ekrana CPM (Count per minute) olarak yazdırıyorum.

3600 ms kaç dakika yapar , yada 1 dakika kaç ms yapar ?  Bir dakika 60000ms yapar 1000ms =1 sn X 60sn =60000ms
3600 ms nerden çıktı anlayamadım doğrusu.

ei

@diot
Dediğiniz doğru, 3600 değil, 60000. Basit biryazım hatası. Yazılımda 60000 kullanıldı.

diot

Yöntem zor değil.

1. adım indeksi 600 olan bir indeksli değişken açıyoruz.
2. adım sayıcıyı 0 lıyoruz.
3. adım 100ms sayım yapıp sonucu sayıcının sösterdiği indeksli değişkene atıyoruz
4. adım 0 dan 599 a kadar olan indeks li değişkeni topluyoruz.
5. adım sonucu ekrana yazıyoruz.
6. adım sayıcıyı 1 arrtırıp sonuc 600 den küçükse 3 . adıma gidiyoruz. 600 ise sayıcı=0 yapıp gene 3. adıma gidiyoruz.

Bu şekil gidilirse indeksli değişkende devamlı son 600 değer olacaktır.