Turinys:

Jūsų mikrovaldiklio projektų vidurkis: 6 žingsniai
Jūsų mikrovaldiklio projektų vidurkis: 6 žingsniai

Video: Jūsų mikrovaldiklio projektų vidurkis: 6 žingsniai

Video: Jūsų mikrovaldiklio projektų vidurkis: 6 žingsniai
Video: Как БЕСПЛАТНО заработать с Clickbank на САЙТАХ GOOGLE (2020) 2024, Lapkritis
Anonim
Jūsų mikrovaldiklio projektų vidurkis
Jūsų mikrovaldiklio projektų vidurkis

Šioje pamokoje paaiškinsiu, kas yra einamasis vidurkis ir kodėl jums tai turėtų rūpėti, taip pat parodysiu, kaip tai turėtų būti įgyvendinta siekiant maksimalaus skaičiavimo efektyvumo (nesijaudinkite dėl sudėtingumo, tai labai paprasta suprasti ir aš tai padarysiu) Pateikite lengvai naudojamą biblioteką ir savo arduino projektams:)

Bėgantis vidurkis, taip pat paprastai vadinamas slankiuoju vidurkiu, slankiuoju vidurkiu arba einamuoju vidurkiu, yra terminas, naudojamas apibūdinti paskutinių N reikšmių duomenų eilučių vidutinei vertei. Jis gali būti apskaičiuotas kaip įprastas vidurkis arba galite pasinaudoti apgaule, kad jis turėtų minimalų poveikį jūsų kodo veikimui.

1 veiksmas. Naudojimo atvejis: ADC matavimų išlyginimas

Naudojimo atvejis: ADC matavimų išlyginimas
Naudojimo atvejis: ADC matavimų išlyginimas

„Arduino“turi padorų 10 bitų ADC su labai mažu triukšmu. Matuojant jutiklio, pvz., Potenciometro, fotorezistoriaus ar kitų didelio triukšmo komponentų, vertę, sunku patikėti, kad matavimas teisingas.

Vienas iš sprendimų yra atlikti kelis matavimus kiekvieną kartą, kai norite nuskaityti jutiklį, ir juos įvertinti. Kai kuriais atvejais tai yra perspektyvus sprendimas, bet ne visada. Jei norėtumėte skaityti ADC 1000 kartų per sekundę, vidutiniškai atlikę 10 matavimų, turėtumėte 10 000. Didelis skaičiavimo laiko švaistymas.

Mano siūlomas sprendimas yra atlikti matavimus 1000 kartų per sekundę, kiekvieną kartą atnaujinti einamąjį vidurkį ir naudoti jį kaip dabartinę vertę. Šis metodas suteikia tam tikrą vėlavimą, tačiau sumažina jūsų programos skaičiavimo sudėtingumą, suteikiant daug daugiau laiko papildomam apdorojimui.

Aukščiau esančioje nuotraukoje naudoju paskutinių 32 matavimų vidurkį. Pamatysite, kad šis metodas nėra 100% atsparus gedimams, tačiau žymiai pagerina tikslumą (jis nėra blogesnis nei vidutiniškai 32 mėginiai kiekvieną kartą). Jei norėjote kiekvieną kartą apskaičiuoti vidutiniškai 32 matavimus, tai tik „Arduino UNO“užtruktų 0,25 ms vien matavimams!

2 žingsnis: Naudojimo atvejis: Mikrofono signalo nuolatinės srovės komponento matavimas

Naudojimo atvejis: Mikrofono signalo nuolatinės srovės komponento matavimas
Naudojimo atvejis: Mikrofono signalo nuolatinės srovės komponento matavimas
Naudojimo atvejis: Mikrofono signalo nuolatinės srovės komponento matavimas
Naudojimo atvejis: Mikrofono signalo nuolatinės srovės komponento matavimas
Naudojimo atvejis: Mikrofono signalo nuolatinės srovės komponento matavimas
Naudojimo atvejis: Mikrofono signalo nuolatinės srovės komponento matavimas

„Arduino“gali matuoti įtampą nuo 0 iki Vcc (paprastai 5 V). Garso signalas yra visiškai kintamasis ir, jei norite jį išmatuoti mikrovaldikliu, turite jį nukreipti apie 1/2 Vcc. „Arduino UNO“projekte tai reikštų maždaug 2,5 V (DC) + garso signalą (AC). Naudojant 10 bitų ADC ir 5 V maitinimo šaltinį, 2,5 V šališkumas turi būti lygus 512. Taigi norint gauti signalo kintamąją vertę, 512 turėtų būti atimta iš ADC matavimo ir viskas, tiesa?

Idealiame pasaulyje tai būtų tiesa. Deja, tikrasis gyvenimas yra sudėtingesnis ir mūsų signalo šališkumas linkęs nukrypti. Labai dažnas yra 50 Hz triukšmas (60 Hz, jei gyvenate JAV) iš elektros tinklo. Paprastai tai nėra per daug problematiška, tačiau gerai žinoti, kad ji egzistuoja. Daugiau problemų kelia linijinis poslinkis kaitinant komponentus. Pradžioje atsargiai nustatote nuolatinės srovės poslinkio korekciją ir ji lėtai nutolsta, kai programa veikia.

Šią problemą iliustruosiu (muzikos) ritmo detektoriumi. Nustatote šališkumo pašalinimą ir smūgiai yra aiškūs (2 pav.). Po kurio laiko nuolatinės srovės šališkumas juda ir smūgiai yra vos pastebimi mikrovaldikliui (3 pav.). Mušimo aptikimo algoritmas bus nuodugniai ištirtas ateityje, nes jis viršija šio straipsnio taikymo sritį.

Laimei, yra būdas nuolatos skaičiuoti garso nuolatinės srovės poslinkį. Nenuostabu, kad vidutinis, šios pamokos tema, suteikia sprendimą.

Mes žinome, kad vidutinė bet kurio kintamosios srovės signalo vertė yra 0. Naudodamiesi šiomis žiniomis, galime išskaičiuoti, kad vidutinė AC+DC signalo vertė yra nuolatinės srovės šališkumas. Norėdami jį pašalinti, galime paimti paskutinių keleto verčių einamąjį vidurkį ir atimti jį iš dabartinio ADC rodmens. Atminkite, kad turite naudoti pakankamai ilgą einamąjį vidurkį. Garso atveju turėtų pakakti dešimtadalio sekundės (mėginių skaičius priklauso nuo jūsų atrankos dažnio), tačiau žinokite, kad ilgesni vidurkiai veikia geriau. Pirmame paveikslėlyje galite pamatyti realaus nuolatinės srovės šališkumo skaičiavimo pavyzdį, kai veikimo vidurkis yra 64 elementai 1 kHz dažnio dažniu (mažesnis nei rekomendavau, bet jis vis tiek veikia).

3 žingsnis: Skaičiavimas

Skaičiavimas
Skaičiavimas

Bėgimo vidurkį galite įsivaizduoti kaip vidutinį žmonių svorį gydytojo laukiamajame. Gydytojas baigia vieno paciento tyrimą ir tuo pačiu metu į laukiamąjį įeina naujas.

Norėdami sužinoti vidutinį visų laukiančių pacientų svorį laukimo kambaryje, slaugytoja galėtų paklausti kiekvieno paciento apie jų svorį, sudėti šiuos skaičius ir padalyti iš pacientų skaičiaus. Kiekvieną kartą, kai gydytojas priima naują pacientą, slaugytoja kartoja visą procedūrą.

Galbūt galvojate: „Tai skamba ne itin efektyviai … Turi būti geresnis būdas tai padaryti“. Ir tu būtum teisus.

Norėdami optimizuoti šį procesą, slaugytoja galėtų įrašyti dabartinės pacientų grupės bendrą svorį. Kai gydytojas iškviečia naują pacientą, slaugytoja paklausia jo apie jo svorį ir atima jį iš grupės ir leidžia jam eiti. Tada slaugytoja paklausė ką tik į laukimo kambarį įėjusio paciento apie jo svorį ir pridėjo jį prie bendro svorio. Vidutinis pacientų svoris po kiekvienos pamainos būtų svorių suma, padalyta iš pacientų skaičiaus (taip, kaip ir anksčiau, bet dabar slaugytoja paklausė tik dviejų žmonių, o ne visų). Suprantu, kad ši pastraipa galėjo būti šiek tiek paini, todėl papildomo aiškumo dėlei žiūrėkite aukščiau esančią iliustraciją (arba užduokite klausimus komentaruose).

Bet net jei paskutinė pastraipa jums neatrodė paini, jums gali kilti klausimų, pavyzdžiui, kas turėtų būti kaupiklyje pradžioje, kaip į ką nors perskaitytą įrašyti faktinį C kodą? Tai bus išspręsta kitame žingsnyje, kur taip pat gausite mano šaltinio kodą.

4 žingsnis: Kodas

Kodas
Kodas

Norint apskaičiuoti einamąjį vidurkį, pirmiausia reikia išsaugoti paskutines N reikšmes. galite turėti masyvą su N elementais ir perkelti visą turinį į vieną vietą kiekvieną kartą, kai pridedate elementą (nedarykite to), arba galite perrašyti vieną seną elementą ir pritaikyti žymeklį prie kito elemento, kurį norite išmesti (padarykite tai:)

Akumuliatorius turėtų būti inicijuotas iki 0, tas pats pasakytina apie visus elementus, esančius vėlinimo eilutėje. Kitu atveju jūsų bėgimo vidurkis visada bus neteisingas. Pamatysite, kad „delayLine_init“pasirūpina uždelsimo linijos inicijavimu, akumuliatoriumi turėtumėte pasirūpinti patys.

Pridėti elementą prie uždelsimo eilutės yra taip pat paprasta, kaip sumažinti naujausio elemento indeksą 1, įsitikinant, kad jis nenurodo vėlavimo eilučių masyvo pusės. sumažėjus indeksui, kai jis yra 0, jis suksis iki 255 (nes tai 8 bitų nepasirašytas sveikasis skaičius). Modulo (%) operatorius, turintis uždelsimo eilučių masyvo dydį, užtikrins, kad indeksas nurodytų galiojantį elementą.

Skaičiuoti einamąjį vidurkį turėtų būti lengva suprasti, jei atlikote mano analogiją ankstesniame žingsnyje. Atimkite seniausią elementą iš kaupiklio, pridėkite naujausią vertę prie kaupiklio, įveskite naujausią vertę į uždelsimo eilutę, grąžinkite akumuliatorių, padalytą iš elementų skaičiaus.

Lengva, tiesa?

Nedvejodami eksperimentuokite naudodami pridedamą kodą, kad geriau suprastumėte, kaip visa tai veikia. Šiuo metu „arduino“nuskaito analoginę vertę ant analoginio kaiščio A0 ir spausdina „[ADC vertė], [veikiantis vidurkis]“nuosekliajame prievade 115200 baudų greičiu. Jei atidarysite „arduino“serijos braižytuvą, naudodami teisingą perdavimo spartą, pamatysite dvi eilutes: ADC reikšmė (mėlyna) ir išlyginta vertė (raudona).

5 žingsnis: Papildomi priedai

Priedai
Priedai

Yra keletas dalykų, kurių nebūtinai turite žinoti, kad savo projekte galėtumėte naudoti einamąjį vidurkį.

uždelsimas: pradėsiu kalbėti apie šio žingsnio iliustraciją. Pastebėsite, kad daugiau elementų veikiant vidutiniškai vėluojama. Jei jūsų atsakas į vertės pasikeitimą yra labai svarbus, galbūt norėsite naudoti trumpesnį einamąjį vidurkį arba padidinti imties dažnį (matuoti dažniau).

Toliau.

inicializavimas: Kai kalbėjau apie akumuliatoriaus ir uždelsimo elementų inicijavimą, sakiau, kad juos visus reikia inicijuoti iki 0. Arba galite inicijuoti atidėjimo eilutę į viską, kas jums patinka, tačiau akumuliatorius turėtų prasidėti kaip naujausių N elementų suma vėlavimo eilutėje (kur N elementų skaičius jūsų einamame vidurkyje). Jei akumuliatorius pradės veikti kaip bet kuri kita vertė, apskaičiuotas vidurkis bus neteisingas - per mažas arba per didelis, visada ta pačia suma (darant prielaidą, kad pradinės sąlygos). Siūlau pabandyti sužinoti, kodėl taip yra, naudojant „rašiklio ir popieriaus modeliavimą“.

akumuliatoriaus dydis: taip pat turėtumėte atkreipti dėmesį į tai, kad akumuliatorius turėtų būti pakankamai didelis, kad būtų galima įrašyti visų elementų sumą vėlinimo eilutėje, jei visi jie yra teigiami arba neigiami maks. Praktiškai tai reiškia, kad kaupiklis turėtų būti vienu duomenų tipu didesnis už uždelsimo eilutės elementus ir pasirašytas, jei uždelsti eilutės elementai yra pasirašyti.

triukas: ilgos delsos eilutės užima daug atminties. Tai gali greitai tapti problema. Jei jūsų atmintis labai ribota ir jums nelabai rūpi tikslumas, galite apytiksliai apskaičiuoti einamąjį vidurkį, visiškai praleisdami delsą ir tai darydami: atimkite iš kaupiklio 1/N * akumuliatorių ir pridėkite naujos vertės (pavyzdžiui, 8 ilgalaikio veikimo vidurkio pavyzdžiai: kaupiklis = kaupiklis * 7 /8 + newValue). Šis metodas duoda neteisingą rezultatą, tačiau tai yra tinkamas būdas apskaičiuoti einamąjį vidurkį, kai trūksta atminties.

lingvistika: „einantis vidurkis/vidurkis“paprastai naudojamas nurodant vidurkį realiuoju laiku, o „slenkantis vidurkis/vidurkis“paprastai reiškia, kad algoritmas veikia naudojant statinį duomenų rinkinį, pvz., „Excel“skaičiuoklę.

6 žingsnis: Išvada

Tikiuosi, kad šį nurodymą buvo pakankamai lengva suprasti ir jis padės jums tolesniuose projektuose. Nedvejodami rašykite klausimus toliau pateiktose pastabose, jei kas nors neaišku.

Rekomenduojamas: