Sisukord:

Teie mikrokontrolleri projektide keskmine: 6 sammu
Teie mikrokontrolleri projektide keskmine: 6 sammu

Video: Teie mikrokontrolleri projektide keskmine: 6 sammu

Video: Teie mikrokontrolleri projektide keskmine: 6 sammu
Video: Основные ошибки при возведении перегородок из газобетона #5 2024, Detsember
Anonim
Teie mikrokontrollerite projektide keskmine
Teie mikrokontrollerite projektide keskmine

Selles juhendis selgitan, mis on jooksev keskmine ja miks peaksite sellest hoolima, ning näitan teile, kuidas seda maksimaalse arvutusliku efektiivsuse saavutamiseks rakendada (ärge muretsege keerukuse pärast, seda on väga lihtne mõista ja ma teen seda) pakkuda hõlpsasti kasutatavat raamatukogu ka oma arduino projektide jaoks:)

Jooksev keskmine, mida tavaliselt nimetatakse ka libisevaks keskmiseks, liikuvaks keskmiseks või jooksvaks keskmiseks, on termin, mida kasutatakse andmeridade viimase N väärtuse keskmise väärtuse kirjeldamiseks. Seda saab arvutada nagu tavalist keskmist või kasutada trikki, et muuta selle mõju teie koodi toimimisele minimaalselt.

Samm: kasutusjuhtum: ADC mõõtmiste silumine

Kasutusjuhtum: ADC mõõtmiste silumine
Kasutusjuhtum: ADC mõõtmiste silumine

Arduinol on korralik 10 -bitine ADC, millel on väga vähe müra. Anduri, näiteks potentsiomeetri, fototakisti või muude kõrge müratasemega komponentide väärtuse mõõtmisel on raske usaldada, et mõõtmine on õige.

Üks lahendus on teha mitu mõõtmist iga kord, kui soovite oma andurit lugeda, ja keskmistada need. Mõnel juhul on see elujõuline lahendus, kuid mitte alati. Kui soovite ADC -d lugeda 1000 korda sekundis, peaksite keskmiselt 10 mõõtmise korral tegema 10 000. Suur arvutusaja raiskamine.

Minu pakutud lahendus on mõõta 1000 korda sekundis, uuendada jooksvat keskmist iga kord ja kasutada seda praeguse väärtusena. See meetod toob kaasa teatud viivituse, kuid vähendab teie rakenduse arvutuslikku keerukust, andes teile palju rohkem aega täiendavaks töötlemiseks.

Ülaltoodud pildil kasutasin viimase 32 mõõtmise jooksvat keskmist. Näete, et see meetod ei ole 100% tõrkekindel, kuid parandab oluliselt täpsust (see pole halvem kui keskmiselt 32 proovi iga kord). Kui soovite iga kord arvutada keskmiselt 32 mõõtmist, võtaks see Arduino UNO -l ainuüksi mõõtmiseks üle 0,25 ms!

2. samm: kasutusjuhtum: mikrofoni signaali alalisvoolu komponendi mõõtmine

Kasutusjuhtum: Mikrofoni signaali alalisvoolu komponendi mõõtmine
Kasutusjuhtum: Mikrofoni signaali alalisvoolu komponendi mõõtmine
Kasutusjuhtum: Mikrofoni signaali alalisvoolu komponendi mõõtmine
Kasutusjuhtum: Mikrofoni signaali alalisvoolu komponendi mõõtmine
Kasutusjuhtum: Mikrofoni signaali alalisvoolu komponendi mõõtmine
Kasutusjuhtum: Mikrofoni signaali alalisvoolu komponendi mõõtmine

Arduino suudab mõõta pinget vahemikus 0 kuni Vcc (tavaliselt 5 V). Helisignaal on täiesti vahelduvvooluga ja kui soovite seda mikrokontrolleril mõõta, peate selle nihutama umbes 1/2 Vcc. Arduino UNO projektis tähendaks see umbes 2,5 V (DC) + helisignaali (AC). Kui kasutate 10 -bitist ADC -d ja 5 V toiteallikat, peaks 2,5 V eelarvamus olema võrdne mõõtmisega 512. Nii et signaali vahelduvvoolu väärtuse saamiseks tuleks ADC mõõtmisest lahutada 512 ja see on nii, eks?

Ideaalses maailmas oleks see tõsi. Kahjuks on tegelik elu keerulisem ja meie signaali eelarvamus kipub triivima. Väga levinud on 50 Hz müra (60 Hz, kui elate USA -s) elektrivõrgust. Tavaliselt pole see kõik liiga problemaatiline, kuid on hea teada, et see on olemas. Probleemseim on komponentide kuumutamisel tekkiv lineaarne triiv. Seadistate ettevaatlikult alalisvoolu nihke korrigeerimise ja see eemaldub aeglaselt rakenduse töötamise ajal.

Illustreerin seda probleemi (muusika) löögidetektoriga. Seadistate eelarvamuste eemaldamise ja löögid on selged (joonis 2). Mõne aja pärast liigub alalisvoolu nihutus ja löögid on mikrokontrollerile vaevumärgatavad (joonis 3). Peksmise tuvastamise algoritmi uuritakse põhjalikult tulevases juhendis, kuna see ületab käesoleva artikli reguleerimisala.

Õnneks on olemas võimalus pidevalt alalisvoolu nihke arvutamiseks. Pole üllatav, et jooksev keskmine, selle juhendi teema, pakub lahenduse.

Me teame, et iga vahelduvvoolusignaali keskmine väärtus on 0. Neid teadmisi kasutades saame maha arvata, et vahelduvvoolu+alalisvoolu signaali keskmine väärtus on alalisvoolu nihutus. Selle eemaldamiseks võime võtta viimase paari väärtuse jooksva keskmise ja lahutada selle praegusest ADC lugemist. Pange tähele, et peate kasutama piisavalt pikka jooksvat keskmist. Heli puhul peaks piisama kümnendikust sekundist (proovide arv sõltub teie proovivõtu sagedusest), kuid teadke, et pikemad keskmised toimivad paremini. Esimesel pildil näete tõelise alalisvoolu kalkulatsiooni arvutamise näidet jooksva keskmisega 64 elemendiga 1 kHz proovivõtu sagedusel (vähem kui soovitasin, kuid see töötab endiselt).

3. samm: arvutamine

Arvutus
Arvutus

Võite ette kujutada jooksvat keskmist, kui arstide ooteruumis viibivate inimeste keskmine kaal. Arst lõpetab ühe patsiendi uurimise ja samal ajal astub ooteruumi uus.

Kõigi ooteruumis ootavate patsientide keskmise kaalu väljaselgitamiseks võiks õde küsida iga patsiendi kohta tema kaalu, liita need numbrid kokku ja jagada patsientide arvuga. Iga kord, kui arst võtab uue patsiendi vastu, kordab õde kogu protsessi.

Võib -olla mõtlete: "See ei kõla liiga tõhusalt … Selleks peab olema parem viis." Ja sul oleks õigus.

Selle protsessi optimeerimiseks võiks õde pidada arvestust praeguse patsientide rühma kogukaalu kohta. Kui arst kutsub uue patsiendi sisse, küsib õde temalt tema kaalu kohta ja lahutab selle rühmast ning laseb tal minna. Seejärel küsis õde patsiendilt, kes äsja ootesaali astus, tema kaalu kohta ja lisas selle kogukaalule. Patsientide keskmine kaal pärast iga vahetust oleks kaalude summa jagatuna patsientide arvuga (jah, sama mis varem, kuid nüüd küsis õde kõigi kahe asemel ainult kahe inimese kohta). Mõistan, et see lõik võis olla pisut segadust tekitav, nii et palun vaadake täiendavat selgust ülaltoodud jooniselt (või esitage küsimusi kommentaarides).

Kuid isegi kui te ei tundnud viimast lõiku segadust tekitavatena, võib teil tekkida küsimusi, nagu see, mis peaks alguses akumulaatoris olema, kuidas ma saan äsja loetu tegelikku C -koodi sisestada? Seda käsitletakse järgmises etapis, kust saate ka minu lähtekoodi.

4. samm: kood

Kood
Kood

Jooksva keskmise arvutamiseks vajate esmalt viisi viimase N väärtuse salvestamiseks. Sul võib olla N -elemendiga massiiv ja liigutada kogu sisu iga kord, kui lisad elemendi (palun ära tee seda), või võid ühe vana elemendi üle kirjutada ja kohandada kursori järgmisele välja visatavale elemendile (palun tee seda:)

Aku peaks algama 0 -ga, sama kehtib kõigi viivitusrea elementide kohta. Muul juhul on teie jooksev keskmine alati vale. Näete, et delayLine_init hoolitseb viivituse käivitamise eest, peaksite aku eest ise hoolitsema.

Elemendi lisamine viivitusjoonele on sama lihtne kui uusima elemendi indeksi vähendamine 1 võrra, veendudes, et see ei viita viivitusjoone massiivi poolele. pärast indeksi kahandamist, kui see on 0, pöörab see ringi 255 -ni (kuna see on 8 -bitine allkirjata täisarv). Modulo (%) operaator viivisjoone massiivi suurusega tagab, et indeks osutab kehtivale elemendile.

Jooksva keskmise arvutamist peaks olema lihtne mõista, kui järgiksite eelmises etapis minu analoogiat. Lahutage akumulaatorist vanim element, lisage akule uusim väärtus, lükake uusim väärtus viivitusreale, tagastage aku jagatuna elementide arvuga.

Lihtne, eks?

Katsetage lisatud koodi kasutamist, et paremini mõista, kuidas see kõik toimib. Praegusel kujul loeb arduino analoogväärtust analoogpistikul A0 ja prindib jadaporti 115200 baudikiirusega "[ADC väärtus], [jooksev keskmine]". Kui avate arduino jadaplotteri õigel edastuskiirusel, näete kahte rida: ADC väärtus (sinine) ja silutud väärtus (punane).

Samm: lisad

Lisad
Lisad

On mõned asjad, mida te ei pea tingimata teadma, et kasutada oma projekti jooksvat keskmist. Ut ei tee paha.

viivitus: Alustuseks räägin selle sammu illustreerimisest. Märkate, et rohkemate elementide jooksmine toob kaasa suurema viivituse. Kui teie reageerimisaeg väärtuse muutmisele on kriitiline, võiksite kasutada lühemat jooksvat keskmist või suurendada proovivõtu sagedust (mõõta sagedamini).

Edasi liikumine.

initsialiseerimine: Kui ma rääkisin aku ja viivituselementide initsialiseerimisest, siis ütlesin, et peaksite need kõik lähtestama väärtuseks 0. Teise võimalusena võite viivitusrea lähtestada mis tahes meelepäraseks, kuid akumulaator peaks algama hilisema rea uusimate N -elementide summana (kus N on teie jooksva keskmise elementide arv). Kui aku käivitub nagu mis tahes muu väärtus, on arvutatud keskmine vale - kas liiga madal või liiga kõrge, alati sama summa (eeldades samu algtingimusi). Ma soovitan teil proovida, miks see nii on, kasutades mõnda "pliiatsi ja paberi simulatsiooni".

akumulaatori suurus: Samuti peaksite arvestama, et aku peaks olema piisavalt suur, et salvestada kõigi elementide summa viivitusreale, kui need kõik on positiivsed või negatiivsed maks. Praktiliselt tähendab see, et kui viivitusjoone elemendid on allkirjastatud, peaks aku olema üks andmetüüp suurem kui viivituse rea elemendid.

trikk: pikad viivitusridad võtavad palju mälu. Sellest võib kiiresti probleem saada. Kui teil on mälu väga piiratud ja te ei hooli täpsusest, saate jooksva keskmise ligikaudseks arvutamiseks viivituse täielikult välja jätta ja seda teha: lahutage akumulaatorist 1/N * akumulaator ja lisage uus väärtus (näiteks 8 pika jooksva keskmise näitel: akumulaator = akumulaator * 7 /8 + newValue). See meetod annab vale tulemuse, kuid see on korralik meetod jooksva keskmise arvutamiseks, kui mälu hakkab otsa saama.

lingvistika: "jooksvat keskmist/keskmist" kasutatakse tavaliselt reaalajas keskmistamisel, samas kui "libisev keskmine/keskmine" tähendab tavaliselt, et algoritm töötab staatilisel andmekogumil, näiteks Exceli arvutustabelil.

6. samm: järeldus

Loodan, et sellest juhendist oli piisavalt lihtne aru saada ja see aitab teid teie tulevastes projektides. Kui teil on midagi ebaselget, postitage küsimusi allpool kommentaaridesse.

Soovitan: