Sadržaj:

Prosječni prosjek za vaše projekte mikrokontrolera: 6 koraka
Prosječni prosjek za vaše projekte mikrokontrolera: 6 koraka

Video: Prosječni prosjek za vaše projekte mikrokontrolera: 6 koraka

Video: Prosječni prosjek za vaše projekte mikrokontrolera: 6 koraka
Video: 9 Passive Income Ideas | How You Make $5000 A Month (Side Hustle Ideas) 2024, Novembar
Anonim
Prosječni prosjek za vaše projekte mikrokontrolera
Prosječni prosjek za vaše projekte mikrokontrolera

U ovom uputstvu ću objasniti šta je tekući prosjek i zašto biste trebali brinuti o njemu, kao i pokazati kako ga treba implementirati za maksimalnu računsku efikasnost (ne brinite o složenosti, vrlo je jednostavno razumjeti i ja ću pružite biblioteku koja se lako koristi i za vaše arduino projekte:)

Tekući prosjek, koji se obično naziva i pokretni prosjek, pomična sredina ili srednja vrijednost, je termin koji se koristi za opisivanje prosječne vrijednosti posljednjih N vrijednosti u nizu podataka. Može se izračunati kao normalni prosjek ili možete upotrijebiti trik kako biste imali minimalan utjecaj na performanse vašeg koda.

Korak 1: Slučaj upotrebe: Uglađivanje ADC mjerenja

Slučaj upotrebe: Uglađivanje ADC mjerenja
Slučaj upotrebe: Uglađivanje ADC mjerenja

Arduino ima pristojan 10 -bitni ADC sa vrlo malo šuma. Prilikom mjerenja vrijednosti na senzoru, poput potenciometra, fotootpornika ili drugih komponenti s visokim šumom, teško je vjerovati da je mjerenje ispravno.

Jedno rješenje je da izvršite više mjerenja svaki put kada želite očitati senzor i procijeniti ih. U nekim slučajevima ovo je održivo rješenje, ali ne uvijek. Ako želite čitati ADC 1000 puta u sekundi, morali biste to učiniti do 10 000 ako biste izvršili prosječno 10 mjerenja. Ogroman gubitak računarskog vremena.

Moje predloženo rješenje je da mjerim 1000 puta u sekundi, svaki put ažuriram tekući prosjek i koristim ga kao trenutnu vrijednost. Ova metoda uvodi određeno kašnjenje, ali smanjuje računalnu složenost vaše aplikacije, dajući vam puno više vremena za dodatnu obradu.

Na gornjoj slici sam koristio prosjek od posljednja 32 mjerenja. Vidjet ćete da ova metoda nije 100% otporna na greške, ali značajno poboljšava preciznost (nije gora od prosječnog 32 uzorka svaki put). Ako želite izračunati prosječno 32 mjerenja svaki put, to bi na Arduino UNO samo za mjerenja trajalo više od 0,25 ms!

Korak 2: Slučaj upotrebe: Mjerenje istosmjerne komponente signala mikrofona

Slučaj upotrebe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj upotrebe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj upotrebe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj upotrebe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj upotrebe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj upotrebe: Mjerenje istosmjerne komponente signala mikrofona

Arduino može mjeriti napone između 0 i Vcc (obično 5 V). Zvučni signal je potpuno naizmjenični i ako ga želite mjeriti na mikrokontroleru, morate ga prednastaviti oko 1/2 Vcc. U Arduino UNO projektu to bi značilo otprilike 2,5 V (DC) + audio signal (AC). Kada koristite 10 -bitni ADC i napajanje od 5 V, prednapon od 2,5 V bi trebao biti jednak mjerenju 512. Dakle, da biste dobili izmjeničnu vrijednost signala, 512 treba oduzeti od mjerenja ADC -a i to je to, zar ne?

U idealnom svijetu to bi bilo tačno. Nažalost, stvarni život je složeniji i naša pristranost signala ima tendenciju da se mijenja. Vrlo česta je buka od 50 Hz (60 Hz ako živite u SAD -u) iz električne mreže. Obično nije sve previše problematično, ali dobro je znati da postoji. Problematičniji je linearni pomak od zagrijavanja komponenti. Pažljivo ste postavili ispravljanje DC pomaka pri pokretanju i ona se polako udaljava dok se vaša aplikacija pokreće.

Ilustrirat ću ovaj problem detektorom otkucaja (muzike). Postavljate uklanjanje pristranosti i otkucaji su jasni (slika 2). Nakon nekog vremena, DC pristranost se pomiče i otkucaji su jedva primjetni za mikrokontroler (slika 3). Algoritam otkrivanja otkucaja bit će detaljno istražen u budućim uputstvima jer prelazi opseg ovog članka.

Srećom, postoji način da se stalno izračunava DC pomak zvuka. Neće biti iznenađenje da tekući prosjek, tema ovog uputstva, nudi rješenje.

Znamo da je prosječna vrijednost bilo kojeg AC signala 0. Koristeći ovo znanje, možemo zaključiti da je prosječna vrijednost AC+DC signala njegova DC pristranost. Da bismo ga uklonili, možemo uzeti tekući prosjek zadnjih nekoliko vrijednosti i oduzeti ga od trenutnog očitanja ADC -a. Imajte na umu da morate koristiti dovoljno dugačak prosjek. Za zvuk, desetina sekunde (broj semplova zavisi od brzine uzorkovanja) trebala bi biti dovoljna, ali znajte da duži prosjeci bolje rade. Na prvoj slici možete vidjeti primjer stvarnog izračuna DC pristranosti sa trčećim prosjekom sa 64 elementa pri frekvenciji uzorkovanja od 1 kHz (manje nego što sam preporučio, ali i dalje radi).

Korak 3: Izračun

Proračun
Proračun

Možete zamisliti trčanje u prosjeku kao prosječnu težinu ljudi u liječničkoj čekaonici. Doktor završava pregled jednog pacijenta, a istovremeno novi ulazi u čekaonicu.

Kako bi saznala prosječnu težinu svih pacijenata koji čekaju u čekaonici, medicinska sestra je zatim mogla pitati svakog pacijenta o njihovoj težini, zbrojiti te brojeve i podijeliti ih s brojem pacijenata. Svaki put kad ljekar primi novog pacijenta, medicinska sestra bi ponovila cijeli proces.

Možda mislite: "Ovo ne zvuči previše efikasno … Mora postojati bolji način za to." I bili biste u pravu.

Kako bi optimizirala ovaj proces, medicinska sestra bi mogla voditi evidenciju ukupne težine trenutne grupe pacijenata. Kad bi doktor pozvao novog pacijenta, medicinska sestra bi ga pitala o njegovoj težini i oduzela od ukupne grupe i pustila ga da ode. Medicinska sestra bi zatim pitala pacijenta koji je upravo ušao u čekaonicu o njegovoj težini i dodala je ukupnom iznosu. Prosječna težina pacijenata nakon svake smjene bila bi zbir težina podijeljenih s brojem pacijenata (da, isto kao i prije, ali sada je medicinska sestra pitala samo dvije osobe o njihovoj težini, a ne sve njih). Shvaćam da je ovaj odlomak mogao biti pomalo zbunjujući pa pogledajte dodatnu ilustraciju radi dodatne jasnoće (ili postavljajte pitanja u komentarima).

Ali čak i ako vam zadnji odlomak nije bio zbunjujući, možda ćete imati pitanja poput onoga što bi trebalo biti u akumulatoru na početku, kako da stavim ovo što sam pročitao u stvarni C kod? To će biti riješeno u sljedećem koraku, gdje ćete dobiti i moj izvorni kod.

Korak 4: Kôd

Kodeks
Kodeks

Da biste izračunali tekući prosjek, prvo vam je potreban način za spremanje posljednjih N vrijednosti. mogli biste imati niz sa N elemenata i premjestiti cijeli sadržaj na jedno mjesto svaki put kada dodate element (nemojte to raditi), ili možete prebrisati jedan stari element i prilagoditi pokazivač na sljedeći element koji će se izbaciti (učinite to:)

Akumulator bi trebao započeti inicijalizaciju na 0, isto vrijedi i za sve elemente u liniji kašnjenja. U drugom slučaju, vaš prosjek će uvijek biti pogrešan. Vidjet ćete da delayLine_init vodi računa o inicijalizaciji linije kašnjenja, sami biste trebali voditi računa o akumulatoru.

dodavanje elementa u liniju kašnjenja jednostavno je kao i smanjenje indeksa najnovijeg elementa za 1, pazeći da ne ukazuje na stranu niza linija kašnjenja. nakon smanjivanja indeksa kada je 0, on će se zaokružiti na 255 (jer je to 8 -bitni cijeli broj bez znaka). Operator Modulo (%) s veličinom niza linija kašnjenja osigurat će da indeks ukazuje na važeći element.

Izračunavanje tekućeg prosjeka trebalo bi biti lako razumljivo ako ste slijedili moju analogiju u prethodnom koraku. Oduzmite najstariji element iz akumulatora, dodajte najnoviju vrijednost akumulatoru, gurnite najnoviju vrijednost u liniju odgode, vratite akumulator podijeljen brojem elemenata.

Lako, zar ne?

Slobodno eksperimentirajte s korištenjem koda u prilogu kako biste bolje razumjeli kako sve ovo funkcionira. Kako trenutno stoji, arduino čita analognu vrijednost na analognom pinu A0 i ispisuje "[ADC vrijednost], [tekući prosjek]" na serijskom portu pri 115200 brzina prijenosa. Ako otvorite arduinov serijski ploter na ispravnoj brzini prijenosa, vidjet ćete dvije linije: ADC vrijednost (plava) i izglađena vrijednost (crvena).

Korak 5: Dodaci

Dodaci
Dodaci

Postoji nekoliko stvari koje ne morate nužno znati da biste u svom projektu koristili prosječni prosjek, ali neće škoditi znati.

kašnjenje: Počeću sa pričanjem o ilustraciji ovog koraka. Primijetit ćete da prosječni broj elemenata uvodi veće kašnjenje. Ako je vaše vrijeme odziva na promjenu vrijednosti kritično, možda ćete htjeti koristiti kraći tekući prosjek ili povećati brzinu uzorkovanja (mjerite češće).

Idemo dalje.

inicijalizacija: Kada sam govorio o inicijalizaciji akumulatora i elemenata kašnjenja, rekao sam da biste ih trebali sve inicijalizirati na 0. Alternativno, možete pokrenuti liniju kašnjenja na sve što želite, ali akumulator bi trebao početi kao zbir najnovijih N elemenata u liniji kašnjenja (gdje je N je broj elemenata vašeg prosjeka). Ako se akumulator pokrene kao bilo koja druga vrijednost, izračunati prosjek neće biti u redu - bilo prenizak ili previsok, uvijek za isti iznos (pod pretpostavkom istih početnih uslova). Predlažem da pokušate naučiti zašto je to tako koristeći neku "simulaciju olovke i papira".

veličina akumulatora: Također biste trebali imati na umu da bi akumulator trebao biti dovoljno velik da pohrani zbir svih elemenata u liniju odgode ako su svi pozitivni ili negativni max. Praktično to znači da akumulator treba biti jedan tip podataka veći od elemenata linije kašnjenja i potpisan, ako su elementi linije kašnjenja potpisani.

trik: Linije sa dugim odlaganjem zauzimaju puno memorije. To može brzo postati problem. Ako ste jako ograničeni memorijom i ne brinete mnogo o preciznosti, možete približiti tekući prosjek tako što ćete potpuno izostaviti kašnjenje i umjesto toga učiniti sljedeće: oduzeti 1/N * akumulator od akumulatora i dodati novu vrijednost (na primjeru 8 dugotrajnih prosjeka: akumulator = akumulator * 7/8 + nova vrijednost). Ova metoda daje pogrešan rezultat, ali je pristojna metoda izračunavanja prosječnog trčanja kada vam ponestaje memorije.

lingvistika: "tekući prosjek/srednja vrijednost" obično se koristi kada se misli na prosjek u stvarnom vremenu, dok "pokretni prosjek/srednja vrijednost" obično znači da se algoritam izvodi na statičkom skupu podataka, kao što je Excel proračunska tablica.

Korak 6: Zaključak

Nadam se da je ovo uputstvo bilo dovoljno lako razumjeti i da će vam pomoći u vašim budućim projektima. Slobodno postavljajte pitanja u komentarima ispod ako postoji nešto nejasno.

Preporučuje se: