Obsah:
- Krok 1: Prípad použitia: Vyrovnanie meraní ADC
- Krok 2: Prípad použitia: Meranie jednosmerného komponentu signálu mikrofónu
- Krok 3: Výpočet
- Krok 4: Kód
- Krok 5: Doplnky
- Krok 6: Záver
Video: Bežný priemer pre vaše projekty s mikrokontrolérom: 6 krokov
2024 Autor: John Day | [email protected]. Naposledy zmenené: 2024-01-30 11:56
V tomto návode vysvetlím, čo je to bežný priemer a prečo by vás to malo zaujímať, a tiež vám ukážem, ako by sa mal implementovať, aby sa dosiahla maximálna výpočtová účinnosť (nebojte sa zložitosti, je veľmi ľahké ho pochopiť a ja budem poskytnite ľahko použiteľnú knižnicu aj pre vaše projekty arduino:)
Bežný priemer, tiež bežne označovaný ako kĺzavý priemer, kĺzavý priemer alebo bežiaci priemer, je termín používaný na opis priemerných hodnôt posledných N hodnôt v radoch údajov. Dá sa vypočítať ako normálny priemer alebo môžete použiť trik, aby mal minimálny vplyv na výkonnosť vášho kódu.
Krok 1: Prípad použitia: Vyrovnanie meraní ADC
Arduino má slušný 10 -bitový ADC s veľmi malým šumom. Pri meraní hodnôt na senzore, ako je potenciometer, fotorezistor alebo iné komponenty s vysokým šumom, je ťažké uveriť, že meranie je správne.
Jedným z riešení je vykonať viac meraní zakaždým, keď chcete snímač prečítať, a spriemerovať ich. V niektorých prípadoch je to životaschopné riešenie, ale nie vždy. Ak by ste chceli prečítať ADC 1 000 -krát za sekundu, museli by ste urobiť 10 000, ak by ste urobili priemer 10 meraní. Obrovská strata výpočtového času.
Moje navrhované riešenie je vykonať merania 1000 krát za sekundu, zakaždým aktualizovať bežiaci priemer a použiť ho ako aktuálnu hodnotu. Táto metóda zavádza určitú latenciu, ale znižuje výpočtovú náročnosť vašej aplikácie, čo vám dáva oveľa viac času na ďalšie spracovanie.
Na obrázku vyššie som použil priemer z posledných 32 meraní. Uvidíte, že táto metóda nie je 100% odolná voči zlyhaniu, ale výrazne zvyšuje presnosť (nie je to horšie ako priemerovanie 32 vzoriek zakaždým). Ak by ste chceli zakaždým vypočítať v priemere 32 meraní, na Arduino UNO by to trvalo iba na merania viac ako 0,25 ms!
Krok 2: Prípad použitia: Meranie jednosmerného komponentu signálu mikrofónu
Arduino môže merať napätie medzi 0 a Vcc (bežne 5 V). Zvukový signál je úplne striedavý a ak ho chcete merať na mikrokontroléri, musíte ho nastaviť na 1/2 Vcc. V projekte Arduino UNO by to znamenalo zhruba 2,5 V (DC) + zvukový signál (AC). Pri použití 10 -bitového napájania ADC a 5 V by sa predpätie 2,5 V malo rovnať meraniu 512. Na získanie hodnoty striedavého prúdu signálu by sa 512 malo odčítať od merania ADC a je to, nie?
V ideálnom svete by to bola pravda. Skutočný život je bohužiaľ komplikovanejší a naša odchýlka signálu má tendenciu sa unášať. Veľmi častý je hluk 50 Hz (60 Hz, ak žijete v USA) z elektrickej siete. Obvykle to nie je príliš problematické, ale je dobré vedieť, že to existuje. Problematickejší je lineárny posun od zahrievania komponentov. Starostlivo nastavíte korekciu posunu jednosmerného prúdu na začiatku a pri spustení aplikácie sa pomaly vzďaľuje.
Tento problém ilustrujem na (hudobnom) detektore úderov. Nastavíte odstránenie zaujatosti a údery sú jasné (obrázok 2). Po určitom čase sa pohyby predpojatosti DC a údery mikrokontroléru sotva prejavia (obrázok 3). Algoritmus detekcie úderov bude v budúcnosti podrobne preskúmaný, pretože presahuje rámec tohto článku.
Našťastie existuje spôsob, ako neustále počítať DC offset zvuku. Nie je prekvapením, že bežiaci priemer, téma tohto návodu, ponúka riešenie.
Vieme, že priemerná hodnota akéhokoľvek signálu AC je 0. Pomocou týchto znalostí môžeme odvodiť, že priemerná hodnota signálu AC+DC je jeho zaujatosť DC. Aby sme to odstránili, môžeme vziať priemer posledných hodnôt a odpočítať ho od aktuálneho čítania ADC. Všimnite si toho, že musíte použiť dostatočne dlhý priemer. V prípade zvuku by mala stačiť desatina sekundy (počet vzoriek závisí od vašej vzorkovacej frekvencie), ale vedzte, že dlhšie priemery fungujú lepšie. Na prvom obrázku môžete vidieť príklad výpočtu DC predpätia s bežiacim priemerom so 64 prvkami pri vzorkovacej frekvencii 1 kHz (menej, ako som odporúčal, ale stále funguje).
Krok 3: Výpočet
Bežný priemer si môžete predstaviť ako priemernú hmotnosť ľudí v čakárni u lekára. Lekár dokončí vyšetrenie jedného pacienta a súčasne nový vstúpi do čakárne.
Na zistenie priemernej hmotnosti všetkých čakajúcich pacientov v čakárni sa sestra môže každého pacienta opýtať na jeho hmotnosť, sčítať tieto čísla a rozdeliť podľa počtu pacientov. Zakaždým, keď lekár prijme nového pacienta, sestra zopakuje celý proces.
Môžete si myslieť: „Toto neznie príliš efektívne … Na to musí existovať lepší spôsob.“A mal by si pravdu.
Na optimalizáciu tohto procesu by sestra mohla viesť záznam o celkovej hmotnosti aktuálnej skupiny pacientov. Hneď ako lekár zavolá nového pacienta, sestra sa ho spýta na hmotnosť a odpočíta ho od celkového počtu v skupine a nechá ho ísť. Sestra sa potom opýta pacienta, ktorý práve vošiel do čakárne, na jeho hmotnosť a pripočíta ju k celkovej hmotnosti. Priemerná hmotnosť pacientov po každej smene by bola súčtom hmotností delených počtom pacientov (áno, rovnaké ako predtým, ale teraz sa sestra pýtala dvoch ľudí na ich hmotnosť namiesto všetkých). Uvedomujem si, že tento odsek mohol byť trochu mätúci, takže pre väčšiu jasnosť si pozrite vyššie uvedený obrázok (alebo položte otázky v komentároch).
Ale aj keby vám posledný odsek nebol mätúci, môžete mať otázky, ako napríklad to, čo by malo byť na začiatku v akumulátore, ako vložím to, čo som práve prečítal, do skutočného kódu C? To sa bude riešiť v nasledujúcom kroku, kde získate aj môj zdrojový kód.
Krok 4: Kód
Aby ste mohli vypočítať kĺzavý priemer, potrebujete najskôr spôsob, ako uložiť posledných N hodnôt. pri každom pridaní prvku môžete mať pole s N prvkami a presúvať celý obsah o jedno miesto (prosím, nerobte to), alebo môžete prepísať jeden starý prvok a nastaviť ukazovateľ na ďalší prvok, ktorý sa má vyhodiť (urobte to prosím:)
Akumulátor by mal začať inicializovaný na 0, to isté platí pre všetky prvky v riadku oneskorenia. V opačnom prípade bude váš bežecký priemer vždy nesprávny. Uvidíte, že delayLine_init sa postará o inicializáciu linky oneskorenia, o akumulátor by ste sa mali postarať sami.
pridanie prvku na oneskorovací riadok je rovnako jednoduché ako zníženie indexu najnovšieho prvku o 1, pričom sa uistite, že neukazuje na stranu poľa oneskorovacieho riadku. po znížení indexu, keď je 0, sa zacyklí okolo 255 (pretože je to 8 -bitové celé číslo bez znamienka). Operátor Modulo (%) s veľkosťou poľa oneskorovacích riadkov zabezpečí, aby index smeroval na platný prvok.
Výpočet kĺzavého priemeru by mal byť ľahko pochopiteľný, ak ste v predchádzajúcom kroku postupovali podľa mojej analógie. Odpočítajte najstarší prvok od akumulátora, pridajte najnovšiu hodnotu do akumulátora, zatlačte najnovšiu hodnotu do oneskorovacej linky, vráťte akumulátor vydelený počtom prvkov.
Ľahké, však?
Nebojte sa experimentovať s použitím priloženého kódu, aby ste lepšie pochopili, ako to všetko funguje. V súčasnej podobe arduino číta analógovú hodnotu na analógovom pine A0 a tlačí „[hodnota ADC]
Krok 5: Doplnky
Niekoľko vecí, ktoré nepotrebujete vedieť, aby ste vo svojom projekte mohli použiť bežný priemer, nie je na škodu vedieť.
oneskorenie: Začnem rozprávaním o ilustrácii tohto kroku. Všimnite si, že bežiaci priemer viacerých prvkov prináša väčšie oneskorenie. Ak je váš čas odozvy na zmenu hodnoty kritický, možno budete chcieť použiť kratší kĺzavý priemer alebo zvýšiť vzorkovaciu frekvenciu (merajte častejšie).
Pohybujúce sa na.
inicializácia: Keď som hovoril o inicializácii prvkov akumulátora a oneskorenia, povedal som, že by ste ich mali všetky inicializovať na 0. Alternatívne môžete inicializovať linku oneskorenia na čokoľvek, čo sa vám páči, ale akumulátor by mal začínať ako súčet najnovších N prvkov v riadku oneskorenia (kde N je počet prvkov vo vašom bežnom priemere). Ak sa akumulátor spustí ako akákoľvek iná hodnota, vypočítaný priemer bude nesprávny - buď príliš nízky alebo príliš vysoký, vždy o rovnakú hodnotu (za predpokladu rovnakých počiatočných podmienok). Navrhujem, aby ste sa pokúsili zistiť, prečo je to tak, pomocou „simulácie pera a papiera“.
veľkosť akumulátora: Mali by ste tiež vziať na vedomie, že akumulátor by mal byť dostatočne veľký na to, aby dokázal uložiť súčet všetkých prvkov do oneskorovacieho riadku, ak sú všetky kladné alebo záporné max. Prakticky to znamená, že akumulátor by mal byť o jeden dátový typ väčší ako prvky riadka oneskorenia a mal by byť podpísaný, ak sú prvky riadka oneskorenia podpísané.
trik: Dlhé oneskorovacie linky zaberajú veľa pamäte. To sa môže rýchlo stať problémom. Ak máte obmedzenú pamäť a nestaráte sa veľmi o presnosť, môžete aproximovať bežiaci priemer úplným vynechaním oneskorenia a namiesto toho odčítať 1/N * akumulátor z akumulátora a pridať novú hodnotu (napríklad 8 dlhých priemerov: akumulátor = akumulátor * 7/8 + nováHodnota). Táto metóda poskytuje nesprávny výsledok, ale je to slušná metóda na výpočet bežiaceho priemeru, keď vám dochádza pamäť.
lingvistika: „priemer/priemer“sa zvyčajne používa pri odkazovaní na priemerovanie v reálnom čase, zatiaľ čo „kĺzavý priemer/priemer“zvyčajne znamená, že algoritmus beží na súbore statických údajov, ako je napríklad tabuľkový procesor Excel.
Krok 6: Záver
Dúfam, že tento návod bol dostatočne zrozumiteľný a že vám pomôže vo vašich budúcich projektoch. Ak je niečo nejasné, neváhajte napísať otázky do komentárov nižšie.
Odporúča:
Vážený priemer CP2 Excel: 14 krokov
Vážený priemer CP2 Excel: Pokyny, ako vypočítať vážený priemer v programe Excel. V tomto prípade sa v programe Excel použije funkcia SUMPRODUCT a SUM. Vážený priemer je užitočný na výpočet celkovej známky za triedu
Dúhové LED diódy pre vaše projekty: 4 kroky (s obrázkami)
Dúhové LED diódy pre vaše projekty: Ahoj všetci! Tieto LED diódy používam na mnoho dekoratívnych projektov a výsledok je vždy úžasný, takže sa s vami chcem podeliť o svoje skúsenosti. Videl som veľa ľudí, ktorí si kupujú RGB LED pásové ovládače a používajú ako 3 alebo 5 na režim zmeny farby len na
Príručka pre začiatočníkov k mikrokontrolérom: 10 krokov (s obrázkami)
Príručka pre začiatočníkov k mikrokontrolérom: Čo majú spoločné diaľkové ovládače, smerovače a roboty? Mikrokontroléry! V dnešnej dobe sa mikrokontroléry vhodné pre začiatočníkov ľahko používajú a programujú iba pomocou prenosného počítača, kábla USB a určitého (bezplatného) softvéru s otvoreným zdrojovým kódom. Fúúú !! Všetko
Guerrilla držiak batérie pre vaše projekty na doske / Arduino: 3 kroky
Guerrilla držiak batérie pre vaše projekty na doske / Arduino: Experimentujem s DS1307 a Arduino, musel som nájsť spôsob, ako pripojiť batériu CR1212. Hrabal som sa v krabici s konektormi a nenašiel som nič, čo by mohlo pomôcť. Potom eur & ka! Mal som osvetlenie
Zoznam ** ZDARMA ZAMESTNANCOV ** pre vaše projekty: 8 krokov
Zoznam ** ZADARMO ZAMESTNANCA ** pre vaše projekty: Toto je zoznam miest, z ktorých môžete získať veci ZADARMO, môžete ich použiť vo svojich projektoch …. Je zadarmo a položky sú dodávané zadarmo. Takže dúfam, že sa vám bude páčiť zoznam! Dobre, tak som to zorganizoval podľa typu produktu. PM, ak máte web