Sisällysluettelo:

Mikrokontrolleriprojektien keskiarvo: 6 vaihetta
Mikrokontrolleriprojektien keskiarvo: 6 vaihetta

Video: Mikrokontrolleriprojektien keskiarvo: 6 vaihetta

Video: Mikrokontrolleriprojektien keskiarvo: 6 vaihetta
Video: Casio FX-83GT CW and Casio FX-85GT CW Calculators fully manul 2024, Marraskuu
Anonim
Mikrokontrolleriprojektien keskiarvo
Mikrokontrolleriprojektien keskiarvo

Tässä ohjeessa selitän, mikä on juokseva keskiarvo ja miksi sinun pitäisi välittää siitä, sekä näytän, kuinka se tulisi toteuttaa maksimaalisen laskentatehokkuuden saavuttamiseksi (älä huolehdi monimutkaisuudesta, se on erittäin helppo ymmärtää ja Tarjoa myös helppokäyttöinen kirjasto arduino -projekteihisi:)

Juokseva keskiarvo, jota kutsutaan myös yleisesti liukuvaksi keskiarvoksi, liukuvaksi keskiarvoksi tai juoksevaksi keskiarvoksi, on termi, jota käytetään kuvaamaan tietosarjan viimeisten N -arvojen keskiarvoa. Se voidaan laskea aivan kuten normaali keskiarvo tai voit käyttää temppua saadaksesi sen vaikuttamaan mahdollisimman vähän koodisi suorituskykyyn.

Vaihe 1: Käyttötapaus: ADC -mittausten tasoittaminen

Käyttötapaus: ADC -mittausten tasoittaminen
Käyttötapaus: ADC -mittausten tasoittaminen

Arduinolla on kunnollinen 10 -bittinen ADC, jossa on hyvin vähän melua. Kun mitataan arvoa anturilla, kuten potentiometrillä, valoresistorilla tai muilla korkean melun komponenteilla, on vaikea luottaa, että mittaus on oikea.

Yksi ratkaisu on ottaa useita mittauksia joka kerta, kun haluat lukea anturia, ja laskea ne keskiarvoksi. Joissakin tapauksissa tämä on toimiva ratkaisu, mutta ei aina. Jos haluat lukea ADC 1000 kertaa sekunnissa, sinun pitäisi 10 000, jos otit keskimäärin 10 mittausta. Valtavaa laskenta -ajan tuhlausta.

Ehdotamani ratkaisu on ottaa mittauksia 1000 kertaa sekunnissa, päivittää juokseva keskiarvo joka kerta ja käyttää sitä nykyisenä arvona. Tämä menetelmä tuo jonkin verran viiveitä, mutta vähentää sovelluksesi laskennallista monimutkaisuutta ja antaa sinulle paljon enemmän aikaa lisäkäsittelyyn.

Yllä olevassa kuvassa käytin viimeisten 32 mittauksen juoksevaa keskiarvoa. Näet, että tämä menetelmä ei ole 100% epäonnistunut, mutta se parantaa tarkkuutta merkittävästi (se ei ole huonompi kuin keskimäärin 32 näytettä joka kerta). Jos haluat laskea keskimäärin 32 mittausta joka kerta, se kestää yli 0,25 ms Arduino UNO: ssa pelkästään mittauksiin!

Vaihe 2: Käyttötapaus: Mikrofonisignaalin DC -komponentin mittaaminen

Käyttötapaus: Mikrofonisignaalin DC -komponentin mittaaminen
Käyttötapaus: Mikrofonisignaalin DC -komponentin mittaaminen
Käyttötapaus: Mikrofonisignaalin DC -komponentin mittaaminen
Käyttötapaus: Mikrofonisignaalin DC -komponentin mittaaminen
Käyttötapaus: Mikrofonisignaalin DC -komponentin mittaaminen
Käyttötapaus: Mikrofonisignaalin DC -komponentin mittaaminen

Arduino voi mitata jännitteitä välillä 0 - Vcc (normaalisti 5 V). Äänisignaali on täysin vaihtovirta ja jos haluat mitata sen mikrokontrollerilla, sinun on harjoitettava sitä noin 1/2 Vcc. Arduino UNO -projektissa se tarkoittaisi suunnilleen 2,5 V (DC) + äänisignaalia (AC). Kun käytetään 10 -bittistä ADC: tä ja 5 V: n virtalähdettä, 2,5 V: n esijännitteen on oltava yhtä suuri kuin 512. Joten signaalin AC -arvon saamiseksi 512 on vähennettävä ADC -mittauksesta ja se on siinä, eikö?

Ihanteellisessa maailmassa se olisi totta. Valitettavasti todellinen elämä on monimutkaisempaa ja signaalivirheemme pyrkii ajautumaan. Hyvin yleinen on 50 Hz: n melu (60 Hz, jos asut Yhdysvalloissa) sähköverkosta. Yleensä se ei ole liian ongelmallista, mutta on hyvä tietää, että se on olemassa. Ongelmallisempaa on lineaarinen ajautuminen komponenttien lämmityksestä. Asetat DC -poikkeaman korjauksen varovasti käynnistyksen yhteydessä ja se ajautuu hitaasti pois sovelluksesi ollessa käynnissä.

Kuvaan tätä ongelmaa (musiikki) lyönnintunnistimella. Määrität harhaa poistamisen ja lyönnit ovat selvät (kuva 2). Jonkin ajan kuluttua DC -esijännitys liikkuu ja lyöntejä tuskin havaitaan mikrokontrollerilla (kuva 3). Lyönnintunnistusalgoritmia tutkitaan perusteellisesti tulevassa ohjeessa, koska se ylittää tämän artikkelin.

Onneksi on olemassa tapa jatkuvasti laskea äänen tasavirran siirtymä. Ei tule yllätyksenä, että tämän ohjeen aihe juokseva keskiarvo tarjoaa ratkaisun.

Tiedämme, että minkä tahansa AC -signaalin keskiarvo on 0. Tämän tiedon avulla voimme vähentää AC+DC -signaalin keskiarvon, joka on DC -esijännite. Sen poistamiseksi voimme ottaa muutaman viimeisen arvon juoksevan keskiarvon ja vähentää sen nykyisestä ADC -lukemasta. Huomaa, että sinun on käytettävä riittävän pitkää juoksevaa keskiarvoa. Äänen osalta kymmenes sekunti (näytteiden määrä riippuu näytteenottotaajuudesta) riittää, mutta tiedä, että pidemmät keskiarvot toimivat paremmin. Ensimmäisessä kuvassa näet esimerkin todellisesta DC -bias -laskennasta, jossa on keskiarvo 64 elementtiä 1 kHz: n näytteenottotaajuudella (vähemmän kuin suosittelin, mutta se toimii edelleen).

Vaihe 3: Laskenta

Laskeminen
Laskeminen

Voitte kuvitella juoksevan keskiarvon lääkärin odotushuoneessa olevien ihmisten keskimääräisenä painona. Lääkäri lopettaa yhden potilaan tutkinnan ja samalla uusi astuu odotushuoneeseen.

Selvittääkseen odotushuoneessa odottavien potilaiden keskipainon sairaanhoitaja voi sitten kysyä jokaiselta potilaalta heidän painonsa, lisätä nämä luvut yhteen ja jakaa potilaiden lukumäärän. Aina kun lääkäri hyväksyy uuden potilaan, sairaanhoitaja toistaa koko prosessin.

Saatat ajatella: "Tämä ei kuulosta kovin tehokkaalta… On oltava parempi tapa tehdä tämä." Ja olisit oikeassa.

Tämän prosessin optimoimiseksi sairaanhoitaja voisi pitää kirjaa nykyisen potilasryhmän kokonaispainosta. Kun lääkäri kutsuu uuden potilaan sisään, sairaanhoitaja kysyy häneltä hänen painostaan ja vähentää sen ryhmän kokonaismäärästä ja päästää hänet menemään. Sairaanhoitaja kysyi sitten odotushuoneeseen astuneelta potilaalta hänen painostaan ja lisäsi sen kokonaismäärään. Potilaiden keskimääräinen paino jokaisen vuoron jälkeen olisi painojen summa jaettuna potilaiden lukumäärällä (kyllä, sama kuin ennen, mutta nyt sairaanhoitaja kysyi vain kahdelta henkilöltä niiden painosta kaikkien sijasta). Ymmärrän, että tämä kappale on saattanut olla hieman hämmentävä, joten katso selvennystä yllä olevasta kuvasta (tai kysy kysymyksiä kommenteissa).

Mutta vaikka viimeinen kappale ei olisikaan hämmentävä, sinulla saattaa olla kysymyksiä, kuten mitä pitäisi olla varaajan alussa, kuinka laitan juuri lukemani todelliseen C -koodiin? Asiaa käsitellään seuraavassa vaiheessa, josta saat myös lähdekoodini.

Vaihe 4: Koodi

Koodi
Koodi

Juoksevan keskiarvon laskemiseksi tarvitset ensin tavan tallentaa viimeiset N -arvoa. sinulla voi olla taulukko, jossa on N elementtiä, ja siirtää koko sisältö yhteen paikkaan joka kerta, kun lisäät elementin (älä tee tätä), tai voit korvata yhden vanhan elementin ja säätää osoittimen seuraavaksi heitettäväksi (tee tämä:)

Akun pitäisi aloittaa alustus 0: een, sama koskee kaikkia viiveviivan elementtejä. Muussa tapauksessa juokseva keskiarvo on aina väärä. Näet, että delayLine_init huolehtii viiveviivan alustamisesta, sinun tulee huolehtia akusta itse.

Elementin lisääminen viivästyslinjaan on yhtä helppoa kuin uusimman elementin indeksin pienentäminen yhdellä, varmistaen, ettei se osoita viivaviivataulukon puolta. Kun indeksi on pienentynyt, kun se on 0, se silmukkaa 255: een (koska se on 8 -bittinen allekirjoittamaton kokonaisluku). Modulo (%) -operaattori, jolla on viivejoukon koko, varmistaa, että indeksi osoittaa kelvolliseen elementtiin.

Juoksevan keskiarvon laskemisen pitäisi olla helppo ymmärtää, jos noudatit analogiani edellisessä vaiheessa. Vähennä vanhin elementti akusta, lisää uusin arvo varaajaan, työnnä uusin arvo viivästysriville, palauta akku jaettuna elementtien määrällä.

Helppoa, eikö?

Voit vapaasti kokeilla oheisen koodin käyttämistä ymmärtääksesi paremmin, miten tämä kaikki toimii. Nykyisessä muodossaan arduino lukee analogisen arvon analogisesta nastasta A0 ja tulostaa "[ADC -arvo], [juokseva keskiarvo]" sarjaporttiin 115200 baudinopeudella. Jos avaat arduinon sarjaplotterin oikealla siirtonopeudella, näet kaksi riviä: ADC -arvo (sininen) ja tasoitettu arvo (punainen).

Vaihe 5: Lisäominaisuudet

Ekstrat
Ekstrat

On olemassa muutamia asioita, joita sinun ei välttämättä tarvitse tietää voidaksesi käyttää juoksevaa keskiarvoa projektissasi.

viive: Aloitan puhumalla tämän vaiheen havainnollistamisesta. Huomaat, että useampien elementtien keskimääräinen käyttö aiheuttaa suuremman viiveen. Jos vasteaika arvonmuutokseen on kriittinen, sinun kannattaa käyttää lyhyempää juoksevaa keskiarvoa tai lisätä näytteenottotaajuutta (mittaa useammin).

Siirrytään eteenpäin.

alustaminen: Kun puhuin varaajan ja viive -elementtien alustuksesta, sanoin, että sinun tulee alustaa ne kaikki arvoon 0. Vaihtoehtoisesti voit alustaa viivästysrivin mihin tahansa haluamaasi kohtaan, mutta akun pitäisi alkaa summana uusimmista N -elementeistä viiveellä (jossa N on juoksevan keskiarvon elementtien määrä). Jos akku käynnistyy kuten mikä tahansa muu arvo, laskettu keskiarvo on väärä - joko liian alhainen tai liian korkea, aina samalla määrällä (olettaen, että alkuperäiset ehdot). Ehdotan, että yrität oppia miksi näin on käyttämällä "kynän ja paperin simulaatiota".

akun koko: Huomaa myös, että varaajan on oltava riittävän suuri kaikkien elementtien summan tallentamiseksi viivästysriville, jos ne ovat kaikki positiivisia tai negatiivisia maks. Käytännössä tämä tarkoittaa sitä, että akun tulisi olla yksi tietotyyppi suurempi kuin viivästysrivielementit ja allekirjoitettu, jos viivästetyt rivielementit on allekirjoitettu.

temppu: Pitkät viivaviivat vievät paljon muistia. Siitä voi tulla nopeasti ongelma. Jos muisti on hyvin rajoitettu etkä välitä tarkkuudesta, voit arvioida juoksevan keskiarvon jättämällä viiveen kokonaan pois ja tekemällä tämän sen sijaan: vähentä 1/N * -akun akusta ja lisää uutta arvoa (esimerkki 8 pitkäkeskisestä: akku = akku * 7/8 + newValue). Tämä menetelmä antaa väärän tuloksen, mutta se on kunnollinen tapa laskea juokseva keskiarvo, kun muisti on vähissä.

kielitiede: "juoksevaa keskiarvoa/keskiarvoa" käytetään tyypillisesti, kun viitataan reaaliaikaiseen keskiarvoistamiseen, kun taas "liukuva keskiarvo/keskiarvo" tarkoittaa yleensä sitä, että algoritmi toimii staattisella tietojoukolla, kuten Excel -laskentataulukolla.

Vaihe 6: Johtopäätös

Toivon, että tämä ohje oli tarpeeksi helppo ymmärtää ja että se auttaa sinua tulevissa projekteissasi. Voit vapaasti lähettää kysymyksiä alla oleviin kommentteihin, jos jotain on epäselvää.

Suositeltava: