önce nasıl anlatabilirim onu düşünüyorum.
bir voltaj okuması yapacağız, o kolay
diyelim analog girişimize 15 volt verdik tak lcd ekranda 15.0 volt çıktı
(tabi gerekli gerilim bölücüler, kondansatörler var)
şöyle bir şeyi nasıl yaparız? algoritma nasıl olmalı?
girişe 15 volt verince ekranda 0.0 yazıyor ya, oradaki değerimiz yavaş yavaş yukarıya doğru çıksın?
mesela 0 dan 15 e gelmesi 3 saniye sürsün
yada şöyle anlatayım
ibreli voltmetre düşünün, girişine 15 volt verince ibre yavaş yavaş sağa doğru yükselsin
tak diye çıkmasın. (15 volt bir örnek elbette)
önce okuduğumuz değerleri bir yerde tutup arttırarakmı ekrana vermeli ne yapmalı?
Moving Average yaparsanız istediğiniz olur. Moving average boyutu ile sample hızı sizin yükseliş hızınızı belirler.
Merhabalar
median filter kullanın ve fonksiyon parametrelerinde örnekleme zamanını ve örnekleme katarını yükseltin
https://github.com/binarymaker/moving-median-filter
https://kiritchatterjee.wordpress.com/2014/11/10/a-simple-digital-low-pass-filter-in-c/
float dizi[100];
int i;
int sayac;
int32 sum;
for (i=0;i<100;i++)
{
dizi[i]=0;
}
while(1)
{
i++;
if (i>=100)
{i=0;}
dizi[i]=read_adc(0);
sum=0;
for (sayac=0;sayac<100;sayac++)
{
sum+=dizi[sayac];
}
result=sum/100;
}
Alıntı yapılan: Maxim - 29 Mart 2022, 16:36:21önce nasıl anlatabilirim onu düşünüyorum.
bir voltaj okuması yapacağız, o kolay
diyelim analog girişimize 15 volt verdik tak lcd ekranda 15.0 volt çıktı
(tabi gerekli gerilim bölücüler, kondansatörler var)
şöyle bir şeyi nasıl yaparız? algoritma nasıl olmalı?
girişe 15 volt verince ekranda 0.0 yazıyor ya, oradaki değerimiz yavaş yavaş yukarıya doğru çıksın?
mesela 0 dan 15 e gelmesi 3 saniye sürsün
yada şöyle anlatayım
ibreli voltmetre düşünün, girişine 15 volt verince ibre yavaş yavaş sağa doğru yükselsin
tak diye çıkmasın. (15 volt bir örnek elbette)
önce okuduğumuz değerleri bir yerde tutup arttırarakmı ekrana vermeli ne yapmalı?
ADC girişini okuması için bir TIMER koyun, her TIMER da ANALOG girişi okuyarak LCD ye yazsın.
önce okunan değerin %80i ile sonra okunan değerin %10 unu toplayın.
oranları değiştirebilirsiniz.
2 türlü yapabilirsin. İlk olarak yazılımsal bir filtreleme şart. Sabit gerilim olsa bile okunan değer oynak olur. Ya adc bit derinliğini yüksek tutup yüksek değerlileri alıp basamak değerini düşürürsün ya ortalama alırsın vs. 2 kademede de okunacak değeri gerekiyorsa bir diyot üzerinden rc devresine uygularsın oradan yavaş yükselir ama düşerken de yavaş düşer.
Alıntı yapılan: eti - 29 Mart 2022, 22:36:01önce okunan değerin %80i ile sonra okunan değerin %10 unu toplayın.
oranları değiştirebilirsiniz.
bu yöntem güzel,,, fakat oranların toplamı 1 olmalı. %80 ise diğeri %20.
Erol abi şöyle %80 ile %10 toplayıp 2 ile çarpıp beşe böleceksin. Sonuç 1947 ise 13 çıkar değilse 45 ekle en sonunda bulduğun rakamın son iki hanesi rastgele bir sayı olur. Onu da bir yerlerde gösteririz.
Alıntı yapılan: Erol YILMAZ - 30 Mart 2022, 11:39:46bu yöntem güzel,,, fakat oranların toplamı 1 olmalı. %80 ise diğeri %20.
Bu yöntem dijital RC filtre aslında. Oran korunarak değerler 1yeni+99eski/100, 1yeni+199eski/200 gibi de kullanılabilir.
Bu filtrenin dezavantajı son değere hiç bir zaman ulaşamıyor. Örneğin sinyal 15V a ulaştığında bunun çıkışı 14.999... veya sıfıra düştüğünde 0.00011... gibi kalıyor. artış azalış küçüldükçe, bölüm sonuçları sonsuz küöülmeye doğru gidiyor.
100 örnek değil de 10-20 örnekle sonuç hızlandırılabilir.
Ekrana yazdırılacak sonuç voltajı bir procedure içinde örneğin 5,4,3 ve 2 ye böldürüp herbirini en küçük değerden başlayıp örneğin 0,5 saniye gösterilip sonra sonuç prosedurüne gönderilir
Tabiki bu arada sırada ölçüm yapmak gibi bir uygulama için uygun olur herhalde.Eğer sistemde devamlı düşük değerden yukarıya çıkan voltajı gösterecekse pek anlamlı olmayabilir.
..gelen voltaj nasıl değişip geliyor bilmiyorum ama,
diyelim 15 volt geldi ve okundu..sonra 0 dan 15 kadar olan sayıları sırayla ekranda yazsak..
sonra tekrar okunsa..
soruyu anlamadım mı yoksa..?
Beyler, hepinize ayrı ayrı teşekkür ediyorum.
yazdıklarınızın tamamını harfi harfine not aldım
üzerinde çalışıyorum
genelde moving filter tavsiye edildi
araştırmalarım sonrasında median filter sanki 1 tık daha iyi gibi duruyor
şu an hangi yöntem daha uygun belli değil
sağolun
Alıntı yapılan: Maxim - 05 Nisan 2022, 08:59:15Beyler, hepinize ayrı ayrı teşekkür ediyorum.
yazdıklarınızın tamamını harfi harfine not aldım
üzerinde çalışıyorum
genelde moving filter tavsiye edildi
araştırmalarım sonrasında median filter sanki 1 tık daha iyi gibi duruyor
şu an hangi yöntem daha uygun belli değil
sağolun
merhabalar
Filtreler için parametreler aynı olduğunu varsayarsak. Eğer okumalarda istenmeyen değişimler oluyorsa (adc vb.) moving median filtre kullanarak okumayı stabilleştirir ama değişimler yavaş artmaz hızlı yansır. Moving Average filtre kullanırsanız değişimler yavaş yansır ama istenmeyen değişimlerden etkilenecektir.
Eger hatta parazit durumu olmuyor ise direk Moving Average filtresi kullanılabilinir. Parazit durumlarından kurtulmak için önce moving median filtresi sonra Moving Average filtresi kullanılabilinir.
Merhaba, internetten hazır bir kod sanırım bu işini görür.
Alıntı Yapgirişe 15 volt verince ekranda 0.0 yazıyor ya, oradaki değerimiz yavaş yavaş yukarıya doğru çıksın?
mesela 0 dan 15 e gelmesi 3 saniye sürsün
numReadings değişkeninin değerini arttırdıkça gereçek değere yaklaşma süresi uzar. Değer arttıkça denetleyici içindeki kaynak kullanımıda artacaktır. Dilersen araya beklemede koyabilirsin.
const int numReadings = 10;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;
int inputPin = A0;
void setup() {
// initialize serial communication with computer:
Serial.begin(9600);
// initialize all the readings to 0:
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
}
void loop() {
// subtract the last reading:
total = total - readings[readIndex];
// read from the sensor:
readings[readIndex] = analogRead(inputPin);
// add the reading to the total:
total = total + readings[readIndex];
// advance to the next position in the array:
readIndex = readIndex + 1;
// if we're at the end of the array...
if (readIndex >= numReadings) {
// ...wrap around to the beginning:
readIndex = 0;
}
// calculate the average:
average = total / numReadings;
// send it to the computer as ASCII digits
Serial.println(average);
delay(1); // delay in between reads for stability
}