Мазмұны:

AVR микроконтроллері. Таймерді қолданатын жарық диодты шамдар. Таймерлер үзіледі. Таймер CTC режимі: 6 қадам
AVR микроконтроллері. Таймерді қолданатын жарық диодты шамдар. Таймерлер үзіледі. Таймер CTC режимі: 6 қадам

Бейне: AVR микроконтроллері. Таймерді қолданатын жарық диодты шамдар. Таймерлер үзіледі. Таймер CTC режимі: 6 қадам

Бейне: AVR микроконтроллері. Таймерді қолданатын жарық диодты шамдар. Таймерлер үзіледі. Таймер CTC режимі: 6 қадам
Бейне: Урок №2.1. Светодиод на Arduino. BeyondRobotics 2024, Қараша
Anonim
Image
Image

Барлығына сәлем!

Таймер - электроника саласындағы маңызды ұғым. Кез келген электронды компонент уақыт бойынша жұмыс істейді. Бұл уақыт базасы барлық жұмысты синхрондауға көмектеседі. Барлық микроконтроллерлер алдын ала белгіленген сағат жиілігінде жұмыс істейді, олардың барлығында таймерлерді орнатуға мүмкіндік бар. AVR өте дәл, дәл және сенімді таймермен мақтана алады. Ол көптеген мүмкіндіктерді ұсынады, осылайша оны кең тақырыпқа айналдырады. Ең жақсы жағы - таймер процессорға мүлдем тәуелсіз. Осылайша, ол процессорға параллель жұмыс істейді және процессордың араласуы жоқ, бұл таймерді өте дәл етеді. Бұл бөлімде мен AVR таймерінің негізгі түсініктерін түсіндіремін. Мен таймерлерді қолдана отырып, жарықдиодты жарқылды басқару үшін С кодында қарапайым бағдарлама жазамын.

1 -қадам: Сипаттама

Мәселе туралы мәлімдеме 1: Әр 50 м сайын бірінші жарық диоды (жасыл) жыпылықтайық
Мәселе туралы мәлімдеме 1: Әр 50 м сайын бірінші жарық диоды (жасыл) жыпылықтайық

ATMega328 -де таймерлердің үш түрі бар:

Timer/Counter0 (TC0) - бұл 8 -разрядты Таймер/Санаудың жалпы мақсатты модулі, екі тәуелсіз OutputCompare қондырғысы бар және PWM қолдауымен;

Таймер/Санағыш1 (TC1) - 16 -разрядты Таймер/Санау қондырғысы бағдарламаның орындалу уақытын (оқиғаларды басқару), толқынды генерациялауды және сигналдың уақытын өлшеуге мүмкіндік береді;

Таймер/Санағыш2 (TC2) -бұл жалпы мақсатты, арна, PWM және асинхронды жұмысы бар 8 -разрядты Таймер/Санау модулі;

2 -қадам: Мәселе туралы мәлімдеме 1: Алдымен жарық диоды (жасыл) 50 Мс сайын жанып тұрсын

Мәселе туралы мәлімдеме 1: Әр 50 м сайын бірінші жарық диоды (жасыл) жыпылықтайық
Мәселе туралы мәлімдеме 1: Әр 50 м сайын бірінші жарық диоды (жасыл) жыпылықтайық
Мәселе туралы мәлімдеме 1: Әр 50 м сайын бірінші жарық диоды (жасыл) жыпылықтайық
Мәселе туралы мәлімдеме 1: Әр 50 м сайын бірінші жарық диоды (жасыл) жыпылықтайық

Әдістеме:

- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін Timer0 алдын ала есептегішті қолдану;

- Timer0 толған сайын үзілісті қолдану;

Таймер0 (8 биттік) ол 0 -ден 255 -ке дейін есептеледі, олар толып кетеді, бұл мән әр сағат импульсінде өзгереді.

F_CPU = 16 МГц: Сағаттың ұзақтығы = 1000 мс / 16000000 Гц = 0,0000625 мс

Таймер саны = (Кідіріс / Сағаттың қажетті кезеңі) -1 = (50ms / 0.0000625ms) = 799999

Сағат 599 мс кешіктіру үшін 799999 рет белгіленді!

Таймер санын азайту үшін біз жиілікті бөлу әдісін қолдана аламыз. AVR бізге алдын ала есептегіштің келесі мәндерін таңдауды ұсынады: 8, 64, 256 және 1024. Кестеде әр түрлі алдын ала есептегіштерді қолданудың нәтижелері жинақталғанын қараңыз.

Есептегіш мәні әрқашан бүтін сан болуы керек. Алдын ала есептегіш 256 таңдайық!

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

Қажетті кідіріс (50 мс) мүмкін болатын кідірістен үлкен болғандықтан: 4, 096 мс = 1000 мс / 62500 Гц * 256, таймер толып кететіні анық. Ал таймер толып кеткен кезде үзіліс шығады.

Үзілісші қанша рет жұмыстан шығарылуы керек?

50ms / 4.096ms = 3125/256 = 12.207 Егер таймер 12 есе асып кетсе, 12 * 4.096ms = 49.152ms өткен болар еді. 13 -ші қайталауда бізге 50 мс - 49,152 мс = 0,848 мс кідіріс қажет.

62500Гц жиілікте (алдын ала есептегіш = 256) әр кене 0,016 мс алады. Осылайша 0,848 м кідіріске жету үшін 0,848 мс / 0,016 мс = 53 кене қажет болады. Осылайша, 13 -ші қайталауда біз тек таймерге 53 дейін санауға рұқсат береміз, содан кейін оны қалпына келтіреміз.

Timer0/Counter инициализациясы (суретті қараңыз):

TCCR0B | = (1 << CS02) // таймерді алдын ала есептегішпен орнату = 256 TCNT0 = 0 // санағышты инициализациялау TIMSK0 | = (1 << TOIE0) // толып кетуді қосу sei () // жаһандық үзілістерді қосу tot_overflow = 0 // толып кетудің есептегіш айнымалысын инициализациялау

3 -қадам: Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық

Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық
Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық
Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық
Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық
Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық
Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық

Әдістеме:

- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін Timer1 алдын ала есептегішті қолдану;

- салыстыру (CTC) режимінде Clear Timer пайдалану;

- CTC режимі бар үзілістерді қолдану;

Таймер1 (16 биттік) ол 0 -ден 65534 -ке дейін есептеледі, олар толып кетеді. Бұл мән әр сағат импульсінде өзгереді.

F_CPU = 16 МГц: Сағаттың ұзақтығы = 1000 мс / 16000000 Гц = 0,0000625 м Таймердің саны = (Кешіктіру / Сағаттың қажетті кезеңі) -1 = (1000 мс / 0,0000625 мс) = 15999999

Сағат 15999999 рет 1 сағатқа кешіктіру үшін белгіленді!

Таймер санын азайту үшін біз жиілікті бөлу әдісін қолдана аламыз. AVR бізге алдын ала есептегіштің келесі мәндерін таңдауды ұсынады: 8, 64, 256 және 1024. Кестеде әр түрлі алдын ала есептегіштерді қолданудың нәтижелері жинақталғанын қараңыз. Есептегіш мәні әрқашан бүтін сан болуы керек. Алдын ала есептегіш 256 таңдайық!

Clear timer on Compare (CTC) режимінде OCR1A немесе ICR1 регистрі есептегіш ажыратымдылығын басқару үшін қолданылады. CTC режимінде санауыштың мәні (TCNT1) OCR1A немесе ICR1 сәйкес болғанда, нөлге дейін тазартылады. OCR1A немесе ICR1 есептегіштің жоғарғы мәнін анықтайды, демек оның ажыратымдылығы. Бұл режим сәйкестіктің шығыс жиілігін бақылауға мүмкіндік береді, сонымен қатар сыртқы оқиғаларды санау жұмысын жеңілдетеді. Біз AVR -ге Timer1/Counter мәні 62500 мәніне жеткенде, оны 1 секундқа кешіктіру үшін қалпына келтіруді айтуымыз керек.

Timer1/Counter инициализациясы (суретті қараңыз):

TCCR1B | = (1 << WGM12) | (1 << CS12) // таймерді prescaler = 256 және CTC режимімен орнату TCNT1 = 0 // есептегішті инициализациялау TIMSK1 | = (1 << OCIE1A) // салыстыруды үзуді OCR1A қосу = 62500 // салыстыру мәнін инициализациялау

4 -қадам: Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық

Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық

Әдістеме:

- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін Timer2 алдын ала есептегішті қолдану;

- салыстыру (CTC) режимінде Clear Timer пайдалану;

- аппараттық CTC режимін үзіліссіз пайдалану;

Таймер2 (8 биттік) ол 0 -ден 255 -ке дейін есептеледі, олар толып кетеді. Бұл мән әр сағат импульсінде өзгереді.

F_CPU = 16 МГц: Сағаттың ұзақтығы = 1000 мс / 16000000 Гц = 0,0000625 мс

Таймер саны = (Кідіріс / Сағаттың қажетті кезеңі) -1 = (16ms / 0.0000625ms) = 255999

Сағат 165 кідіріс беру үшін 255999 рет белгіленді!

Әр түрлі алдын ала есептегіштерді қолданудың нәтижелері берілген кестені қараңыз. Есептегіш мәні әрқашан бүтін сан болуы керек. Алдын ала есептегішті 1024 таңдайық!

CTC режимінде санауыштың мәні (TCNT2) OCR2A немесе ICR2 сәйкес келсе, есептегіш нөлге дейін тазартылады. PB3 түйреуіші сонымен қатар TIMER2 - OC2A шығыс салыстыру түйреуіші болып табылады (диаграмманы қараңыз).

Таймер/Санау2 бақылау регистрі A - TCCR2A Bit 7: 6 - COM2A1: 0 - А бірлігін салыстыру үшін шығыс режимін салыстыру. Біз жарық диодты қосуды қажет ететіндіктен, келесі опцияны таңдаймыз: Салыстыру сәйкестігінде OC2A ауыстыру. OC2A түйреуіші автоматты түрде ауысады. Тудың битін тексерудің қажеті жоқ, үзілістерге қатысудың қажеті жоқ.

Таймер2/Есептегішті инициализациялаңыз

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // ауыстырып қосу режимінде және CTC режимінде TCCR2B таймері OC2A түйрегішін орнатыңыз | = (1 << CS22) | (1 << CS21) | (1 << CS20) // таймерді prescaler = 1024 TCNT2 = 0 көмегімен орнату // есептегішті инициализациялау OCR2A = 250 // салыстыру мәнін инициализациялау

5 -қадам: C бағдарламасындағы кодты жазу. HEX файлын микроконтроллердің флэш -жадына жүктеу

Бағдарламаның кодын C тілінде жазу. HEX файлын микроконтроллердің флэш -жадына жүктеу
Бағдарламаның кодын C тілінде жазу. HEX файлын микроконтроллердің флэш -жадына жүктеу
Бағдарламаның кодын C тілінде жазу. HEX файлын микроконтроллердің флэш -жадына жүктеу
Бағдарламаның кодын C тілінде жазу. HEX файлын микроконтроллердің флэш -жадына жүктеу

Біріктірілген даму платформасы - Atmel Studio көмегімен CR кодында AVR микроконтроллер қосымшасын жазу және құру.

F_CPU Hertz сағат жиілігін анықтайды және avr-libc кітапханасын қолданатын бағдарламаларда жиі кездеседі. Бұл жағдайда уақытты кешіктіруді қалай есептеу керектігін анықтау үшін кешіктіру тәртібі қолданылады.

#ifndef F_CPU

#анықтау F_CPU 16000000UL // контроллердің кристалды жиілігін айту (16 МГц AVR ATMega328P) #endif

түйіндер бойынша деректер ағынын басқаруды қосу үшін #include // header. Ілгектерді, порттарды және т.б.

Бірінші файл avr-libc бөлігі болып табылады және сіз жұмыс істейтін кез келген AVR жобасында қолданылады. io.h сіз қолданатын процессорды анықтайды (сондықтан компиляция кезінде бөлікті көрсетесіз) және өз кезегінде біз қолданатын чипке сәйкес IO анықтамалық тақырыбын қосады. Ол барлық түйреуіштер, порттар, арнайы регистрлер және т.

Үзілісті қосу үшін #include // header

тұрақсыз uint8_t tot_overflow; // толып кету санын санауға арналған жаһандық айнымалы

Мәселелерді шешу әдістемесі: Жарық диоды әр 50 мс сайын

- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін Timer0 алдын ала есептегішті қолдану;

- Timer0 толған сайын үзілісті қолдану;

void timer0_init () // таймерді инициализациялау 0, үзу және айнымалы

{TCCR0B | = (1 << CS02); // таймерді prescaler көмегімен орнату = 256 TCNT0 = 0; // санағышты инициализациялау TIMSK0 | = (1 << TOIE0); // толып кетуді қосу nterrupt sei (); // жаһандық үзілістерді қосу tot_overflow = 0; // толып кету санауышының айнымалы мәнін инициализациялау}

Мәселелерді шешу әдістемесі: Жарық секундтық жарық диоды (көк) әр 1 секунд сайын

- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін Timer1 алдын ала есептегішті қолдану;

- салыстыру (CTC) режимінде Clear Timer пайдалану;

- CTC режимі бар үзілістерді қолдану;

void timer1_init () // timer1 инициализациялау, үзу және айнымалы {TCCR1B | = (1 << WGM12) | (1 << CS12); // таймерді prescaler = 256 және CTC режимімен TCNT1 = 0 орнатыңыз; // санағышты инициализациялау OCR1A = 62500; // инициализациялау салыстыру мәні TIMSK1 | = (1 << OCIE1A); // салыстыруды үзуді қосу}

Мәселелерді шешу әдістемесі: әрбір 16 мс сайын үшінші жарық диоды (қызыл)

- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін Timer2 алдын ала есептегішті қолдану;

- салыстыру (CTC) режимінде Clear Timer пайдалану;

- аппараттық CTC режимін үзіліссіз пайдалану;

void timer2_init () // timer2 инициализациялау {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // ауыстырып -қосқыш режимінде және CTC режимінде OC2A таймерінің түйреуішін орнату TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // таймерді prescaler көмегімен орнату = 1024 TCNT2 = 0; // санағышты инициализациялау OCR2A = 250; // салыстыру мәнін инициализациялау}

TCNT0 толған сайын шақырылатын TIMER0 толып кетудің қызмет көрсету тәртібі:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // толып кету санын қадағалаңыз}

Сәйкестік болған кезде бұл ISR іске қосылады, осында ауысыңыз:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // осында көшіру}

int main (жарамсыз)

{DDRB | = (1 << 0); // қосылу 1 (жасыл) түйреуішке PB0 DDRC | = (1 << 1); // қосылу 2 (көк) PC1 DDRB түйреуішіне әкелді | = (1 << 3); // қосылу 3 (қызыл) түйреуішке PB3 (OC2A) taymer0_init (); // timer0 timer1_init () инициализациялау; // timer1 timer2_init () инициализациялау; // timer2 инициализациялау кезінде (1) // мәңгілік цикл {

Егер таймер0 12 рет асып кетсе, 12 * 4,096 мс = 49,152 мс өткен болар еді. 13 -ші қайталауда бізге 50ms - 49,152ms = 0,848ms кідіріс қажет. Осылайша, 13 -ші қайталауда біз тек таймерге 53 дейін санауға рұқсат береміз, содан кейін оны қалпына келтіреміз.

if (tot_overflow> = 12) // жоқ екенін тексеріңіз. толып кетулер = 12 ЕСКЕРТУ: '> =' пайдаланылады

{if (TCNT0> = 53) // таймер саны 53 -ке жеткенін тексеріңіз {PORTB ^= (1 << 0); // светодиодты ауыстырады TCNT0 = 0; // есептегішті қалпына келтіру tot_overflow = 0; // толып кететін есептегішті қалпына келтіру}}}}

HEX файлын микроконтроллердің флэш -жадына жүктеу:

DOS шақыру терезесінде пәрменді теріңіз:

avrdude –c [бағдарламашының аты] –p m328p –u –U жарқыл: w: [он алтылық файлыңыздың атауы] Менің жағдайда бұл: avrdude –c ISPProgv1 –p m328p –u –U жарқыл: w: Timers.hex

Бұл пәрмен он алтылық файлды микроконтроллердің жадына жазады. Микроконтроллердің флэш -жадының жануының толық сипаттамасы бар бейнені қараңыз:

Микроконтроллердің флэш жады жанып жатыр…

Жарайды ма! Енді микроконтроллер біздің бағдарламаның нұсқауларына сәйкес жұмыс істейді. Оны тексеріп көрейік!

6 -қадам: Электр тізбегін құру

Электр тізбегін құру
Электр тізбегін құру
Электр тізбегін құру
Электр тізбегін құру
Электр тізбегін құру
Электр тізбегін құру

Схемалық схемаға сәйкес компоненттерді қосыңыз.

Ұсынылған: