Satura rādītājs:
- 1. darbība. Lietošanas gadījums: ADC mērījumu izlīdzināšana
- 2. darbība. Lietošanas gadījums: Mikrofona signāla līdzstrāvas komponenta mērīšana
- 3. solis: Aprēķins
- 4. solis: kods
- 5. darbība
- 6. darbība. Secinājums
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:52
Š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
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
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
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
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
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:
CP2 Excel vidējais svērtais: 14 soļi
CP2 Excel vidējais svērtais: norādījumi par vidējā svērtā aprēķināšanu programmā Excel. Šajā piemērā programmā Excel tiks izmantotas funkcijas SUMPRODUCT un SUM. Vidējais svērtais rādītājs ir noderīgs, lai aprēķinātu klases vispārējo atzīmi
TUMSUMA LĪMENIS RĀDĪTĀJS: 8 soļi
TUMSUMA LĪMENIS RĀDĪTĀJS: Jūs, iespējams, esat redzējis daudzus arduino projektus, kuros gaisma tiek ieslēgta, kad ir tumšs. Bet vai esat kādreiz domājuši, cik tumšam vajadzētu būt, lai ieslēgtu gaismu. Tātad tagad mēs iemācīsimies izveidot šādu tumsas līmeņa indikatoru, izmantojot arduin
Varavīksnes gaismas diodes jūsu projektiem: 4 soļi (ar attēliem)
Varavīksnes gaismas diodes jūsu projektiem: Sveiki! Es izmantoju šīs gaismas diodes daudziem dekoratīviem projektiem, un rezultāts vienmēr ir pārsteidzošs, tāpēc es vēlos dalīties ar jums savā pieredzē. Es redzēju, ka daudzi cilvēki pērk RGB LED sloksnes kontrolierus un izmanto 3 vai 5 krāsu maiņas režīms tikai uz
Partizānu akumulatora turētājs jūsu maizes dēļa / Arduino projektiem: 3 soļi
Partizānu akumulatora turētājs jūsu maizes dēļa / Arduino projektiem: Es eksperimentēju ar DS1307 un Arduino, man bija jāatrod veids, kā pieslēgt CR1212 akumulatoru. Es rakņājos savā savienotāju kastē un neatradu neko, kas varētu palīdzēt. Tad, eur ê ka! Man bija apgaismojums
BEZMAKSAS MAKSAS ** saraksts jūsu projektiem: 8 soļi
Saraksts ar ** BEZMAKSAS MAKSĀJUMIEM ** jūsu projektiem: Šis ir saraksts ar vietām, no kurām varat saņemt BEZMAKSAS lietas, kuras varat izmantot savos projektos …. Tas ir bez maksas, un preces tiek piegādātas bez maksas, jā, cerams, ka jums patīk saraksts! Labi, tāpēc es organizēju šo pamācību pēc produkta veida. PM man, ja jums ir vietne