Tartalomjegyzék:
- 1. lépés: Használati eset: Az ADC -mérések simítása
- 2. lépés: Használati eset: A mikrofonjel egyenáramú komponensének mérése
- 3. lépés: Számítás
- 4. lépés: A kód
- 5. lépés: Extrák
- 6. lépés: Következtetés
Videó: Futó átlag a mikrokontroller projektekhez: 6 lépés
2024 Szerző: John Day | [email protected]. Utoljára módosítva: 2024-01-30 09:40
Ebben az utasításban elmagyarázom, mi a futó átlag, és miért kell törődnie vele, valamint megmutatom, hogyan kell megvalósítani a maximális számítási hatékonyság érdekében (ne aggódjon a komplexitás miatt, nagyon egyszerű megérteni, és könnyen használható könyvtárat biztosít az arduino projektekhez is:)
A futóátlag, más néven mozgóátlag, mozgóátlag vagy futóátlag, az adatsorok utolsó N értékének átlagos értékének leírására használt kifejezés. Kiszámítható ugyanúgy, mint a normál átlag, vagy használhat egy trükköt annak érdekében, hogy minimális hatással legyen a kód teljesítményére.
1. lépés: Használati eset: Az ADC -mérések simítása
Az Arduino rendelkezik egy tisztességes 10 bites ADC -vel, nagyon alacsony zajjal. Amikor érzékelőn, például potenciométeren, fotorezisztoron vagy más magas zajszintű alkatrészen mérnek értékeket, nehéz bízni a mérés helyességében.
Az egyik megoldás az, hogy több mérést végez minden alkalommal, amikor le akarja olvasni az érzékelőt, és átlagolja azokat. Bizonyos esetekben ez életképes megoldás, de nem mindig. Ha másodpercenként 1000 -szer szeretné olvasni az ADC -t, akkor 10 000 -et kell tennie, ha átlagosan 10 mérést végez. Óriási számítási időpocsékolás.
Javasolt megoldásom az, hogy másodpercenként 1000 -szer végezzek méréseket, minden alkalommal frissítsem a futóátlagot, és azt aktuális értékként használják. Ez a módszer némi késleltetést vezet be, de csökkenti az alkalmazás számítási bonyolultságát, így sokkal több időt biztosít a további feldolgozásra.
A fenti képen az utolsó 32 mérés futóátlagát használtam. Látni fogja, hogy ez a módszer nem 100% -ban hibamentes, de jelentősen javítja a pontosságot (nem rosszabb, mint minden alkalommal 32 mintát átlagolni). Ha minden alkalommal átlagosan 32 mérést szeretne kiszámítani, az csak 0,25 ms -ot vesz igénybe az Arduino UNO -n csak a mérésekhez!
2. lépés: Használati eset: A mikrofonjel egyenáramú komponensének mérése
Az Arduino 0 és Vcc közötti feszültséget képes mérni (általában 5 V). Az audiojel teljesen váltóáramú, és ha mikrovezérlőn szeretné mérni, akkor 1/2 Vcc körül kell torzítani. Egy Arduino UNO projektben ez nagyjából 2,5 V (DC) + audio jelet (AC) jelentene. Ha 10 bites ADC -t és 5 V -os tápegységet használ, a 2,5 V -os torzításnak meg kell egyeznie az 512 -es méréssel. Tehát a jel AC -értékének meghatározásához az 512 -et ki kell vonni az ADC -mérésből, és ez az, igaz?
Egy ideális világban ez igaz lenne. Sajnos a való élet bonyolultabb, és a jel elfogultságunk hajlamos sodródni. Nagyon gyakori az 50 Hz -es zaj (60 Hz, ha az Egyesült Államokban él) az elektromos hálózatból. Általában nem túl problémás, de jó tudni, hogy létezik. Problémásabb az alkatrészek hevítéséből származó lineáris sodródás. Óvatosan állítja be az egyenáramú eltolás korrekcióját az induláskor, és az alkalmazás futása közben lassan eltávolodik.
Ezt a problémát egy (zene) ütésérzékelővel illusztrálom. Beállítja a torzítás eltávolítását, és az ütések világosak (2. kép). Egy idő után egyenáramú torzítás mozog, és az ütések alig észrevehetők a mikrokontroller számára (3. kép). Az ütésészlelési algoritmust részletesen feltárjuk egy későbbi utasításban, mivel meghaladja a cikk hatókörét.
Szerencsére van egy módja annak, hogy folyamatosan számítsuk az audio egyenáramú eltolását. Nem lesz meglepő, hogy a futó átlag, ennek az oktatható témának a megoldása.
Tudjuk, hogy minden AC jel átlagos értéke 0. Ezen ismeretek alapján levonhatjuk, hogy az AC+DC jel átlagos értéke egyenáramú torzítás. Ennek eltávolításához vehetjük az utolsó néhány érték futó átlagát, és kivonhatjuk az aktuális ADC -értékből. Vegye figyelembe, hogy elég hosszú futóátlagot kell használnia. Hang esetén a tizedmásodperc (a minták száma a mintavételi gyakoriságtól függ) elegendő, de tudnia kell, hogy a hosszabb átlagok jobban működnek. Az első képen láthat példát a valós DC torzítás kiszámítására futó átlaggal, 64 elemmel 1 kHz mintavételi frekvencián (kevesebb, mint amit ajánlottam, de még mindig működik).
3. lépés: Számítás
A futó átlagot úgy képzelheti el, mint az orvosok várótermében lévő emberek átlagos súlyát. Az orvos befejezi az egyik beteg vizsgálatát, és egyidejűleg egy új betér a váróba.
Ahhoz, hogy megtudja a váróteremben várakozó betegek átlagos súlyát, a nővér megkérdezhet minden egyes beteget a súlyáról, összeadhatja ezeket a számokat, és eloszthatja a betegek számával. Minden alkalommal, amikor az orvos új beteget fogad, a nővér megismétli az egész folyamatot.
Lehet, hogy azt gondolja: "Ez nem hangzik túl hatékonyan … Biztosan van egy jobb módja ennek." És igaza lenne.
Ennek a folyamatnak az optimalizálása érdekében a nővér nyilvántartást vezethet a jelenlegi betegcsoport teljes súlyáról. Amint az orvos új beteget hív, a nővér megkérdezi tőle a súlyát, és levonja a csoportból, és elengedi. A nővér ezután megkérdezi a beteget, aki most lépett be a váróterembe, a súlyáról, és hozzáadta a végösszeghez. A betegek átlagos súlya minden műszak után a súlyok összege a betegek számával osztva (igen, ugyanaz, mint korábban, de most a nővér csak két embert kérdezett meg a súlyukról). Rájöttem, hogy ez a bekezdés kissé zavaró lehetett, ezért kérjük, nézze meg a fenti ábrát a további egyértelműség érdekében (vagy tegyen fel kérdéseket a megjegyzésekben).
De még akkor is, ha nem találta zavarónak az utolsó bekezdést, kérdései merülhetnek fel, például, hogy mi legyen az akkumulátorban az elején, hogyan tegyem be az olvasottakat egy tényleges C kódba? Ezzel a következő lépésben foglalkozunk, ahol megkapja a forráskódomat is.
4. lépés: A kód
A futó átlag kiszámításához először az utolsó N érték tárolására van szükség. rendelkezhet egy tömböt N elemekkel, és a teljes tartalmat egy helyre mozgathatja minden egyes elem hozzáadásakor (kérjük, ne tegye ezt), vagy felülírhat egy régi elemet, és a mutatót a következő elemre állíthatja ki (kérjük, tegye ezt meg):)
Az akkumulátort inicializálni kell 0 -ra, ugyanez vonatkozik a késleltetett sor összes elemére. Más esetben a futó átlag mindig rossz lesz. Látni fogja, hogy a delayLine_init gondoskodik a késleltetési sor inicializálásáról, magának kell gondoskodnia az akkumulátorról.
elem hozzáadása a késleltetett sorhoz olyan egyszerű, mint a legújabb elem indexének 1 -gyel történő csökkentése, ügyelve arra, hogy ne mutasson a késleltetett vonal tömbjének oldalára. az index csökkenése után, amikor 0, akkor 255 -re fog hurkolódni (mert ez egy 8 bites előjel nélküli egész szám). A Modulo (%) operátor késleltetési vonal tömbjével biztosítja, hogy az index egy érvényes elemre mutasson.
A futó átlag kiszámításának könnyen érthetőnek kell lennie, ha az előző lépésben követett analógiámat követte. Vonja ki a legrégebbi elemet az akkumulátorból, adjon hozzá újabb értéket az akkumulátorhoz, nyomja meg a legújabb értéket a késleltetési sorban, adja vissza az akkumulátort az elemek számával osztva.
Könnyű, igaz?
Kérjük, bátran kísérletezzen a mellékelt kód használatával, hogy jobban megértse mindezek működését. A jelenlegi állapotában az arduino beolvassa az analóg értéket az A0 analóg érintkezőn, és a soros portra 115200 baud sebességgel nyomtat "[ADC érték], [futó átlag]" értéket. Ha megnyitja az arduino soros plotterét a helyes átviteli sebességgel, két sort lát: ADC érték (kék) és kisimított érték (piros).
5. lépés: Extrák
Van néhány dolog, amit nem feltétlenül kell tudnia ahhoz, hogy a futó átlagot használja a projektben.
késleltetés: Kezdem ennek a lépésnek a szemléltetésével. Észre fogja venni, hogy a több elem átlagos futása nagyobb késleltetést eredményez. Ha az értékváltozásra adott válaszidő kritikus, érdemes rövidebb futóátlagot használni, vagy növelni a mintavételi gyakoriságot (gyakrabban mérni).
Továbblépni.
inicializálás: Amikor az akkumulátor és a késleltető elemek inicializálásáról beszéltem, azt mondtam, hogy mindegyiket 0 -ra kell inicializálni. Alternatív megoldásként inicializálhatja a késleltetési sort bármire, ami tetszik, de az akkumulátort a késõbbi sorban (ahol N az elemek száma a futóátlagban). Ha az akkumulátor bármely más értékként indul, a számított átlag téves lesz - vagy túl alacsony, vagy túl magas, mindig ugyanannyival (azonos kezdeti feltételeket feltételezve). Azt javaslom, próbálja meg megtudni, miért van ez valamilyen „toll és papír szimuláció” segítségével.
akkumulátor mérete: Azt is meg kell jegyezni, hogy az akkumulátornak elég nagynak kell lennie ahhoz, hogy tárolja az összes elem összegét a késleltetési sorban, ha mindegyik pozitív vagy negatív max. Gyakorlatilag ez azt jelenti, hogy az akkumulátornak egy adattípussal nagyobbnak kell lennie, mint a késleltetési sor elemei, és alá kell írni, ha a késleltetett sor elemei alá vannak írva.
trükk: A hosszú késleltetésű sorok sok memóriát foglalnak el. Ez gyorsan problémává válhat. Ha nagyon korlátozott a memóriája, és nem sokat törődik a pontossággal, akkor hozzávetőlegesen megadhatja a futó átlagot, ha teljesen kihagyja a késleltetést, és ezt teszi: kivonja az 1/N * akkumulátort az akkumulátorból, és új értéket ad hozzá (például 8 hosszú futási átlag: akkumulátor = akkumulátor * 7 /8 + newValue). Ez a módszer rossz eredményt ad, de tisztességes módszer a futó átlag kiszámítására, ha kevés a memória.
nyelvtudomány: A "futó átlag/átlag" jellemzően a valós idejű átlagolásra vonatkozik, míg a "mozgó átlag/átlag" általában azt jelenti, hogy az algoritmus statikus adatkészleten, például Excel -táblázaton fut.
6. lépés: Következtetés
Remélem, hogy ezt az oktathatót elég könnyű volt megérteni, és segíteni fog a jövőbeni projektjeiben. Kérjük, bátran tegye fel kérdéseit az alábbi megjegyzésekbe, ha valami nem világos.
Ajánlott:
Hűvös laptop érintőpad -hack az Arduino projektekhez!: 18 lépés (képekkel)
Hűvös Laptop Touchpad Hack az Arduino projektekhez! Ebben az utasításban tanuljuk meg, hogyan használhatjuk fel a PS/2 érintőpad kiegészítőit
CP2 Excel súlyozott átlag: 14 lépés
CP2 Excel súlyozott átlag: Utasítások a súlyozott átlag kiszámításához Excelben. Ebben a példában a SUMPRODUCT és a SUM funkciót fogjuk használni az Excelben. A súlyozott átlag hasznos az osztály általános osztályzatának kiszámításához
IOT funkciók hozzáadása a projektekhez: 5 lépés
IOT funkciók hozzáadása a projektjeihez: Semmi sem jobb, mint egy DIY projekt elkészítése, amely helyettesíti a hasznosnak talált kereskedelmi terméket. Nos, valójában van ennél jobb. IOT képesség hozzáadása a projekthez. Ami az automatizálást illeti, a kezdők általában megijednek
Valódi Pipboy / IronMan: hordható fűtő + futó segédfény: 10 lépés
Valódi Pipboy / IronMan: Hordható fűtő + futó segédfény: Háttér: Az ember teremtése Prometheus által (JM Hunt): " Prométheusz bízta meg Epimetheuszt azzal a feladattal, hogy megadja a föld teremtményeinek különböző tulajdonságait, például gyorsaságát, ravaszságát , erő, szőr és szárnyak. Sajnos ezúttal
AVR mikrokontroller biztosíték bit konfiguráció. A LED villogó program létrehozása és feltöltése a mikrokontroller flash memóriájába: 5 lépés
AVR mikrokontroller biztosíték bit konfiguráció. A LED villogó program létrehozása és feltöltése a mikrokontroller flash memóriájába: Ebben az esetben egyszerű programot készítünk C kódban, és elégetjük a mikrokontroller memóriájában. Saját programot írunk és összeállítjuk a hex fájlt, az Atmel Studio integrált fejlesztési platformjaként. Beállítjuk a biztosítékot bi