Mundarija:

Mikrokontroller loyihalari uchun o'rtacha ish vaqti: 6 qadam
Mikrokontroller loyihalari uchun o'rtacha ish vaqti: 6 qadam

Video: Mikrokontroller loyihalari uchun o'rtacha ish vaqti: 6 qadam

Video: Mikrokontroller loyihalari uchun o'rtacha ish vaqti: 6 qadam
Video: Uy chizmasi 3D xolatda.Savdo uchun dukon ham joylashtirilgan 2024, Noyabr
Anonim
Sizning mikrokontroller loyihalaringiz uchun o'rtacha ishlash
Sizning mikrokontroller loyihalaringiz uchun o'rtacha ishlash

Bu yo'riqnomada men ishlaydigan o'rtacha nima ekanligini va nima uchun unga g'amxo'rlik qilish kerakligini tushuntirib beraman, shuningdek, maksimal hisoblash samaradorligi uchun uni qanday amalga oshirish kerakligini ko'rsataman (murakkablikdan xavotir olmang, buni tushunish juda oson va men tushunaman) arduino loyihalaringiz uchun ham foydalanish oson bo'lgan kutubxonani taqdim eting:)

Yugurish o'rtacha, shuningdek, harakatlanuvchi o'rtacha, harakatlanuvchi o'rtacha yoki yugurish o'rtacha deb ham ataladi, bu ma'lumotlar seriyasidagi oxirgi N qiymatlarining o'rtacha qiymatini tavsiflash uchun ishlatiladigan atama. Bu oddiy o'rtacha kabi hisoblanishi mumkin yoki siz kodingizning ishlashiga minimal ta'sir ko'rsatadigan hiyla ishlatishingiz mumkin.

1 -qadam: Foydalanish holati: ADC o'lchovlarini yumshatish

Foydalanish holati: ADC o'lchovlarini yumshatish
Foydalanish holati: ADC o'lchovlarini yumshatish

Arduino juda kam shovqinli 10 bitli ADC -ga ega. Sensor, masalan, potentsiometr, fotorezistor yoki boshqa shovqinli komponentlar qiymatini o'lchashda, to'g'ri o'lchashga ishonish qiyin.

Bitta yechim - har safar sensorni o'qishni xohlaganingizda bir nechta o'lchovlarni bajarish va ularni o'rtacha hisoblash. Ba'zi hollarda, bu to'g'ri echim, lekin har doim ham emas. Agar siz ADC ni sekundiga 1000 marta o'qishni xohlasangiz, o'rtacha 10 ta o'lchovni olganingizda 10 000 o'qishingiz kerak bo'ladi. Hisoblash vaqtini behuda sarflash.

Men taklif qilgan yechim - sekundiga 1000 marta o'lchash, har safar ishlaydigan o'rtacha ko'rsatkichni yangilash va uni joriy qiymat sifatida ishlatish. Bu usul biroz kechikishni keltirib chiqaradi, lekin sizning ilovangizning hisoblash murakkabligini kamaytiradi, bu sizga qo'shimcha ishlov berish uchun ko'proq vaqt beradi.

Yuqoridagi rasmda men oxirgi 32 o'lchovning o'rtacha ishlaganini ishlatganman. Siz ko'rasiz, bu usul 100% bardoshli emas, lekin aniqlikni sezilarli darajada yaxshilaydi (bu har safar o'rtacha 32 ta namunani olishdan ko'ra yomon emas). Agar siz har safar o'rtacha 32 o'lchovni hisoblashni xohlasangiz, bu faqat o'lchovlar uchun Arduino UNOda 0,25 milodiydan oshadi!

2 -qadam: Foydalanish holati: Mikrofon signalining shahar komponentini o'lchash

Foydalanish holati: Mikrofon signalining shahar komponentini o'lchash
Foydalanish holati: Mikrofon signalining shahar komponentini o'lchash
Foydalanish holati: Mikrofon signalining shahar komponentini o'lchash
Foydalanish holati: Mikrofon signalining shahar komponentini o'lchash
Foydalanish holati: Mikrofon signalining shahar komponentini o'lchash
Foydalanish holati: Mikrofon signalining shahar komponentini o'lchash

Arduino 0 va Vcc (odatda 5 V) orasidagi kuchlanishni o'lchashi mumkin. Ovozli signal butunlay o'zgaruvchan va agar siz uni mikrokontrolderda o'lchashni xohlasangiz, uni 1/2 Vcc atrofida o'zgartirishingiz kerak. Arduino UNO loyihasida bu taxminan 2,5 V (shahar) + audio signal (AC) degan ma'noni anglatadi. 10 bitli ADC va 5 V quvvat manbalaridan foydalanganda 2,5 V kuchlanish 512 ga teng bo'lishi kerak. Shunday qilib, signalning o'zgaruvchan qiymatini olish uchun ADC o'lchovidan 512ni olib tashlash kerak, to'g'rimi?

Ideal dunyoda bu to'g'ri bo'lardi. Afsuski, haqiqiy hayot murakkabroq va bizning signal tarafkashligimiz o'zgarib ketadi. Elektr tarmog'idan 50 Gts shovqin (agar siz AQShda yashasangiz, 60 Gts) juda keng tarqalgan. Odatda bu juda ham muammo emas, lekin uning mavjudligini bilish yaxshi. Komponentlarni isitishdan chiziqli siljish yanada muammoli. Siz boshida DC ofset tuzatishini ehtiyotkorlik bilan o'rnatdingiz va sizning ilovangiz ishlayotganda u asta -sekin o'chib ketadi.

Men bu muammoni (musiqa) zarba detektori bilan tasvirlab beraman. Siz o'zingizni noto'g'ri aniqlashni o'rnatasiz va zarbalar aniq (2 -rasm). Bir muncha vaqt o'tgach, mikrokontrollerda shahar o'zgarishi va zarbalari deyarli sezilmaydi (3 -rasm). Kaltakni aniqlash algoritmi kelajakda batafsil o'rganiladi, chunki bu maqola doirasidan oshib ketadi.

Yaxshiyamki, doimiy ravishda ovozning doimiy ofsetini hisoblashni davom ettirish mumkin. O'rtacha ishlaydigan, bu ko'rsatmali mavzuni hal qilish uchun ajablanarli joyi yo'q.

Biz bilamizki, har qanday o'zgaruvchan tok signalining o'rtacha qiymati 0 ga teng. Bu ma'lumotdan foydalanib, biz AC+shahar signalining o'rtacha qiymatini bu shaharga to'g'ri kelmasligini aniqlay olamiz. O'chirish uchun biz oxirgi bir necha qiymatlarning o'rtacha ishlaydigan qiymatini olamiz va uni joriy ADC o'qishidan olib tashlashimiz mumkin. E'tibor bering, siz etarlicha uzoq ishlaydigan o'rtacha qiymatdan foydalanishingiz kerak. Ovoz uchun sekundning o'ndan bir qismi (namunalar soni sizning namuna tezligingizga bog'liq) etarli bo'lishi kerak, lekin bilingki, uzoqroq o'rtacha ko'rsatkichlar yaxshiroq ishlaydi. Birinchi rasmda siz 1 kHz namuna tezligida 64 ta element bilan ishlaydigan o'rtacha DC ko'rsatkichini ko'rishingiz mumkin (men tavsiya qilganimdan kamroq, lekin u hali ham ishlaydi).

3 -qadam: Hisoblash

Hisoblash
Hisoblash

Siz shifokorning kutish xonasida o'rtacha yugurishni odamlarning o'rtacha og'irligi sifatida tasavvur qilishingiz mumkin. Shifokor bitta bemorni tekshirishni tugatadi va bir vaqtning o'zida yangi bemor kutish xonasiga kiradi.

Kutish xonasida kutayotgan barcha bemorlarning o'rtacha vaznini bilish uchun hamshira har bir bemordan o'z vazni haqida so'rashi, bu raqamlarni qo'shishi va bemorlar soniga bo'linishi mumkin edi. Har safar shifokor yangi bemorni qabul qilganda, hamshira butun jarayonni takrorlaydi.

Siz o'ylayotgandirsiz: "Bu unchalik samarali ko'rinmaydi … Buning uchun yaxshiroq yo'l bo'lishi kerak." Va siz to'g'ri bo'lar edingiz.

Bu jarayonni optimallashtirish uchun hamshira hozirgi bemorlar guruhining umumiy vaznini qayd qilishi mumkin edi. Shifokor yangi bemorni chaqirganida, hamshira uning vazni haqida so'raydi va uni guruhdan olib tashlaydi. Keyin hamshira kutish xonasiga kirgan bemordan o'z vazni haqida so'raydi va uni umumiy vaznga qo'shadi. Har bir smenadan so'ng bemorlarning o'rtacha vazni og'irliklarning bemorlar soniga bo'linishi bo'ladi (ha, avvalgidek, lekin hozir hamshira ularning hammasi o'rniga faqat ikki kishidan o'z vazni haqida so'ragan). Men tushunaman, bu paragraf biroz chalkash bo'lishi mumkin, shuning uchun qo'shimcha tushuntirish uchun yuqoridagi rasmga qarang (yoki izohlarda savollar bering).

Agar siz oxirgi xatboshini chalkash deb topmagan bo'lsangiz ham, sizda akkumulyatorda nima bo'lishi kerakligi kabi savollar bo'lishi mumkin, men o'qiganlarimni haqiqiy C kodiga qanday kiritishim mumkin? Bu keyingi bosqichda ko'rib chiqiladi, u erda siz ham manba kodimni olasiz.

4 -qadam: Kod

Kodeks
Kodeks

O'rtacha ishlashni hisoblash uchun, avvalo, oxirgi N qiymatlarini saqlash usuli kerak. har bir elementni qo'shganingizda siz N elementli massivga ega bo'lishingiz va butun tarkibni bir joyga ko'chirishingiz mumkin (iltimos, buni qilmang), yoki bitta eski elementni qayta yozib, ko'rsatgichni keyingi elementga tashlashingiz mumkin (iltimos, buni bajaring):)

Akkumulyator 0 dan boshlanishi kerak, kechikish chizig'idagi barcha elementlar uchun ham xuddi shunday. Boshqa holatda, sizning ishlayotgan o'rtacha har doim noto'g'ri bo'ladi. Siz kechiktirish chizig'ini ishga tushirish haqida kechiktiruvchi liniya, siz akkumulyatorga o'zingiz g'amxo'rlik qilishingiz kerakligini ko'rasiz.

kechikish chizig'iga element qo'shish, eng yangi element indeksini 1 ga kamaytirish kabi oson, bu kechikish chizig'i qatorini ko'rsatmaydi. indeks 0 ga teng bo'lganda, u 255 atrofida aylanadi (chunki u 8 bitli belgisiz tamsayı). Kechiktiruvchi qator massividagi modulo (%) operatori indeks haqiqiy elementga ishora qiladi.

Agar siz oldingi qadamda mening o'xshashligimga amal qilgan bo'lsangiz, ishlaydigan o'rtacha hisobni tushunish oson bo'lishi kerak. Akkumulyatordan eng eski elementni olib tashlang, akkumulyatorga eng yangi qiymat qo'shing, kechikish chizig'iga eng yangi qiymatni kiriting, akkumulyatorni elementlar soniga bo'ling.

Oson, to'g'rimi?

Iltimos, bularning barchasi qanday ishlashini yaxshiroq tushunish uchun ilova qilingan koddan foydalanib tajriba o'tkazing. Hozirgi vaqtda, arduino A0 analog pinidagi analog qiymatini o'qiydi va ketma -ket portda 115200 bayd tezligida "[ADC qiymati], [ishlaydigan o'rtacha]" ni chiqaradi. Agar siz arduino -ning ketma -ket plotterini to'g'ri uzatishni ochsangiz, siz ikkita satrni ko'rasiz: ADC qiymati (ko'k) va tekislangan qiymat (qizil).

5 -qadam: Qo'shimchalar

Qo'shimchalar
Qo'shimchalar

Loyihangizda ishlaydigan o'rtacha qiymatdan foydalanish uchun bilishingiz shart bo'lmagan bir nechta narsalar bor, lekin bilish zarar qilmaydi.

kechiktirish: Men bu qadamning tasviri haqida gapirishdan boshlayman. Siz ko'proq elementlarning o'rtacha ishlashi katta kechikish bilan bog'liqligini sezasiz. Agar sizning qiymatingizni o'zgartirish uchun javob berish vaqti juda muhim bo'lsa, siz qisqa ishlaydigan o'rtacha yoki namuna tezligini oshirishni xohlaysiz (tez -tez o'lchab turing).

Davom etmoq.

boshlang'ich: Men akkumulyator va kechiktirish elementlarini ishga tushirish haqida gapirganimda, hammasini 0 ga boshlashingiz kerakligini aytdim. Shu bilan bir qatorda, siz xohlagan narsaga kechiktirish chizig'ini boshlashingiz mumkin, lekin akkumulyator kechikish chizig'idagi eng yangi N elementlarining yig'indisi sifatida boshlanishi kerak (bu erda N Sizning o'rtacha ishchi elementlaringiz soni). Agar akkumulyator boshqa qiymatlar kabi boshlasa, o'rtacha hisob noto'g'ri bo'ladi - juda past yoki juda yuqori, har doim bir xil miqdorda (bir xil boshlang'ich shartlarni hisobga olgan holda). Buning sababini "qalam va qog'oz simulyatsiyasi" yordamida bilib olishga harakat qilishingizni maslahat beraman.

Akkumulyator o'lchami: Shuni ham ta'kidlash kerakki, akkumulyator barcha elementlarning yig'indisini kechikish chizig'ida saqlash uchun etarlicha katta bo'lishi kerak, agar ularning barchasi ijobiy yoki salbiy bo'lsa. Amalda, bu shuni anglatadiki, akkumulyator kechikish chizig'i elementlaridan kattaroq ma'lumot turiga ega bo'lishi kerak va agar kechikish chizig'i elementlari imzolangan bo'lsa.

hiyla: Uzoq kechikish chiziqlari ko'p xotirani egallaydi. Bu tezda muammoga aylanishi mumkin. Agar siz xotirani cheklab qo'ygan bo'lsangiz va aniqlikka unchalik ahamiyat bermasangiz, kechiktirishni butunlay o'tkazib yuborib, uning o'rtacha ishlashini taxmin qilishingiz mumkin: akkumulyatordan 1/N * akkumulyatorini olib tashlang va yangi qiymat qo'shing (masalan, 8 ta uzoq ishlaydigan o'rtacha: akkumulyator = akkumulyator * 7/8 + yangiValue). Bu usul noto'g'ri natija beradi, lekin xotira etishmayotganida o'rtacha ish vaqtini hisoblashning yaxshi usuli.

tilshunoslik: "ishlaydigan o'rtacha/o'rtacha" odatda "o'rtacha harakatlanuvchi/o'rtacha" algoritmi, masalan, excel elektron jadvali kabi statik ma'lumotlar to'plamida ishlayotganini anglatganda, real vaqtdagi o'rtacha ko'rsatkichga nisbatan ishlatiladi.

6 -qadam: Xulosa

Umid qilamanki, bu ko'rsatmalarni tushunish oson va bu sizga kelgusi loyihalaringizda yordam beradi. Agar tushunarsiz narsa bo'lsa, iltimos, quyidagi izohlarda savollaringizni yozing.

Tavsiya: