Բովանդակություն:

Միջին վազքը ձեր միկրոկառավարիչների նախագծերի համար `6 քայլ
Միջին վազքը ձեր միկրոկառավարիչների նախագծերի համար `6 քայլ

Video: Միջին վազքը ձեր միկրոկառավարիչների նախագծերի համար `6 քայլ

Video: Միջին վազքը ձեր միկրոկառավարիչների նախագծերի համար `6 քայլ
Video: 10 միջոց, որոնք կստիպեն տղամարդուն վազել ձեր հետևից 2024, Նոյեմբեր
Anonim
Միջին վազք ձեր միկրոկոնտրոլերների նախագծերի համար
Միջին վազք ձեր միկրոկոնտրոլերների նախագծերի համար

Այս ուսումնական ձեռնարկում ես կբացատրեմ, թե ինչ է միջին վազքը և ինչու պետք է հոգ տանել դրա մասին, ինչպես նաև ցույց կտամ, թե ինչպես այն պետք է կիրառվի առավելագույն հաշվարկային արդյունավետության համար (մի անհանգստացեք բարդության համար, դա շատ պարզ է հասկանալը և ես տրամադրեք հեշտ օգտագործման գրադարան նաև ձեր arduino նախագծերի համար:)

Միջին վազքը, որը սովորաբար կոչվում է նաև շարժական միջին, շարժվող միջին կամ ընթացիկ միջին, տերմին է, որն օգտագործվում է տվյալների շարքերում վերջին N արժեքների միջին արժեքը նկարագրելու համար: Այն կարող է հաշվարկվել նույնքան սովորական միջին հաշվով, կամ կարող եք օգտագործել հնարք, որպեսզի այն նվազագույն ազդեցություն ունենա ձեր ծածկագրի աշխատանքի վրա:

Քայլ 1: Օգտագործեք գործ. Հարթեցրեք ADC չափումները

Օգտագործման դեպք. ADC չափումների հարթեցում
Օգտագործման դեպք. ADC չափումների հարթեցում

Arduino- ն ունի արժանապատիվ 10 բիթանոց ADC ՝ շատ քիչ աղմուկով: Սենսորի արժեքը չափելիս, ինչպիսիք են պոտենցիոմետրը, ֆոտոռեզիստորը կամ բարձր աղմուկի այլ բաղադրիչները, դժվար է վստահել, որ չափումը ճիշտ է:

Լուծումներից մեկն այն է, որ բազմակի չափումներ կատարեք ամեն անգամ, երբ ցանկանում եք կարդալ ձեր տվիչը և չափել դրանք միջինում: Որոշ դեպքերում սա կենսունակ լուծում է, բայց ոչ միշտ: Եթե ցանկանում եք ADC- ն կարդալ վայրկյանում 1000 անգամ, ապա պետք է ունենաք 10 000, եթե միջինում կատարեք 10 չափումներ: Հաշվարկի ժամանակի հսկայական վատնում:

Իմ առաջարկած լուծումն է չափումներ կատարել վայրկյանում 1000 անգամ, ամեն անգամ թարմացնել ընթացիկ միջին արժեքը և օգտագործել այն որպես ընթացիկ արժեք: Այս մեթոդը որոշակի ուշացում է ներկայացնում, բայց նվազեցնում է ձեր դիմումի հաշվարկային բարդությունը ՝ ձեզ ավելի շատ ժամանակ տրամադրելով լրացուցիչ մշակման համար:

Վերոնշյալ նկարում ես օգտագործել եմ վերջին 32 չափումների միջին վազքը: Դուք կտեսնեք, որ այս մեթոդը 100% անթափանց չէ, այլ զգալիորեն բարելավում է ճշգրտությունը (դա ամեն անգամ ավելի վատ չէ, քան միջինում 32 նմուշ յուրաքանչյուր անգամ): Եթե ցանկանայիք յուրաքանչյուր անգամ հաշվարկել միջինը 32 չափում, ապա Arduino UNO- ում միայն չափումների համար կպահանջվեր ավելի քան 0.25 ms:

Քայլ 2: Օգտագործեք պատյան. Խոսափողի ազդանշանի DC բաղադրիչի չափում

Օգտագործման գործ. Խոսափողի ազդանշանի DC բաղադրիչի չափում
Օգտագործման գործ. Խոսափողի ազդանշանի DC բաղադրիչի չափում
Օգտագործման գործ. Խոսափողի ազդանշանի DC բաղադրիչի չափում
Օգտագործման գործ. Խոսափողի ազդանշանի DC բաղադրիչի չափում
Օգտագործման գործ. Խոսափողի ազդանշանի DC բաղադրիչի չափում
Օգտագործման գործ. Խոսափողի ազդանշանի DC բաղադրիչի չափում

Arduino- ն կարող է չափել լարումները 0 -ից մինչև Vcc (սովորաբար 5 Վ) միջև: Աուդիո ազդանշանն ամբողջությամբ AC է, և եթե ցանկանում եք այն չափել միկրոկոնտրոլերի վրա, ապա պետք է կողմնակալ լինեք 1/2 Vcc- ի սահմաններում: Arduino UNO նախագծում դա կնշանակեր մոտավորապես 2,5 Վ (DC) + աուդիո ազդանշան (AC): 10 բիթանոց ADC և 5 Վ սնուցման աղբյուր օգտագործելիս 2,5 Վ կողմնակալությունը պետք է հավասար լինի 512 -ի: Այսպիսով, ազդանշանի AC արժեք ստանալու համար 512 -ը պետք է հանվի ADC չափումից և վերջ, ճիշտ է:

Իդեալական աշխարհում դա ճիշտ կլիներ: Unfortunatelyավոք, իրական կյանքը ավելի բարդ է, և մեր ազդանշանային կողմնակալությունը հակված է շեղվելու: Շատ տարածված է 50 Հց աղմուկը (60 Հց, եթե բնակվում եք ԱՄՆ -ում) էլեկտրական ցանցից: Սովորաբար ամեն ինչ այնքան էլ խնդրահարույց չէ, բայց լավ է իմանալ, որ այն գոյություն ունի: Առավել խնդրահարույց է բաղադրիչների տաքացումից գծային շեղումը: Սկզբից դուք ուշադիր սահմանում եք DC օֆսեթ ուղղումը, և այն կամաց -կամաց հեռանում է, քանի որ ձեր դիմումն աշխատում է:

Ես այս խնդիրը կնկարագրեմ (երաժշտական) ծեծող դետեկտորով: Դուք կարգավորում եք ձեր կողմնակալության հեռացումը, և հարվածները պարզ են (նկար 2): Որոշ ժամանակ անց DC- ի կողմնակալության շարժումները և հարվածները հազիվ նկատելի են միկրոկառավարիչի համար (նկար 3): Beեծի հայտնաբերման ալգորիթմը հետագայում մանրամասն ուսումնասիրվելու է, քանի որ այն գերազանցում է այս հոդվածի շրջանակը:

Բարեբախտաբար, կա մի եղանակ, որն անընդհատ հաշվարկում է ձայնի DC օֆսեթը: Surpriseարմանալի չէ, որ միջին ուսուցման այս թեման, որը լուծելի է, լուծում է տալիս:

Մենք գիտենք, որ ցանկացած AC ազդանշանի միջին արժեքը 0. է: Օգտագործելով այս գիտելիքը, մենք կարող ենք հանել AC+DC ազդանշանի միջին արժեքը, դա DC- ի կողմնակալությունն է: Այն հեռացնելու համար մենք կարող ենք վերցնել վերջին մի քանի արժեքների ընթացիկ միջին արժեքը և այն հանել ADC- ի ընթացիկ ընթերցումից: Նկատի ունեցեք, որ դուք պետք է օգտագործեք բավականաչափ երկար միջին վազք: Աուդիոյի համար պետք է բավարարի վայրկյանի տասներորդը (նմուշների քանակը կախված է ձեր նմուշի արագությունից), բայց իմացեք, որ ավելի երկար միջիններն ավելի լավ են աշխատում: Առաջին նկարում դուք կարող եք տեսնել DC- ի իրական կողմնակալության հաշվարկման օրինակ `64 տարրերով` 1 կՀց նմուշի արագությամբ (իմ առաջարկածից պակաս, բայց այն դեռ աշխատում է):

Քայլ 3: Հաշվարկ

Հաշվարկ
Հաշվարկ

Դուք կարող եք պատկերացնել միջին վազքը որպես բժշկի սպասասրահում գտնվող մարդկանց միջին քաշը: Բժիշկն ավարտում է մեկ հիվանդի հետազոտումը, և միևնույն ժամանակ նորը մտնում է սպասասրահ:

Սպասասրահում սպասող բոլոր հիվանդների միջին քաշը պարզելու համար բուժքույրը կարող էր յուրաքանչյուր հիվանդին հարցնել իրենց քաշի մասին, ավելացնել այդ թվերը և բաժանել հիվանդների թվի վրա: Ամեն անգամ, երբ բժիշկը ընդունում էր նոր հիվանդի, բուժքույրը կրկնում էր ամբողջ գործընթացը:

Դուք կարող եք մտածել. «Սա այնքան էլ արդյունավետ չի հնչում… Դա անելու ավելի լավ միջոց պետք է լինի»: Եվ դուք ճիշտ կլինեիք:

Այս գործընթացը օպտիմալացնելու համար բուժքույրը կարող է պահել հիվանդների ներկա խմբի ընդհանուր քաշի ռեկորդ: Երբ բժիշկը կանչում է նոր հիվանդին, բուժքույրը հարցնում էր նրա քաշի մասին և այն հանում էր ընդհանուր խմբից և բաց էր թողնում նրան: Այնուհետև բուժքույրը հարցնում էր հիվանդին, ով պարզապես սպասասրահ էր մտնում իր քաշի մասին և ավելացնում այն ընդհանուրին: Յուրաքանչյուր հերթափոխից հետո հիվանդների միջին քաշը կլինի քաշերի գումարը `բաժանված հիվանդների թվի վրա (այո, նույնը, ինչ նախկինում, բայց այժմ բուժքույրը միայն երկու հոգու էր հարցնում նրանց քաշի մասին` բոլորի փոխարեն): Ես հասկանում եմ, որ այս պարբերությունը կարող էր մի փոքր շփոթեցնող լինել, ուստի լրացուցիչ պարզության համար խնդրում ենք տե՛ս վերևի նկարը (կամ հարցեր տվեք մեկնաբանություններում):

Բայց նույնիսկ եթե վերջին պարբերությունը շփոթեցնող չեք գտել, կարող եք ունենալ հարցեր, ինչպիսիք են ՝ սկզբում ինչ պետք է լինի կուտակիչում, ինչպե՞ս կարող եմ այն, ինչ հենց նոր կարդացի, տեղադրել իրական C կոդի մեջ: Դրան կանդրադառնա հաջորդ քայլին, որտեղ դուք նույնպես կստանաք իմ սկզբնական կոդը:

Քայլ 4: Կոդ

Օրենսգիրքը
Օրենսգիրքը

Միջին հոսքը հաշվարկելու համար նախ անհրաժեշտ է վերջին N արժեքները պահելու միջոց: Դուք կարող եք ունենալ N տարրերով զանգված և ամբողջ բովանդակությունը մեկ տեղ տեղափոխելիս ամեն անգամ, երբ տարր եք ավելացնում (խնդրում եմ դա մի արեք), կամ կարող եք վերագրել մեկ հին տարր և ցուցիչը հարմարեցնել հաջորդ տարրին, որը դուրս է նետվելու (խնդրում ենք դա անել:)

Կուտակիչը պետք է նախաստորագրվի 0 -ի, նույնը վերաբերում է հետաձգման գծի բոլոր տարրերին: Այլ դեպքում ձեր միջին վազքը միշտ սխալ կլինի: Դուք կտեսնեք, որ delayLine_init- ը հոգում է հետաձգման գծի նախաստորագրումը, դուք ինքներդ պետք է հոգաք կուտակիչի մասին:

Հետաձգման գծին տարր ավելացնելը նույնքան հեշտ է, որքան նոր տարրերի ինդեքսը 1 -ով նվազեցնելը `համոզվելով, որ այն չի մատնանշում ուշացման գծի զանգվածի կողմը: 0 -ի ինդեքսը նվազելուց հետո այն կշրջվի մինչև 255 (քանի որ դա 8 բիթանոց անստորագիր ամբողջ թիվ է): Մոդուլո (%) օպերատորը հետաձգման տողերի զանգվածի չափով կապահովի, որ ինդեքսը մատնանշի վավեր տարր:

Միջին հաշվարկը պետք է հեշտությամբ ընկալվի, եթե հետևեիք նախորդ քայլի իմ անալոգիային: Կուտակիչից հանեք ամենահին տարրը, ավելացրեք նորագույն արժեքը կուտակիչին, նորագույն արժեքը մղեք հետաձգման գծին, վերադարձեք կուտակիչը բաժանված տարրերի քանակով:

Հեշտ է, այնպես չէ՞:

Խնդրում ենք ազատ զգալ փորձարկել կից կոդը ՝ ավելի լավ հասկանալու համար, թե ինչպես է այս ամենը գործում: Այսպես, ներկայումս arduino- ն կարդում է անալոգային արժեքը A0 անալոգի վրա և տպում է «[ADC արժեքը], [միջին վազքը]» սերիական նավահանգստի վրա 115200 բաուդ արագությամբ: Եթե դուք բացեք arduino- ի սերիական գծապատկերը բաուդ ճիշտ արագության վրա, կտեսնեք երկու տող ՝ ADC արժեքը (կապույտ) և հարթեցված արժեքը (կարմիր):

Քայլ 5: Լրացուցիչ

Լրացուցիչ
Լրացուցիչ

Կան մի քանի բաներ, որոնք պարտադիր չէ, որ դուք իմանաք, որպեսզի ձեր նախագծում աշխատող միջին ցուցանիշը օգտագործելու համար իմանալը վնաս չի պատճառի:

ուշացում. ես կսկսեմ խոսել այս քայլի նկարազարդման մասին: Դուք կնկատեք, որ ավելի շատ տարրերի միջին գործարկումը բերում է ավելի մեծ ուշացման: Եթե արժեքի փոփոխման ձեր արձագանքման ժամանակը կրիտիկական է, գուցե ցանկանաք օգտագործել ավելի կարճ միջին վազք կամ բարձրացնել ընտրանքի արագությունը (չափել ավելի հաճախ):

Առաջ անցնել.

նախաստորագրում. Երբ ես խոսում էի կուտակիչի և հետաձգման տարրերի սկզբնավորման մասին, ես ասացի, որ դրանք բոլորը պետք է նախաստորագրել 0 -ի: Այլապես կարող եք սկզբնավորել հետաձգման գիծը այն ամենի համար, ինչ ձեզ դուր է գալիս, բայց կուտակիչը պետք է սկսի որպես հետաձգման գծի նորագույն N տարրերի գումար (որտեղ N ձեր ընթացիկ միջին արժեքի տարրերն են): Եթե կուտակիչը սկսվի որպես ցանկացած այլ արժեք, հաշվարկված միջին արժեքը սխալ կլինի `կամ շատ ցածր, կամ շատ բարձր, միշտ նույն չափով (ենթադրելով նույն սկզբնական պայմանները): Ես առաջարկում եմ փորձել իմանալ, թե ինչու է դա այդպես ՝ օգտագործելով «գրիչ և թուղթ մոդելավորում»:

կուտակիչի չափը. Դուք նաև պետք է նշեք, որ կուտակիչը պետք է լինի բավական մեծ, որպեսզի պահի բոլոր տարրերի գումարը հետաձգման տողում, եթե դրանք բոլորը դրական կամ բացասական առավելագույն են: Գործնականում դա նշանակում է, որ կուտակիչը պետք է լինի տվյալների մեկ տեսակ ավելի մեծ, քան գծի ուշացման տարրերը և ստորագրված լինի, եթե գծի հետաձգման տարրերը ստորագրվեն:

հնարք. Երկար ուշացման տողերը շատ հիշողություն են զբաղեցնում: Դա կարող է արագ խնդիր դառնալ: Եթե հիշողությունը շատ սահմանափակ է և ձեզ շատ չի հետաքրքրում ճշգրտությունը, կարող եք մոտավոր վազքի միջին մոտավորությունը բաց թողնել ամբողջությամբ և փոխարենը դա անել. Կուտակիչից հանեք 1/N * կուտակիչը և ավելացրեք նոր արժեք (8 երկարատև միջին հաշվով. կուտակիչ = կուտակիչ * 7/8 + newValue): Այս մեթոդը սխալ արդյունք է տալիս, բայց դա միջին արժեքի հաշվարկման արժանապատիվ մեթոդ է, երբ հիշողությունը թուլանում է:

լեզվաբանություն. «միջին միջին/միջին», որպես կանոն, օգտագործվում է իրական ժամանակի միջինացմանը անդրադառնալիս, մինչդեռ «շարժվող միջին/միջին» սովորաբար նշանակում է, որ ալգորիթմը գործում է ստատիկ տվյալների հավաքածուի վրա, ինչպիսիք են Excel աղյուսակը:

Քայլ 6: Եզրակացություն

Հուսով եմ, որ այս ուսուցանվողը բավական հեշտ էր հասկանալ, և որ այն կօգնի ձեզ ձեր հետագա ծրագրերում: Խնդրում ենք ազատ զգալ տեղադրել հարցեր ստորև բերված մեկնաբանություններում, եթե որևէ անհասկանալի բան կա:

Խորհուրդ ենք տալիս: