İçindekiler:

Mikrodenetleyici Projeleriniz için Çalışan Ortalama: 6 Adım
Mikrodenetleyici Projeleriniz için Çalışan Ortalama: 6 Adım

Video: Mikrodenetleyici Projeleriniz için Çalışan Ortalama: 6 Adım

Video: Mikrodenetleyici Projeleriniz için Çalışan Ortalama: 6 Adım
Video: İlk defa teşekkür veya taktir alacağımı hayal etmiştim matematik yüzden bu asla olmayacak-jennie 2024, Kasım
Anonim
Mikrodenetleyici Projeleriniz için Çalışan Ortalama
Mikrodenetleyici Projeleriniz için Çalışan Ortalama

Bu talimatta, çalışan ortalamanın ne olduğunu ve bunu neden önemsemeniz gerektiğini açıklayacağım ve ayrıca maksimum hesaplama verimliliği için nasıl uygulanması gerektiğini göstereceğim (karmaşıklık konusunda endişelenmeyin, anlaşılması çok basit ve arduino projeleriniz için de kullanımı kolay bir kütüphane sağlayın:)

Hareketli ortalama, hareketli ortalama veya hareketli ortalama olarak da adlandırılan hareketli ortalama, veri serilerindeki son N değerlerinin ortalama değerini tanımlamak için kullanılan bir terimdir. Normal ortalama olarak hesaplanabilir veya kodunuzun performansı üzerinde minimum bir etkisi olması için bir numara kullanabilirsiniz.

Adım 1: Kullanım Durumu: ADC Ölçümlerini Düzeltme

Kullanım Durumu: ADC Ölçümlerini Düzeltme
Kullanım Durumu: ADC Ölçümlerini Düzeltme

Arduino'nun çok az gürültülü iyi bir 10 bit ADC'si var. Potansiyometre, fotodirenç veya diğer yüksek gürültülü bileşenler gibi bir sensörde değer ölçerken, ölçümün doğru olduğuna güvenmek zordur.

Çözümlerden biri, sensörünüzü her okumak istediğinizde birden fazla ölçüm yapmak ve bunların ortalamasını almaktır. Bazı durumlarda bu uygulanabilir bir çözümdür, ancak her zaman değil. ADC'yi saniyede 1000 kez okumak isteseydiniz, ortalama 10 ölçüm alsaydınız 10 000 yapmanız gerekirdi. Büyük bir hesaplama zamanı kaybı.

Önerdiğim çözüm, saniyede 1000 kez ölçüm yapmak, her seferinde ortalamayı güncellemek ve bunu mevcut değer olarak kullanmaktır. Bu yöntem biraz gecikme sağlar ancak uygulamanızın hesaplama karmaşıklığını azaltır ve size ek işlemler için çok daha fazla zaman tanır.

Yukarıdaki resimde son 32 ölçümün ortalamasını kullandım. Bu yöntemin %100 hatasız olmadığını, ancak doğruluğu önemli ölçüde geliştirdiğini göreceksiniz (her seferinde ortalama 32 örneğin alınmasından daha kötü değildir). Her seferinde ortalama 32 ölçüm hesaplamak isteseydiniz, yalnızca ölçümler için Arduino UNO'da bu 0.25 ms'den fazla sürer!

Adım 2: Kullanım Durumu: Mikrofon Sinyalinin DC Bileşenini Ölçme

Kullanım Durumu: Mikrofon Sinyalinin DC Bileşenini Ölçme
Kullanım Durumu: Mikrofon Sinyalinin DC Bileşenini Ölçme
Kullanım Durumu: Mikrofon Sinyalinin DC Bileşenini Ölçme
Kullanım Durumu: Mikrofon Sinyalinin DC Bileşenini Ölçme
Kullanım Durumu: Mikrofon Sinyalinin DC Bileşenini Ölçme
Kullanım Durumu: Mikrofon Sinyalinin DC Bileşenini Ölçme

Arduino, 0 ile Vcc (normalde 5 V) arasındaki voltajları ölçebilir. Ses sinyali tamamen AC'dir ve bir mikrodenetleyicide ölçmek istiyorsanız, 1/2 Vcc civarında yönlendirmeniz gerekir. Bir Arduino UNO projesinde bu, kabaca 2,5 V (DC) + ses sinyali (AC) anlamına gelir. 10 bit ADC ve 5 V güç kaynağı kullanırken, 2.5 V bias 512 ölçümüne eşit olmalıdır. Yani bir AC sinyali değeri elde etmek için ADC ölçümünden 512 çıkarılmalıdır ve bu kadar değil mi?

İdeal bir dünyada, bu doğru olurdu. Ne yazık ki gerçek hayat daha karmaşık ve sinyal yanlılığımız kayma eğilimi gösteriyor. Elektrik şebekesinden gelen 50 Hz gürültü (ABD'de yaşıyorsanız 60 Hz) çok yaygındır. Genellikle çok sorunlu değil ama var olduğunu bilmek güzel. Daha problemli olan ise bileşenlerin ısınmasından kaynaklanan doğrusal sapmadır. DC ofset düzeltmesini başlangıçta dikkatli bir şekilde ayarlarsınız ve uygulamanız çalışırken yavaş yavaş uzaklaşır.

Bu sorunu bir (müzik) vuruş dedektörü ile göstereceğim. Önyargı kaldırma işleminizi ayarladınız ve vuruşlar net (resim 2). Bir süre sonra, DC öngerilim hareketleri ve vuruşları mikrodenetleyici tarafından zar zor fark edilir (resim 3). Vuruş algılama algoritması, bu makalenin kapsamını aştığı için gelecekteki bir talimatta derinlemesine incelenecektir.

Neyse ki, sesin DC ofsetini sürekli olarak hesaplamanın bir yolu var. Bu talimatın konusu olan çalışan ortalamanın bir çözüm sağlaması şaşırtıcı olmayacaktır.

Herhangi bir AC sinyalinin ortalama değerinin 0 olduğunu biliyoruz. Bu bilgiyi kullanarak AC+DC sinyalinin ortalama değerinin bunun DC yanlılığı olduğunu çıkarabiliriz. Bunu kaldırmak için, son birkaç değerin çalışan ortalamasını alabilir ve mevcut ADC okumasından çıkarabiliriz. Yeterince uzun bir koşu ortalaması kullanmanız gerektiğini unutmayın. Ses için saniyenin onda biri (örnek sayısı örnekleme hızınıza bağlıdır) yeterli olmalıdır, ancak daha uzun ortalamaların daha iyi çalıştığını bilin. İlk resimde 1 kHz örnekleme hızında 64 elemanlı (önerdiğimden daha az ama yine de çalışıyor) çalışan ortalama ile gerçek DC sapma hesaplaması örneğini görebilirsiniz.

Adım 3: Hesaplama

Hesaplama
Hesaplama

Koşu ortalamasını, doktorun bekleme odasındaki insanların ortalama ağırlığı olarak düşünebilirsiniz. Doktor bir hastayı muayene etmeyi bitirir ve aynı anda yeni bir hasta bekleme odasına girer.

Bekleme odasında bekleyen tüm hastaların ortalama ağırlığını bulmak için hemşire her hastaya kilosunu sorabilir, bu sayıları toplayabilir ve hasta sayısına bölebilir. Doktor her yeni hasta kabul ettiğinde, hemşire tüm süreci tekrar ederdi.

“Bu kulağa pek verimli gelmiyor… Bunu yapmanın daha iyi bir yolu olmalı” diye düşünüyor olabilirsiniz. Ve haklı olurdun.

Bu süreci optimize etmek için hemşire, mevcut hasta grubunun toplam ağırlığının kaydını tutabilir. Doktor yeni hastayı çağırdığında, hemşire ona kilosunu sorar ve bunu grup toplamından çıkarır ve gitmesine izin verirdi. Hemşire daha sonra bekleme odasına yeni giren hastaya kilosunu sorar ve toplama eklerdi. Her vardiyadan sonra hastaların ortalama ağırlığı, hasta sayısına bölünen ağırlıkların toplamı olacaktır (evet, eskisi gibi ama şimdi hemşire hepsi yerine sadece iki kişiye kilolarını sordu). Bu paragrafın biraz kafa karıştırıcı olabileceğinin farkındayım, bu yüzden lütfen daha fazla netlik için yukarıdaki resme bakın (veya yorumlarda sorular sorun).

Ancak son paragrafı kafa karıştırıcı bulmasanız bile, başlangıçta akümülatörde ne olmalı, az önce okuduklarımı gerçek bir C koduna nasıl koyabilirim gibi sorularınız olabilir. Bu, kaynak kodumu da alacağınız bir sonraki adımda ele alınacaktır.

Adım 4: Kod

kod
kod

Çalışan ortalamayı hesaplamak için önce son N değerini saklamanın bir yoluna ihtiyacınız var. N elemanlı bir diziye sahip olabilir ve her eleman eklediğinizde tüm içeriği bir yere taşıyabilirsiniz (lütfen bunu yapmayın) veya eski bir elemanın üzerine yazabilir ve işaretçiyi atılacak bir sonraki elemana ayarlayabilirsiniz (lütfen bunu yapın):)

Akümülatör 0 olarak başlatılmalıdır, gecikme satırındaki tüm öğeler için aynı şey geçerlidir. Diğer durumda, koşu ortalamanız her zaman yanlış olacaktır. DelayLine_init'in gecikme hattının başlatılmasıyla ilgilendiğini göreceksiniz, akümülatörle kendiniz ilgilenmelisiniz.

gecikme satırına bir eleman eklemek, en yeni elemanın indeksini 1 azaltmak kadar kolaydır, bu da gecikme satırı dizisinin tarafını göstermediğinden emin olur. 0 olduğunda dizini azalttıktan sonra, 255'e döner (8 bitlik işaretsiz bir tam sayı olduğu için). Modulo (%) operatörü, gecikme satırı dizisi boyutuna sahip dizinin geçerli bir öğeye işaret etmesini sağlayacaktır.

Önceki adımda yaptığım benzetmeyi takip ettiyseniz, çalışan bir ortalamayı hesaplamak kolay olacaktır. Akümülatörden en eski elemanı çıkarın, akümülatöre en yeni değeri ekleyin, en yeni değeri gecikme satırına itin, akümülatörü eleman sayısına bölerek döndürün.

Kolay değil mi?

Tüm bunların nasıl çalıştığını daha iyi anlamak için lütfen ekteki kodu kullanarak deneme yapmaktan çekinmeyin. Şu anda olduğu gibi, arduino analog pin A0 üzerindeki analog değeri okur ve 115200 baud hızında seri portta "[ADC değeri], [çalışan ortalama]" yazdırır. Arduino'nun seri çizicisini doğru baud hızında açarsanız, iki satır göreceksiniz: ADC değeri (mavi) ve düzleştirilmiş değer (kırmızı).

Adım 5: Ekstralar

Ekstralar
Ekstralar

Projenizde koşu ortalamasını kullanmak için mutlaka bilmeniz gerekmeyen birkaç şey var, bilmekten zarar gelmez.

gecikme: Bu adımın gösterimi hakkında konuşmaya başlayacağım. Daha fazla öğenin çalışan ortalamasının daha büyük gecikmeye neden olduğunu fark edeceksiniz. Değerin değişmesi için yanıt süreniz kritikse, daha kısa çalışma ortalamasını kullanmak veya örnekleme hızını artırmak (daha sık ölçün) isteyebilirsiniz.

Hareketli.

başlatma: Akümülatör ve gecikme elemanlarını başlatmaktan bahsettiğimde, hepsini 0'a başlatmanız gerektiğini söylemiştim. Alternatif olarak, gecikme hattını istediğiniz herhangi bir şeye başlatabilirsiniz, ancak akümülatör, gecikme satırındaki en yeni N elemanlarının toplamı olarak başlamalıdır (burada N koşu ortalamanızdaki eleman sayısıdır). Akümülatör başka bir değer olarak başlarsa, hesaplanan ortalama yanlış olacaktır - ya çok düşük ya da çok yüksek, her zaman aynı miktarda (aynı başlangıç koşulları varsayarak). Bunun neden böyle olduğunu biraz "kalem ve kağıt simülasyonu" kullanarak öğrenmeye çalışmanızı öneririm.

akümülatör boyutu: Ayrıca akümülatörün, eğer hepsi pozitif veya negatif ise, gecikme satırındaki tüm elemanların toplamını depolayacak kadar büyük olması gerektiğini de unutmamalısınız. Pratik olarak bu, akümülatörün gecikme satırı öğelerinden bir veri türü daha büyük olması ve gecikme satırı öğeleri imzalanmışsa imzalanması gerektiği anlamına gelir.

hile: Uzun gecikme satırları çok fazla bellek kaplar. Bu hızla bir sorun haline gelebilir. Hafızanız çok kısıtlıysa ve doğruluğu pek umursamıyorsanız, gecikmeyi tamamen atlayarak ve bunun yerine şunu yaparak çalışan ortalamayı yaklaşık olarak hesaplayabilirsiniz: akümülatörden 1/N * akümülatörü çıkarın ve yeni değer ekleyin (8 uzun çalışan ortalama örneğinde: akümülatör = akümülatör * 7 / 8 + yeniDeğer). Bu yöntem yanlış sonuç verir ancak hafızanız azaldığında çalışan ortalamayı hesaplamak için iyi bir yöntemdir.

dilbilim: "ortalama/ortalama" genellikle gerçek zamanlı ortalamaya atıfta bulunulurken kullanılırken, "hareketli ortalama/ortalama" genellikle algoritmanın excel elektronik tablosu gibi statik veri kümesi üzerinde çalıştığı anlamına gelir.

6. Adım: Sonuç

Umarım bu talimat yeterince kolay anlaşılır ve gelecekteki projelerinizde size yardımcı olur. Belirsiz bir şey varsa, lütfen aşağıdaki yorumlarda soru göndermekten çekinmeyin.

Önerilen: