Përmbajtje:

Mesatarja e funksionimit për projektet tuaja mikrokontrolluese: 6 hapa
Mesatarja e funksionimit për projektet tuaja mikrokontrolluese: 6 hapa

Video: Mesatarja e funksionimit për projektet tuaja mikrokontrolluese: 6 hapa

Video: Mesatarja e funksionimit për projektet tuaja mikrokontrolluese: 6 hapa
Video: Измерение 5A-30A переменного и постоянного тока с использованием ACS712 с библиотекой Robojax 2024, Nëntor
Anonim
Mesatarja e Drejtimit për Projektet tuaja Mikrokontrolluese
Mesatarja e Drejtimit për Projektet tuaja Mikrokontrolluese

Në këtë udhëzues do të shpjegoj se çfarë është mesatarja e vrapimit dhe pse duhet të kujdeseni për të, si dhe t'ju tregoj se si duhet të zbatohet për efikasitet maksimal llogaritës (mos u shqetësoni për kompleksitetin, është shumë e thjeshtë për tu kuptuar dhe unë do siguroni një bibliotekë të lehtë për t’u përdorur edhe për projektet tuaja arduino:)

Mesatarja e drejtimit, gjithashtu e referuar zakonisht si mesatare lëvizëse, mesatare lëvizëse ose mesatare e drejtimit, është një term i përdorur për të përshkruar vlerën mesatare të vlerave të fundit N në seritë e të dhënave. Mund të llogaritet si mesatarja normale ose mund të përdorni një truk për ta bërë atë të ketë një ndikim minimal në performancën e kodit tuaj.

Hapi 1: Rasti i Përdorimit: Zbutja e Matjeve ADC

Rasti i Përdorimit: Zbutja e Matjeve ADC
Rasti i Përdorimit: Zbutja e Matjeve ADC

Arduino ka një ADC të mirë 10 bit me shumë pak zhurmë. Kur matni vlerën në një sensor të tillë si potenciometri, fotorezistori ose përbërës të tjerë me zhurmë të lartë, është e vështirë të besohet se matja është e saktë.

Një zgjidhje është që të bëni matje të shumta çdo herë që dëshironi të lexoni sensorin tuaj dhe t'i llogaritni ato mesatarisht. Në disa raste kjo është një zgjidhje e zbatueshme, por jo gjithmonë. Nëse dëshironi të lexoni ADC 1000 herë në sekondë, do t'ju duheshin 10 000 nëse do të kishit mesatarisht 10 matje. Një humbje e madhe e kohës së llogaritjes.

Zgjidhja ime e propozuar është marrja e matjeve 1000 herë në sekondë, përditësimi i mesatares së funksionimit çdo herë dhe përdorimi i saj si vlerë aktuale. Kjo metodë prezanton një vonesë, por zvogëlon kompleksitetin llogaritës të aplikacionit tuaj, duke ju dhënë shumë më tepër kohë për përpunim shtesë.

Në foton e mësipërme kam përdorur mesataren e 32 matjeve të fundit. Do të shihni që kjo metodë nuk është 100% e papërshtatshme, por përmirëson ndjeshëm saktësinë (nuk është më keq sesa mesatarja e 32 mostrave çdo herë). Nëse dëshironi të llogaritni mesatarisht 32 matje çdo herë, kjo do të marrë mbi 0.25 ms në Arduino UNO vetëm për matjet!

Hapi 2: Rasti i Përdorimit: Matja e Komponentit DC të Sinjalit të Mikrofonit

Rasti i Përdorimit: Matja e Komponentit DC të Sinjalit të Mikrofonit
Rasti i Përdorimit: Matja e Komponentit DC të Sinjalit të Mikrofonit
Rasti i Përdorimit: Matja e Komponentit DC të Sinjalit të Mikrofonit
Rasti i Përdorimit: Matja e Komponentit DC të Sinjalit të Mikrofonit
Rasti i Përdorimit: Matja e Komponentit DC të Sinjalit të Mikrofonit
Rasti i Përdorimit: Matja e Komponentit DC të Sinjalit të Mikrofonit

Arduino mund të masë tensionet midis 0 dhe Vcc (normalisht 5 V). Sinjali audio është plotësisht AC dhe nëse doni ta matni atë në një mikrokontrollues, duhet ta anoni rreth 1/2 Vcc. Në një projekt Arduino UNO që do të thoshte afërsisht 2.5 V (DC) + sinjal audio (AC). Kur përdorni ADC 10 bit dhe furnizim me energji 5 V, paragjykimi 2.5 V duhet të jetë i barabartë me 512. Pra, për të marrë një vlerë AC të sinjalit, 512 duhet të zbritet nga matja ADC dhe kjo është ajo, apo jo?

Në një botë ideale, kjo do të ishte e vërtetë. Fatkeqësisht, jeta reale është më e ndërlikuar dhe paragjykimi ynë i sinjalit tenton të ndryshojë. Shumë e zakonshme është zhurma 50 Hz (60 Hz nëse jetoni në SHBA) nga rrjeti elektrik. Zakonisht nuk është gjithçka shumë problematike, por është mirë të dini se ekziston. Më problematike është zhvendosja lineare nga ngrohja e përbërësve. Ju vendosni me kujdes korrigjimin e kompensimit DC në fillim dhe ai ngadalë largohet ndërsa aplikacioni juaj po funksionon.

Unë do ta ilustroj këtë problem me një detektor të rrahjeve (të muzikës). Ju konfiguroni heqjen e paragjykimit tuaj dhe rrahjet janë të qarta (figura 2). Pas ca kohësh, lëvizjet e paragjykimeve DC dhe rrahjet janë mezi të dukshme për mikrokontrolluesin (figura 3). Algoritmi i zbulimit të rrahjeve do të eksplorohet në thellësi në një udhëzues të ardhshëm pasi tejkalon fushën e këtij artikulli.

Për fat të mirë ekziston një mënyrë për të mbajtur vazhdimisht llogaritjen e kompensimit DC të audios. Nuk do të jetë për t'u habitur që mesatarja e drejtimit, tema e këtij udhëzimi, jep një zgjidhje.

Ne e dimë se vlera mesatare e çdo sinjali AC është 0. Duke përdorur këtë njohuri, ne mund të zbresim se vlera mesatare e sinjalit AC+DC është paragjykimi i saj DC. Për ta hequr atë, ne mund të marrim një mesatare të vlerave të fundit dhe ta zbresim atë nga leximi aktual ADC. Vini re se duhet të përdorni një mesatare mjaft të gjatë drejtimi. Për audio, një e dhjeta e sekondës (numri i mostrave varet nga shkalla e mostrës suaj) duhet të jetë e mjaftueshme, por dijeni se mesataret më të gjata funksionojnë më mirë. Në foton e parë mund të shihni shembullin e llogaritjes së paragjykimit të vërtetë DC me mesataren e funksionimit me 64 elementë në normën e mostrës 1 kHz (më pak se unë rekomandova, por ende funksionon).

Hapi 3: Llogaritja

Llogaritja
Llogaritja

Ju mund ta imagjinoni vrapimin mesatar si peshën mesatare të njerëzve në dhomën e pritjes së mjekut. Mjeku përfundon ekzaminimin e një pacienti dhe njëkohësisht një i ri hyn në dhomën e pritjes.

Për të gjetur peshën mesatare të të gjithë pacientëve që presin në dhomën e pritjes, infermierja pastaj mund të pyesë secilin pacient për peshën e tyre, t'i shtojë ato numra dhe ta ndajë me numrin e pacientëve. Sa herë që mjeku pranon pacient të ri, infermierja përsëriste të gjithë procesin.

Ju mund të mendoni: "Kjo nuk tingëllon shumë efikase … Duhet të ketë një mënyrë më të mirë për ta bërë këtë." Dhe do të kishit të drejtë.

Për të optimizuar këtë proces, infermierja mund të mbajë një rekord të peshës totale të grupit aktual të pacientëve. Sapo mjeku thërret pacientin e ri, infermierja e pyet atë për peshën e tij dhe e zbret nga grupi i përgjithshëm dhe e lërë të shkojë. Infermierja do të pyeste pacientin që sapo hyri në dhomën e pritjes për peshën e tij dhe e shtoi atë në total. Pesha mesatare e pacientëve pas çdo ndërrimi do të ishte shuma e peshave e ndarë me numrin e pacientëve (po, njësoj si më parë, por tani infermierja pyeti vetëm dy persona për peshën e tyre në vend të të gjithë). E kuptoj që ky paragraf mund të ketë qenë pak konfuz, kështu që ju lutemi shihni ilustrimin më lart për qartësi shtesë (ose bëni pyetje në komente).

Por edhe nëse nuk e gjetët paragrafin e fundit konfuz ju mund të keni pyetje të tilla si ajo që duhet të jetë në akumulator në fillim, si mund ta vendos atë që sapo lexova në një kod C aktual? Kjo do të adresohet në hapin tjetër, ku do të merrni edhe kodin tim burimor.

Hapi 4: Kodi

Kodi
Kodi

Për të llogaritur mesataren e funksionimit, së pari keni nevojë për një mënyrë për të ruajtur vlerat e fundit N. mund të keni një grup me elementë N dhe të zhvendosni të gjithë përmbajtjen në një vend sa herë që shtoni një element (ju lutemi mos e bëni këtë), ose mund të mbishkruani një element të vjetër dhe të rregulloni treguesin në elementin tjetër që do të hidhet jashtë (ju lutemi bëni këtë:)

Akumulatori duhet të fillojë në 0, e njëjta gjë vlen për të gjithë elementët në vijën e vonesës. Në raste të tjera, mesatarja juaj e vrapimit do të jetë gjithmonë e gabuar. Do të shihni që delayLine_init kujdeset për inicimin e vijës së vonesës, ju duhet të kujdeseni vetë për akumulatorin.

shtimi i një elementi në vijën e vonesës është aq e lehtë sa zvogëlimi i indeksit të elementit më të ri me 1, duke u siguruar që nuk tregon anën e grupit të linjës së vonesës. pas zvogëlimit të indeksit kur është 0, do të sillet rreth 255 (sepse është një numër i plotë i pa shënuar 8 bit). Operatori Modulo (%) me madhësinë e grupit të linjës së vonesës do të sigurojë që indeksi të tregojë një element të vlefshëm.

Llogaritja e një mesatareje drejtuese duhet të jetë e lehtë për tu kuptuar nëse ndiqni analogjinë time në hapin e mëparshëm. Zbritni elementin më të vjetër nga akumulatori, shtoni vlerën më të re në akumulator, shtyni vlerën më të re në vijën e vonesës, kthejeni akumulatorin e ndarë me numrin e elementeve.

E lehtë, apo jo?

Ju lutemi mos ngurroni të eksperimentoni me përdorimin e kodit të bashkangjitur për të kuptuar më mirë se si funksionon e gjithë kjo. Siç është aktualisht, arduino lexon vlerën analoge në pinin analog A0 dhe printon "[vlera ADC], [mesatarja e funksionimit]" në portin serik me një shpejtësi 115200 baud. Nëse hapni komplotuesin serik të arduino -s mbi normën e duhur të baudit, do të shihni dy rreshta: vlera ADC (blu) dhe vlera e zbutur (e kuqe).

Hapi 5: Shtesa

Shtesa
Shtesa

Ka disa gjëra që nuk keni nevojë të dini domosdoshmërisht për të përdorur mesataren e funksionimit në projektin tuaj nuk do të dëmtojë t'i dini.

vonesë: Do të filloj duke folur për ilustrimin e këtij hapi. Ju do të vini re se mesatarja e funksionimit të më shumë elementeve sjell vonesa më të mëdha. Nëse koha juaj e përgjigjes për të ndryshuar vlerën është kritike, ju mund të dëshironi të përdorni mesataren më të shkurtër të funksionimit ose të rrisni shkallën e mostrës (matni më shpesh).

Duke vazhduar.

inicializimi: Kur fola për fillimin e elementeve të akumulatorit dhe vonesës, thashë se duhet t'i inicializoni të gjitha në 0. Përndryshe, ju mund të iniconi vijën e vonesës për çdo gjë që ju pëlqen, por akumulatori duhet të fillojë si një shumë e elementeve më të rinj N në vijën e vonesës (ku N është numri i elementeve në mesataren tuaj të funksionimit). Nëse akumulatori fillon si çdo vlerë tjetër, mesatarja e llogaritur do të jetë e gabuar - ose shumë e ulët ose shumë e lartë, gjithmonë me të njëjtën sasi (duke supozuar të njëjtat kushte fillestare). Unë ju sugjeroj të provoni të mësoni pse është kështu duke përdorur një "simulim me stilolaps dhe letër".

Madhësia e akumulatorit: Ju gjithashtu duhet të vini re se akumulatori duhet të jetë mjaft i madh për të ruajtur shumën e të gjithë elementëve në vijën e vonesës, nëse ato janë të gjitha maksimale pozitive ose negative. Praktikisht kjo do të thotë që akumulatori duhet të jetë një lloj i të dhënave më i madh se elementët e linjës së vonesës dhe të nënshkruhet, nëse elementët e linjës së vonesës janë nënshkruar.

truku: Linjat me vonesë të gjatë marrin shumë kujtesë. Kjo shpejt mund të bëhet problem. Nëse jeni shumë të kufizuar në kujtesë dhe nuk kujdeseni shumë për saktësinë, mund të përafroni mesataren e vrapimit duke hequr plotësisht vonesën dhe duke e bërë këtë në vend të kësaj: zbritni akumulatorin 1/N * nga akumulatori dhe shtoni vlerë të re (në shembullin e mesatares prej 8 kohësh të funksionimit të gjatë: akumulator = akumulator * 7/8 + vlerë e re). Kjo metodë jep rezultat të gabuar, por është një metodë e mirë e llogaritjes së mesatares së vrapimit kur keni pak memorie.

gjuhësi: "mesatarja/mesatarja e vrapimit" përdoret zakonisht kur i referohemi mesatareve në kohë reale ndërsa "mesatarja në lëvizje/mesatarja" zakonisht do të thotë që algoritmi po funksionon në grupin e të dhënave statike siç është spreadsheet Excel.

Hapi 6: Përfundimi

Shpresoj se kjo e mësueshme ishte mjaft e lehtë për tu kuptuar dhe se do t'ju ndihmojë në projektet tuaja të ardhshme. Ju lutemi mos ngurroni të postoni pyetje në komentet më poshtë nëse ka ndonjë gjë të paqartë.

Recommended: