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, Studeni
Anonim
Prosječni prosjek za vaše projekte mikrokontrolera
Prosječni prosjek za vaše projekte mikrokontrolera

U ovom uputstvu objasnit ću što je tekući prosjek i zašto biste trebali brinuti o tome, kao i pokazati kako ga treba implementirati za maksimalnu računalnu učinkovitost (ne brinite o složenosti, vrlo je jednostavno razumjeti i ja ću pružite biblioteku jednostavnu za korištenje i za vaše arduino projekte:)

Tekući prosjek, koji se obično naziva i pomični prosjek, pomična sredina ili srednja vrijednost, izraz je 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 uporabe: Uglađivanje ADC mjerenja
Slučaj uporabe: Uglađivanje ADC mjerenja

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

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

Moje predloženo rješenje je da mjerite 1000 puta u sekundi, svaki put ažurirate tekući prosjek i koristite 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 točnost (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 uporabe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj uporabe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj uporabe: Mjerenje istosmjerne komponente signala mikrofona
Slučaj uporabe: 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 izmjeničan i ako ga želite mjeriti na mikrokontroleru, morate ga prednastaviti oko 1/2 Vcc. U projektu Arduino UNO to bi značilo otprilike 2,5 V (DC) + audio signal (AC). Prilikom korištenja 10 -bitnog ADC -a i napajanja od 5 V, prednapon od 2,5 V trebao bi 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 točno. Nažalost, stvarni život je složeniji i naša pristranost signala ima tendenciju da se pomakne. Vrlo je česta 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 istosmjernog pomaka pri pokretanju i ono se polako udaljava dok se vaša aplikacija pokreće.

Ovaj ću problem ilustrirati detektorom otkucaja (glazbe). 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 uputama jer prelazi opseg ovog članka.

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

Znamo da je prosječna vrijednost bilo kojeg izmjeničnog signala 0. Koristeći ovo znanje, možemo zaključiti da je prosječna vrijednost izmjeničnog+izmjeničnog signala istosmjerna 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 bi trebala biti dovoljna desetina sekunde (broj uzoraka ovisi o brzini uzorkovanja), ali znajte da duži prosjeci bolje rade. Na prvoj slici možete vidjeti primjer stvarnog izračuna DC pristranosti s tekuć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. Liječnik 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 liječnik primi novog pacijenta, medicinska sestra bi ponovila cijeli proces.

Možda mislite: "Ovo ne zvuči previše učinkovito … 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 skupine pacijenata. Kad bi liječnik pozvao novog pacijenta, medicinska sestra bi ga pitala o njegovoj težini i oduzela od ukupnog broja pacijenata i pustila ga. 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 zbroj težina podijeljen 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 molimo pogledajte gornju ilustraciju radi dodatne jasnoće (ili postavite pitanja u komentarima).

No, č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 staviti ono što sam upravo 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

Kod
Kod

Da biste izračunali tekući prosjek, prvo vam je potreban način za spremanje posljednjih N vrijednosti. mogli biste imati niz s N elemenata i premjestiti cijeli sadržaj na jedno mjesto svaki put kad 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 odgode. U drugom slučaju vaš prosjek će uvijek biti pogrešan. Vidjet ćete da delayLine_init vodi brigu o inicijalizaciji linije kašnjenja, sami biste se trebali pobrinuti za akumulator.

dodavanje elementa u liniju odgode 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 valjani 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 s 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 dva retka: 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.

odgoda: Počet ću govoriti o ilustraciji ovog koraka. Primijetit ćete da prosjek više elemenata uvodi veće kašnjenje. Ako je vaše vrijeme odziva na promjenu vrijednosti kritično, možda biste htjeli koristiti kraći tekući prosjek ili povećati brzinu uzorkovanja (mjerite češće).

Idemo dalje.

inicijalizacija: Kad sam govorio o inicijalizaciji akumulatora i elemenata kašnjenja, rekao sam da ih trebate inicijalizirati na 0. Alternativno, možete pokrenuti liniju kašnjenja na sve što želite, ali akumulator bi trebao početi kao zbroj najnovijih N elemenata u retku odgode (gdje je N je broj elemenata u vašem prosjeku). 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 uvjeta). Predlažem da pokušate saznati 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 za spremanje zbroja 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 s dugim kašnjenjem zauzimaju puno memorije. To može brzo postati problem. Ako ste jako ograničeni memorijom i ne brinete puno o točnosti, možete približiti tekući prosjek tako da u potpunosti izostavite kašnjenje i to učinite umjesto toga: oduzmite 1/N * akumulator od akumulatora i dodajte novu vrijednost (na primjeru 8 dugotrajnih prosjeka: akumulator = akumulator * 7/8 + novaVrijednost). Ova metoda daje pogrešan rezultat, ali je pristojna metoda izračuna 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 "pomični prosjek/srednja vrijednost" obično znači da se algoritam izvodi na statičkom skupu podataka, poput Excel proračunske tablice.

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čeni: