Satura rādītājs:

Vidējais rādītājs jūsu mikrokontrolleru projektiem: 6 soļi
Vidējais rādītājs jūsu mikrokontrolleru projektiem: 6 soļi
Anonim
Vidējais rādītājs jūsu mikrokontrolleru projektiem
Vidējais rādītājs jūsu mikrokontrolleru projektiem

Šajā pamācībā es paskaidrošu, kas ir vidējais rādītājs un kāpēc jums par to vajadzētu rūpēties, kā arī parādīšu, kā tas jāievieš, lai panāktu maksimālu skaitļošanas efektivitāti (neuztraucieties par sarežģītību, to ir ļoti vienkārši saprast, un es to darīšu) nodrošiniet arī viegli lietojamu bibliotēku saviem arduino projektiem:)

Ritošais vidējais, ko parasti dēvē arī par slīdošo vidējo, slīdošo vidējo vai tekošo vidējo, ir termins, ko izmanto, lai aprakstītu pēdējo N vērtību vidējo vērtību datu sērijās. To var aprēķināt tāpat kā parasti, vai arī varat izmantot triku, lai tas minimāli ietekmētu jūsu koda darbību.

1. darbība. Lietošanas gadījums: ADC mērījumu izlīdzināšana

Lietošanas gadījums: ADC mērījumu izlīdzināšana
Lietošanas gadījums: ADC mērījumu izlīdzināšana

Arduino ir pienācīgs 10 bitu ADC ar ļoti mazu troksni. Mērot sensoru, piemēram, potenciometru, fotorezistoru vai citus augsta trokšņa komponentus, ir grūti ticēt, ka mērījums ir pareizs.

Viens risinājums ir veikt vairākus mērījumus katru reizi, kad vēlaties nolasīt sensoru, un tos vidēji aprēķināt. Dažos gadījumos tas ir dzīvotspējīgs risinājums, bet ne vienmēr. Ja jūs vēlētos lasīt ADC 1000 reizes sekundē, jums būtu jāiegūst 10 000, ja vidēji veiktu 10 mērījumus. Milzīga skaitļošanas laika izšķiešana.

Mans piedāvātais risinājums ir mērījumus veikt 1000 reizes sekundē, katru reizi atjaunināt vidējo rādītāju un izmantot to kā pašreizējo vērtību. Šī metode ievieš zināmu latentumu, bet samazina jūsu lietojumprogrammas skaitļošanas sarežģītību, dodot daudz vairāk laika papildu apstrādei.

Augšējā attēlā es izmantoju pēdējo 32 mērījumu vidējo rādītāju. Jūs redzēsit, ka šī metode nav 100% droša pret kļūmēm, taču tā ievērojami uzlabo precizitāti (tā nav sliktāka par vidēji 32 paraugiem katru reizi). Ja vēlaties katru reizi aprēķināt vidēji 32 mērījumus, Arduino UNO mērījumu veikšanai būtu nepieciešami vairāk nekā 0,25 ms!

2. darbība. Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana

Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana
Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana
Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana
Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana
Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana
Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana

Arduino var izmērīt spriegumu no 0 līdz Vcc (parasti 5 V). Audio signāls ir pilnīgi maiņstrāva, un, ja vēlaties to izmērīt ar mikrokontrolleri, tas ir jānovirza ap 1/2 Vcc. Arduino UNO projektā tas nozīmētu aptuveni 2,5 V (DC) + audio signālu (AC). Lietojot 10 bitu ADC un 5 V barošanas avotu, 2,5 V novirzei jābūt vienādai ar 512. Tātad, lai iegūtu signāla maiņstrāvas vērtību, 512 ir jāatņem no ADC mērījumiem, un tā ir, vai ne?

Ideālā pasaulē tā būtu taisnība. Diemžēl reālā dzīve ir sarežģītāka, un mūsu signālu aizspriedumi mēdz novirzīties. Ļoti izplatīts ir 50 Hz troksnis (60 Hz, ja dzīvojat ASV) no elektrotīkla. Parasti tas nav pārāk problemātiski, bet ir labi zināt, ka tas pastāv. Vairāk problemātiska ir lineāra novirze no sastāvdaļu sildīšanas. Sākumā uzmanīgi iestatāt līdzstrāvas nobīdes korekciju, un tā lietojumprogrammas darbības laikā lēnām aizplūst.

Es ilustrēšu šo problēmu ar (mūzikas) sitienu detektoru. Jūs iestatāt aizspriedumu noņemšanu un sitieni ir skaidri (2. attēls). Pēc kāda laika DC novirzes kustas un sitieni ir tikko pamanāmi mikrokontrolleram (3. attēls). Pārsitumu noteikšanas algoritms tiks padziļināti izpētīts turpmākā pamācībā, jo tas pārsniedz šī raksta darbības jomu.

Par laimi ir veids, kā pastāvīgi aprēķināt audio līdzstrāvas nobīdi. Nebūs pārsteigums, ka vidējais rādītājs, šī pamācības tēma, sniedz risinājumu.

Mēs zinām, ka jebkura maiņstrāvas signāla vidējā vērtība ir 0. Izmantojot šīs zināšanas, mēs varam atskaitīt, ka maiņstrāvas+līdzstrāvas signāla vidējā vērtība ir līdzstrāvas novirze. Lai to noņemtu, mēs varam ņemt pēdējo pēdējo vērtību vidējo rādītāju un atņemt to no pašreizējā ADC rādījuma. Ņemiet vērā, ka jums jāizmanto pietiekami ilgs darbības vidējais rādītājs. Skaņai vajadzētu pietikt ar sekundes desmitdaļu (paraugu skaits ir atkarīgs no jūsu izlases ātruma), taču ziniet, ka garāki vidējie rādītāji darbojas labāk. Pirmajā attēlā var redzēt reālas līdzstrāvas slīpuma aprēķina piemēru ar vidējo rādītāju ar 64 elementiem ar 1 kHz izlases frekvenci (mazāk nekā es ieteicu, bet tas joprojām darbojas).

3. solis: Aprēķins

Aprēķins
Aprēķins

Jūs varat iedomāties vidējo rādītāju kā vidējo cilvēku svaru ārsta uzgaidāmajā telpā. Ārsts pabeidz viena pacienta pārbaudi un vienlaikus uzgaidāmajā telpā ieiet jauns.

Lai uzzinātu visu gaidīšanas telpā gaidāmo pacientu vidējo svaru, medmāsa pēc tam varētu jautāt katram pacientam par viņa svaru, saskaitīt šos skaitļus un dalīt ar pacientu skaitu. Katru reizi, kad ārsts pieņem jaunu pacientu, medmāsa atkārto visu procesu.

Jūs varētu domāt: "Tas neizklausās pārāk efektīvi… Ir jābūt labākam veidam, kā to izdarīt." Un jums būtu taisnība.

Lai optimizētu šo procesu, medmāsa varētu reģistrēt pašreizējās pacientu grupas kopējo svaru. Tiklīdz ārsts piezvana jaunam pacientam, medmāsa jautāja viņam par viņa svaru un atņēma to no kopējās grupas un atlaida viņu. Medmāsa pēc tam jautāja pacientam, kurš tikko ienāca uzgaidāmajā telpā, par viņa svaru un pievienoja to kopējam skaitam. Vidējais pacientu svars pēc katras maiņas būtu svaru summa, kas dalīta ar pacientu skaitu (jā, tāpat kā iepriekš, bet tagad medmāsa jautāja tikai diviem cilvēkiem par viņu svaru, nevis visiem). Es saprotu, ka šis punkts varētu būt nedaudz mulsinošs, tāpēc, lai iegūtu papildu skaidrību, lūdzu, skatiet iepriekš redzamo ilustrāciju (vai uzdodiet jautājumus komentāros).

Bet pat tad, ja pēdējā rindkopa nešķita mulsinoša, jums varētu rasties jautājumi, piemēram, tam, kam sākumā vajadzētu būt akumulatorā, kā ievietot tikko izlasīto faktiskajā C kodā? Tas tiks risināts nākamajā darbībā, kur jūs iegūsit arī manu avota kodu.

4. solis: kods

Kods
Kods

Lai aprēķinātu vidējo rādītāju, vispirms ir nepieciešams veids, kā saglabāt pēdējās N vērtības. jums varētu būt masīvs ar N elementiem un pārvietot visu saturu uz vienu vietu katru reizi, kad pievienojat kādu elementu (lūdzu, nedariet to), vai arī varat pārrakstīt vienu veco elementu un pielāgot rādītāju nākamajam izmetamajam elementam (lūdzu, dariet to:)

Akumulators jāuzsāk inicializēt līdz 0, tas pats attiecas uz visiem aizkaves rindas elementiem. Citos gadījumos jūsu vidējais rādītājs vienmēr būs nepareizs. Jūs redzēsit, ka delayLine_init rūpējas par aizkaves līnijas inicializēšanu, jums pašam jārūpējas par akumulatoru.

Elementa pievienošana aizkaves līnijai ir tikpat vienkārša kā jaunākā elementa indeksa samazināšana par 1, pārliecinoties, ka tas nenorāda uz aizkaves līniju masīva pusi. pēc indeksa samazināšanas, kad tas ir 0, tas sasniegs cilpu līdz 255 (jo tas ir 8 bitu neparakstīts vesels skaitlis). Modulo (%) operators ar kavējuma līniju masīva lielumu nodrošinās, ka indekss norādīs uz derīgu elementu.

Rēķinot vidējo rādītāju, vajadzētu būt viegli saprotamam, ja iepriekšējā solī ievērojāt manu analoģiju. Atņemiet no akumulatora vecāko elementu, pievienojiet akumulatoram jaunāko vērtību, novietojiet jaunāko vērtību aizkaves rindai, atdodiet akumulatoru, dalītu ar elementu skaitu.

Viegli, vai ne?

Lūdzu, nekautrējieties eksperimentēt, izmantojot pievienoto kodu, lai labāk izprastu, kā tas viss darbojas. Pašlaik arduino nolasa analogo vērtību uz analogās tapas A0 un izdrukā "[ADC vērtība], [darbības vidējais]" sērijas portā ar 115200 bodu ātrumu. Ja atverat arduino sērijas ploteri ar pareizu pārraides ātrumu, redzēsit divas rindas: ADC vērtība (zila) un izlīdzināta vērtība (sarkana).

5. darbība

Papildus
Papildus

Ir dažas lietas, kuras jums nav obligāti jāzina, lai savā projektā izmantotu vidējo rādītāju.

kavēšanās: Sākšu ar sarunu par šī soļa ilustrāciju. Jūs pamanīsit, ka vairāk elementu vidējais rādītājs rada lielāku kavēšanos. Ja jūsu reakcijas laiks uz vērtības izmaiņām ir kritisks, iespējams, vēlēsities izmantot īsāku vidējo rādītāju vai palielināt izlases ātrumu (mērīt biežāk).

Virzoties tālāk.

inicializēšana: Kad es runāju par akumulatora un aizkaves elementu inicializēšanu, es teicu, ka tie visi jāinicializē uz 0. Alternatīvi jūs varat inicializēt aizkaves rindu uz visu, kas jums patīk, bet akumulatoram jāsākas kā jaunāko N elementu summai aizkaves rindā (kur N ir elementu skaits jūsu vidējā vidējā rādītājā). Ja akumulators sākas kā jebkura cita vērtība, aprēķinātais vidējais rādītājs būs nepareizs - vai nu pārāk zems, vai pārāk augsts, vienmēr par tādu pašu summu (pieņemot vienādus sākotnējos nosacījumus). Es iesaku jums mēģināt uzzināt, kāpēc tas tā ir, izmantojot kādu "pildspalvas un papīra simulāciju".

akumulatora izmērs. Ņemiet vērā arī to, ka akumulatoram jābūt pietiekami lielam, lai aizkaves rindā saglabātu visu elementu summu, ja tie visi ir pozitīvi vai negatīvi maks. Praktiski tas nozīmē, ka akumulatoram vajadzētu būt par vienu datu tipu lielākam par aizkaves rindas elementiem un parakstītam, ja tiek parakstīti aizkaves rindas elementi.

triks: garas aizkaves līnijas aizņem daudz atmiņas. Tas var ātri kļūt par problēmu. Ja jums ir ļoti ierobežota atmiņa un jūs īpaši neuztraucaties par precizitāti, varat noteikt aptuveno vidējo rādītāju, pilnībā izlaižot aizkavi un to darot: atņemiet 1/N * akumulatoru no akumulatora un pievienojiet jaunu vērtību (piemēram, 8 vidējie rādītāji): akumulators = akumulators * 7/8 + newValue). Šī metode dod nepareizu rezultātu, taču tā ir pienācīga metode, kā aprēķināt vidējo rādītāju, ja atmiņas līmenis ir zems.

lingvistika: "tekošais vidējais/vidējais" parasti tiek lietots, atsaucoties uz vidējo reāllaika rādītāju, savukārt "mainīgais vidējais/vidējais" parasti nozīmē, ka algoritms darbojas ar statisku datu kopu, piemēram, Excel izklājlapu.

6. darbība. Secinājums

Es ceru, ka šo pamācību bija pietiekami viegli saprast un ka tā jums palīdzēs turpmākajos projektos. Lūdzu, ievietojiet jautājumus komentāros zemāk, ja kaut kas nav skaidrs.

Ieteicams: