Мазмуну:

Микроконтроллердин долбоорлору үчүн орточо чуркоо: 6 кадам
Микроконтроллердин долбоорлору үчүн орточо чуркоо: 6 кадам

Video: Микроконтроллердин долбоорлору үчүн орточо чуркоо: 6 кадам

Video: Микроконтроллердин долбоорлору үчүн орточо чуркоо: 6 кадам
Video: БАРДЫГЫН АЛУУГА арзыйт?? Ал эми ATS25X1 радио кабылдагычын деталдуу карап чыгуу эмнеси менен жакшы 2024, Ноябрь
Anonim
Сиздин Микроконтроллер Долбоорлоруңуз үчүн Орточо Чуркоо
Сиздин Микроконтроллер Долбоорлоруңуз үчүн Орточо Чуркоо

Бул көрсөтмөдө мен иштеп жаткан орточо деген эмне экенин жана эмне үчүн ага кам көрүү керектигин түшүндүрөм, ошондой эле аны максималдуу эсептөө эффективдүүлүгү үчүн кантип ишке ашыруу керектигин көрсөтөм (татаалдыгы жөнүндө кабатыр болбо, муну түшүнүү абдан жөнөкөй жана мен arduino долбоорлоруңуз үчүн колдонууга оңой китепкана менен камсыз кылыңыз:)

Орточо чуркоо, ошондой эле көбүнчө орточо, кыймылдуу орточо же чуркоочу орточо деп аталат, маалымат сериясындагы акыркы N маанилеринин орточо маанисин сүрөттөө үчүн колдонулган термин. Аны кадимки орточо эле эсептесе болот же сиз кодуңуздун иштешине минималдуу таасир этүү үчүн трюк колдонсоңуз болот.

1 -кадам: Колдонуу Case: ADC өлчөөлөрүн жумшартуу

Колдонуу иши: ADC өлчөөлөрүн жумшартуу
Колдонуу иши: ADC өлчөөлөрүн жумшартуу

Arduino абдан аз ызы -чуу менен татыктуу 10 бит ADC бар. Потенциометр, фоторезистор же башка ызы -чуунун башка компоненттери сыяктуу сенсордун маанисин өлчөөдө, өлчөөнүн туура экенине ишенүү кыйын.

Бир чечим - сенсорду окуп, аларды орточо эсепке алгысы келген сайын бир нече өлчөө жүргүзүү. Кээ бир учурларда бул туура чечим, бирок дайыма эле эмес. Эгерде сиз ADCди секундасына 1000 жолу окууну кааласаңыз, орточо 10 өлчөөнү алсаңыз, 10 000ге туура келет. Эсептөө убактысынын чоң текке кетиши.

Менин сунуш кылган чечимим - бул секундасына 1000 жолу өлчөө, ар бир жолу иштеп жаткан орточо жаңыртуу жана аны учурдагы мааниси катары колдонуу. Бул ыкма бир аз кечигүүнү киргизет, бирок колдонмоңуздун эсептөө татаалдыгын азайтат, бул сизге кошумча иштетүү үчүн көбүрөөк убакыт берет.

Жогорудагы сүрөттө мен акыркы 32 өлчөөнүн орточо чуркоосун колдондум. Сиз бул ыкманын 100% бузулбаганын көрөсүз, бирок тактыгын бир топ жакшыртат (бул ар бир жолу 32 үлгүнү орточо алгандан жаман эмес). Эгерде сиз ар бир жолу орточо 32 өлчөөнү эсептегиңиз келсе, анда Arduino UNO боюнча 0,25 мс ашык убакыт талап кылынат!

2 -кадам: Колдонуу Case: Микрофон сигналынын 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 өлчөөдөн алынып салынышы керек, туурабы?

Идеалдуу дүйнөдө бул туура болмок. Тилекке каршы, чыныгы жашоо татаалыраак жана биздин сигналдык көз карашыбыз алыстап баратат. Электр тармагынан 50 Гц ызы -чуу (эгер сиз АКШда жашасаңыз 60 Гц) абдан таралган. Адатта, баары эле көйгөйлүү эмес, бирок анын бар экенин билүү жакшы. Эң көйгөйлүү нерсе - компоненттерди жылытуудан сызыктуу четтөө. Сиз кылдаттык менен DC ордун оңдоону орноттуңуз жана ал сиздин колдонмоңуз иштеп жатканда акырындык менен кетет.

Мен бул көйгөйдү (музыка) детектору менен көрсөтөм. Сиз бир жактуу алып салууну орнотуп жатасыз жана урууларыңыз так (сүрөт 2). Бир аз убакыттан кийин, DC жактуу кыймылдары жана уруулары микроконтроллерге дээрлик байкалбайт (3 -сүрөт). Битти аныктоо алгоритми келечекте инструктивдүү түрдө изилденет, анткени бул макаланын алкагынан ашып кетет.

Бактыга жараша, аудионун DC ордун дайыма эсептеп туруунун бир жолу бар. Бул үйрөткүчтүн орточо темасы чечимди камсыз кылышы таң калыштуу деле эмес.

Биз кандайдыр бир AC сигналынын орточо мааниси 0 экенин билебиз. Бул билимди колдонуу менен биз AC+DC сигналынын бул орточо маанисин DC токтоочу деп эсептей алабыз. Аны алып салуу үчүн, биз акыркы бир нече маанилердин иштеп жаткан орточо санын алып, аны учурдагы ADC окуусунан алып салсак болот. Белгилей кетчү нерсе, орточо жетиштүү узакты колдонуу керек. Аудио үчүн секунданын ондон бир бөлүгү (үлгүлөрдүн саны үлгүлөрүңүздүн ылдамдыгына жараша болот) жетиштүү болушу керек, бирок узун орточо көрсөткүчтөр жакшы иштээрин билиңиз. Биринчи сүрөттө сиз 1 кГц ылдамдыкта 64 элементи бар орточо чуркоо менен реалдуу DC жактуу эсептөөнүн мисалын көрө аласыз (мен сунуштагандан азыраак, бирок ал дагы деле иштейт).

3 -кадам: эсептөө

Эсептөө
Эсептөө

Сиз орточо чуркооңузду врачтын күтүү залындагы адамдардын орточо салмагы катары элестете аласыз. Дарыгер бир бейтапты текшерүүнү бүтүрүп, бирөө жаңы кабыл алуучу бөлмөгө кирет.

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

Сиз ойлонуп жаткандырсыз: "Бул өтө эле эффективдүү эмес окшойт … Муну кылуунун жакшы жолу болушу керек." А сиз туура болмоксуз.

Бул процессти оптималдаштыруу үчүн медайым учурдагы пациенттердин жалпы салмагынын эсебин жүргүзө алат. Дарыгер жаңы пациентти чакыргандан кийин, медайым анын салмагын сурайт жана аны топтун жыйынтыгынан чыгарып коёт. Медсестра күтүү бөлмөсүнө жаңы кирген пациенттен анын салмагын сурап, аны жалпыга кошот. Ар бир сменадан кийин пациенттердин орточо салмагы оорулуулардын санына бөлүнгөн салмактардын суммасын түзөт (ооба, мурдагыдай эле, бирок азыр медайым алардын баарынын ордуна эки кишиден өздөрүнүн салмагы жөнүндө сурады). Мен түшүнөм, бул абзац бир аз түшүнүксүз болушу мүмкүн, андыктан кошумча түшүнүк алуу үчүн жогорудагы сүрөттү караңыз (же комментарийлерде суроолорду бериңиз).

Бирок, эгер сиз акыркы абзацты башаламан деп таппасаңыз да, башында аккумулятордо эмне болушу керек деген сыяктуу суроолор болушу мүмкүн, мен жаңы эле окуп чыкканымды чыныгы C кодуна кантип киргизем? Бул кийинки кадамда чечилет, анда сиз менин баштапкы кодумду аласыз.

4 -кадам: Код

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

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

Аккумулятор баштапкы абалга келтирилиши керек 0, кечигүү сызыгындагы бардык элементтер үчүн. Башка учурда, сиздин орточо чуркооңуз дайыма туура эмес болуп калат. Сиз delayLine_init кечигүү линиясын баштоого кам көрөрүн көрөсүз, аккумуляторго өзүңүз кам көрүшүңүз керек.

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

Иштеген орточо көрсөткүчтү мурунку кадамда менин окшоштугума кармансаңыз түшүнүү оңой болушу керек. Аккумулятордон эң эски элементти алып салыңыз, аккумуляторго эң жаңы маанини кошуңуз, эң акыркы маанини кечигүү сызыгына түртүңүз, аккумуляторду элементтердин санына бөлүңүз.

Оңой, туурабы?

Сураныч, мунун баары кантип иштээрин жакшыраак түшүнүү үчүн тиркелген кодду колдонуп көрүңүз. Азыркы учурда, arduino аналогдук маанини A0 аналогунда окуйт жана 115200 байдын ылдамдыгында сериялык портко "[ADC мааниси], [иштеп жаткан орточо]" басып чыгарат. Ардуинонун сериялык плоттерин туура берүү ылдамдыгы боюнча ачсаңыз, сиз эки сапты көрөсүз: ADC мааниси (көк) жана тегизделген маани (кызыл).

5 -кадам: Кошумчалар

Кошумчалар
Кошумчалар

Долбоордо орточо жүгүртүүнү колдонуу үчүн сөзсүз түрдө билүүнүн кажети жок бир нече нерселер бар, бирок билүү зыян келтирбейт.

кечигүү: Мен бул кадамдын иллюстрациясы жөнүндө сүйлөшүүдөн баштайм. Сиз көбүрөөк элементтердин орточо иштеши чоң кечигүүнү алып келерин байкайсыз. Эгер маанини өзгөртүүгө жооп берүү убактыңыз өтө маанилүү болсо, анда сиз орточо ылдамдыкты колдонууну же ылдамдыктын ылдамдыгын жогорулатууну каалашыңыз мүмкүн (көбүнчө өлчөө).

Улантууда.

инициализация: Мен аккумуляторду жана кечиктирүү элементтерин баштоо жөнүндө айтканымда, мен алардын бардыгын 0 деп баштоо керектигин айттым. Же сиз каалаган нерсеге кечигүү линиясын баштап койсоңуз болот, бирок аккумулятор кечигүү сызыгындагы эң жаңы N элементтеринин суммасы катары башталышы керек (мында N Сиздин орточо чуркооңуздагы элементтердин саны). Эгерде аккумулятор башка мааниде башталса, орточо эсептөө туура эмес болуп калат - өтө эле төмөн же өтө жогору, дайыма ошол эле суммага (ошол эле баштапкы шарттарды эске алганда). Мен муну "калем менен кагаздын симуляциясын" колдонуу менен түшүнүүгө аракет кылууну сунуштайм.

Аккумулятордун өлчөмү: Аккумулятор бардык элементтердин суммасын кечигүү сызыгында сактоо үчүн жетишерлик чоң болушу керек, эгерде алар оң же терс макс болсо. Иш жүзүндө, бул аккумулятор кечигүү линиясынын элементтерине караганда бир маалымат түрүнөн чоң болушу керек жана эгер кечигүү линиясынын элементтерине кол коюлган болсо, кол коюлат.

амал: Узакка созулган линиялар көп эстутумду ээлейт. Бул тез эле көйгөй болуп калышы мүмкүн. Эгерде сиз эс тутумуңуз чектелүү болсоңуз жана тактыкка анча маани бербесеңиз, анда орточо иштөөнү кечиктирүүнү таптакыр жокко чыгарып, мунун ордуна жасай аласыз: аккумулятордон 1/N * аккумуляторун чыгарып, жаңы маанини кошуңуз (мисалы, 8 узак иштеген орточо: аккумулятор = аккумулятор * 7/8 + newValue). Бул ыкма туура эмес натыйжа берет, бирок эс тутуму начарлап баратканда орточо чуркоону эсептөөнүн татыктуу ыкмасы.

лингвистика: "иштеп жаткан орточо/орточо", адатта, "орточо/орточо" кыймылынын реалдуу убакытына карата колдонулат, адатта алгоритм excel электрондук жадыбалы сыяктуу статикалык маалымат топтомунда иштеп жатат дегенди билдирет.

6 -кадам: Жыйынтык

Бул нускаманы түшүнүү оңой болду жана келечектеги долбоорлоруңузга жардам берет деп үмүттөнөм. Сураныч, түшүнүксүз бир нерсе болсо, төмөндөгү комментарийге суроолорду жазуудан тартынба.

Сунушталууда: