Мазмұны:

Микроконтроллер жобаларының орташа жұмыс жылдамдығы: 6 қадам
Микроконтроллер жобаларының орташа жұмыс жылдамдығы: 6 қадам

Бейне: Микроконтроллер жобаларының орташа жұмыс жылдамдығы: 6 қадам

Бейне: Микроконтроллер жобаларының орташа жұмыс жылдамдығы: 6 қадам
Бейне: Басқа тышты деген осы 😡 2024, Желтоқсан
Anonim
Сіздің микроконтроллерлік жобаларыңыз үшін орташа жұмыс
Сіздің микроконтроллерлік жобаларыңыз үшін орташа жұмыс

Бұл нұсқаулықта мен жүгірудің орташа мәні деген не екенін және оған неге мән беру керектігін түсіндіремін, сонымен қатар оны есептеудің ең жоғары тиімділігі үшін оны қалай енгізу керектігін көрсетемін (күрделілікке алаңдамаңыз, оны түсіну өте қарапайым және мен жасаймын) сіздің arduino жобаларыңыз үшін кітапхананы пайдалануға оңай:)

Орташа жүгіру, әдетте жылжымалы орташа, жылжымалы орташа немесе жүгіру орташа деп аталады, бұл деректер сериясындағы соңғы N мәндерінің орташа мәнін сипаттау үшін қолданылатын термин. Бұл қалыпты орташа мән ретінде есептелуі мүмкін немесе сіз кодты орындауға минималды әсер ету үшін трюк қолдана аласыз.

1 -қадам: Қолдану жағдайы: ADC өлшемдерін тегістеу

Қолдану жағдайы: ADC өлшемдерін тегістеу
Қолдану жағдайы: ADC өлшемдерін тегістеу

Arduino өте аз шуылмен жақсы 10 биттік ADC бар. Потенциометр, фоторезистор немесе басқа шуылдың басқа компоненттері сияқты сенсорда мәнді өлшеу кезінде өлшеудің дұрыстығына сену қиын.

Бір шешім - сенсорды оқығыңыз келген сайын бірнеше өлшеуді жүргізу және оларды орташа мәнге келтіру. Кейбір жағдайларда бұл тиімді шешім, бірақ әрқашан емес. Егер сіз ADC -ді секундына 1000 рет оқығыңыз келсе, орташа 10 өлшеуді алсаңыз, сізге 10 000 қажет болады. Есептеу уақытының үлкен шығыны.

Менің ұсынған шешімім - секундына 1000 рет өлшеу, жұмыс уақытының орташа мәнін жаңарту және оны ағымдағы мән ретінде пайдалану. Бұл әдіс біршама кідірісті енгізеді, бірақ сіздің қосымшаның есептеу күрделілігін төмендетеді, бұл сізге қосымша өңдеуге көбірек уақыт береді.

Жоғарыдағы суретте мен соңғы 32 өлшеулердің орташа жүгіруін қолдандым. Сіз бұл әдіс 100% өтпейтінін көресіз, бірақ ол дәлдікті айтарлықтай жақсартады (бұл әр уақытта 32 үлгіні орташа есеппен алғаннан жаман емес). Егер сіз әр уақытта орташа 32 өлшеуді есептегіңіз келсе, бұл тек өлшеу үшін Arduino UNO -да 0,25 мс -тен асады!

2 -қадам: Қолдану жағдайы: Микрофон сигналының тұрақты компонентін өлшеу

Қолдану жағдайы: Микрофон сигналының тұрақты компонентін өлшеу
Қолдану жағдайы: Микрофон сигналының тұрақты компонентін өлшеу
Қолдану жағдайы: Микрофон сигналының тұрақты компонентін өлшеу
Қолдану жағдайы: Микрофон сигналының тұрақты компонентін өлшеу
Қолдану жағдайы: Микрофон сигналының тұрақты компонентін өлшеу
Қолдану жағдайы: Микрофон сигналының тұрақты компонентін өлшеу

Arduino 0 мен Vcc арасындағы кернеуді өлшей алады (әдетте 5 В). Дыбыстық сигнал толығымен айнымалы болып табылады және егер сіз оны микроконтроллерде өлшегіңіз келсе, оны 1/2 Vcc айналасында бұруға тура келеді. Arduino UNO жобасында бұл шамамен 2,5 В (тұрақты ток) + дыбыстық сигналды (AC) білдіреді. 10 биттік АДС пен 5 В қуат көзін пайдаланған кезде 2,5 В кернеуі 512 -ге тең болуы керек. Демек, сигналдың айнымалы мәнін алу үшін 512 -ді ADC өлшеуінен алып тастау керек, солай ма?

Идеал әлемде бұл дұрыс болар еді. Өкінішке орай, шынайы өмір күрделірек және біздің сигналға деген көзқарасымыз төмендейді. Электр желісінен 50 Гц шу (егер сіз АҚШ -та тұрсаңыз 60 Гц) өте жиі кездеседі. Әдетте бұл өте қиын емес, бірақ оның бар екенін білу жақсы. Бөлшектерді қыздырудан желілік ауытқу қиынырақ. Сіз DC -дің офсеттік түзетілуін мұқият орнатасыз және ол жұмыс істеп тұрған кезде баяу кетеді.

Мен бұл мәселені (музыкалық) соққы детекторымен суреттеймін. Сіз біржақты жоюды орнатасыз және соққыларыңыз анық (сурет 2). Біраз уақыттан кейін тұрақты токтың ауытқуы мен соққысы микроконтроллерге әрең байқалады (3 -сурет). Соғуды анықтау алгоритмі келешекте терең зерттеледі, себебі ол осы мақаланың көлемінен асып түседі.

Бақытымызға орай, дыбыстың тұрақты тоқтауын үнемі есептеп отырудың әдісі бар. Орташа жұмыс, бұл нұсқаулықтың тақырыбы шешім табатыны таңқаларлық емес.

Біз кез келген айнымалы ток сигналының орташа мәні 0 екенін білеміз. Осы білімді қолдана отырып, біз айнымалы ток+тұрақты сигналдың орташа мәнін - бұл тұрақты токтың мәнін шегере аламыз. Оны жою үшін біз соңғы бірнеше мәндердің жұмыс істейтін орташа мәнін алып, оны ағымдағы ADC көрсеткішінен алып тастай аламыз. Назар аударыңыз, сіз жеткілікті ұзақ жұмыс ортасын пайдалануыңыз керек. Аудио үшін секундтың оннан бір бөлігі (үлгілердің саны сіздің таңдау жылдамдығыңызға байланысты) жеткілікті болуы керек, бірақ ұзақ орташа мәндер жақсы жұмыс істейтінін біліңіз. Бірінші суретте сіз 1 кГц іріктеу жылдамдығындағы 64 элементі бар орташа жұмыс істейтін тұрақты токтың нақты мәнін көре аласыз (мен ұсынғаннан аз, бірақ ол әлі де жұмыс істейді).

3 -қадам: Есептеу

Есеп
Есеп

Сіз орташа жүгіруді дәрігердің қабылдау бөлмесіндегі адамдардың орташа салмағы ретінде елестете аласыз. Дәрігер бір пациентті тексеруді аяқтайды, ал біреуі күту залына кіреді.

Күту бөлмесінде күтетін барлық пациенттердің орташа салмағын білу үшін медбике әр пациенттен олардың салмағын сұрай алады, сандарды қосады және пациенттер санына бөледі. Дәрігер жаңа науқасты қабылдаған сайын, мейірбике барлық процесті қайталайды.

Мүмкін сіз ойлайсыз: «Бұл өте тиімді емес сияқты … Мұны істеудің жақсы жолы болуы керек». Ал сіз дұрыс болар едіңіз.

Бұл процесті оңтайландыру үшін медбике қазіргі науқастар тобының жалпы салмағының есебін жүргізе алады. Дәрігер жаңа науқасты шақырған кезде, медбике оның салмағын сұрап, оны топтан алып тастап жібереді. Содан кейін медбике күту залына кірген пациенттен өзінің салмағы туралы сұрап, оны жалпыға қосады. Пациенттердің әр ауысымнан кейінгі орташа салмағы ауырлық санының пациенттер санына бөлінуі еді (иә, бұрынғыдай, бірақ қазір медбике олардың барлығының орнына тек екі адамнан өз салмағы туралы сұрады). Мен түсінемін, бұл абзац біраз түсініксіз болуы мүмкін, сондықтан қосымша түсінікті болу үшін жоғарыдағы суретті қараңыз (немесе түсініктемелерде сұрақтар қойыңыз).

Егер сіз соңғы абзацты шатастырмаса да, сізде аккумуляторда не болуы керек деген сұрақтар туындауы мүмкін, мен оқыған нәрсені нақты C кодына қалай қоюға болады? Бұл келесі қадамда қарастырылады, онда сіз менің бастапқы кодты аласыз.

4 -қадам: Кодекс

Кодекс
Кодекс

Орташа жұмыс істеуді есептеу үшін алдымен соңғы N мәндерін сақтау әдісі қажет. Сізде N элементтері бар массив болуы мүмкін және элементті қосқан сайын бүкіл мазмұнды бір орынға жылжытуға болады (мұны жасамаңыз), немесе сіз бір ескі элементті қайта жаза аласыз және шығарылатын келесі элементке көрсеткішті реттей аласыз (мұны істеңіз:)

Аккумулятор 0 -ге инициализациялануы керек, бұл кешіктіру жолындағы барлық элементтерге қатысты. Басқа жағдайда сіздің орташа жұмысыңыз қате болады. Сіз delayLine_init кешіктіру желісін инициализациялауға қамқорлық жасайтынын көресіз, сіз аккумуляторға өзіңіз қамқорлық жасауыңыз керек.

кешіктіру жолына элементті қосу ең жаңа элементтің индексін 1 -ге азайту сияқты оңай, бұл оның кешігу сызығының массивін көрсетпейтініне көз жеткізіңіз. 0 болғанда индексті төмендеткеннен кейін, ол 255 айналады (себебі бұл 8 разрядты белгісіз бүтін сан). Кешіктіру жолының массиві бар модульдік (%) операторы индекстің жарамды элементке бағытталуын қамтамасыз етеді.

Егер сіз алдыңғы қадамда менің ұқсастығымды ұстанған болсаңыз, жүгірудің орташа мәнін есептеу оңай болуы керек. Аккумулятордан ескі элементті алып тастаңыз, аккумуляторға ең жаңа мән қосыңыз, кешіктіру сызығына ең жаңа мәнді енгізіңіз, аккумуляторды элементтер санына бөліңіз.

Оңай, иә?

Мұның бәрі қалай жұмыс істейтінін жақсы түсіну үшін берілген кодты қолдануға тәжірибе жасаңыз. Қазіргі уақытта arduino A0 аналогтық түйреуішіндегі аналогтық мәнді оқиды және 115200 беру жылдамдығымен сериялық портта «[ADC мәні], [орташа жұмыс істейтін]» деп басып шығарады. Егер сіз дұрыс беру жылдамдығында arduino сериялық плоттерін ашсаңыз, сіз екі жолды көресіз: ADC мәні (көк) және тегістелген мән (қызыл).

5 -қадам: Қосымша

Қосымша
Қосымша

Жобаңызда орташа жұмыс істеуді білу үшін міндетті түрде білудің қажеті жоқ бірнеше нәрсе бар, бұл білуге зиян тигізбейді.

кешігу: Мен бұл қадамның суреттемесі туралы сөйлесуден бастаймын. Сіз көп элементтердің орташа жұмыс істеуі үлкен кідіріс әкелетінін байқайсыз. Егер сіздің мәнді өзгертуге жауап беру уақыты өте маңызды болса, сіз қысқа жүгіру орташа мәнін қолданғыңыз келуі мүмкін немесе іріктеу жиілігін арттырыңыз (жиі өлшеңіз).

Жалғастыру.

инициализация: Мен аккумулятор мен кешіктіру элементтерін инициализациялау туралы айтқанымда, мен олардың барлығын 0 -ге инициализациялау керектігін айттым. Немесе сіз қалаған нәрсеге кешіктіру желісін баптай аласыз, бірақ аккумулятор кешіктіру желісіндегі ең жаңа N элементтерінің жиынтығынан басталуы керек (мұнда N сіздің орташа жұмысыңыздағы элементтер саны). Егер аккумулятор кез келген басқа мән сияқты басталса, есептелген орташа мән қате болады - тым төмен немесе тым жоғары, әрқашан бірдей мөлшерде (бірдей бастапқы шарттарды ескере отырып). Мен мұның себебін «қалам мен қағазды модельдеу» арқылы білуге тырысуды ұсынамын.

Аккумулятордың өлшемі: Сондай -ақ, аккумулятор барлық элементтердің оң немесе теріс максимум болса, кешіктіру сызығындағы соманы сақтай алатындай үлкен болуы керек екенін ескеру қажет. Іс жүзінде бұл аккумулятор кешіктіру желісінің элементтеріне қарағанда бір деректер түрінен үлкен болуы керек және егер кешіктіру желісінің элементтеріне қол қойылған болса, қол қойылады.

трюк: Ұзақ кідіріс желілері көп жадты алады. Бұл тез арада проблемаға айналуы мүмкін. Егер сізде есте сақтау қабілеті шектеулі болса және дәлдікке аса мән бермейтін болсаңыз, кідірісті мүлдем жібермей, оны орындау арқылы орташа жұмыс шамасына жақындауға болады: аккумулятордан 1/N * аккумуляторын алып тастаңыз және жаңа мәнді қосыңыз (мысалы, 8 ұзақ жұмыс істейтін орташа мысал: аккумулятор = аккумулятор * 7/8 + newValue). Бұл әдіс қате нәтиже береді, бірақ бұл жады аз болған кезде орташа жұмыс жылдамдығын есептеудің жақсы әдісі.

лингвистика: «орташа/орташа жұмыс» әдетте нақты уақыттағы орташа мәнге сілтеме жасау кезінде қолданылады, ал «жылжымалы орташа/орташа» әдетте алгоритм excel электрондық кестесі сияқты статикалық деректер жиынтығында жұмыс істейтінін білдіреді.

6 -қадам: Қорытынды

Бұл нұсқаулық түсінуге оңай болды және бұл сіздің болашақ жобаларыңызға көмектеседі деп үміттенемін. Егер түсініксіз нәрсе болса, төмендегі түсініктемелерде сұрақтар қоюға болады.

Ұсынылған: