Мазмұны:
- 1 -қадам: Сипаттама
- 2 -қадам: Мәселе туралы мәлімдеме 1: Алдымен жарық диоды (жасыл) 50 Мс сайын жанып тұрсын
- 3 -қадам: Мәселе туралы мәлімдеме 2: Әр 1 секунд сайын екінші жарық диодты (көк) жыпылықтайық
- 4 -қадам: Мәселе туралы мәлімдеме 3: Әр 16 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
- 5 -қадам: C бағдарламасындағы кодты жазу. HEX файлын микроконтроллердің флэш -жадына жүктеу
- 6 -қадам: Электр тізбегін құру
Бейне: AVR микроконтроллері. Таймерді қолданатын жарық диодты шамдар. Таймерлер үзіледі. Таймер CTC режимі: 6 қадам
2024 Автор: John Day | [email protected]. Соңғы өзгертілген: 2024-01-30 10:25
Барлығына сәлем!
Таймер - электроника саласындағы маңызды ұғым. Кез келген электронды компонент уақыт бойынша жұмыс істейді. Бұл уақыт базасы барлық жұмысты синхрондауға көмектеседі. Барлық микроконтроллерлер алдын ала белгіленген сағат жиілігінде жұмыс істейді, олардың барлығында таймерлерді орнатуға мүмкіндік бар. AVR өте дәл, дәл және сенімді таймермен мақтана алады. Ол көптеген мүмкіндіктерді ұсынады, осылайша оны кең тақырыпқа айналдырады. Ең жақсы жағы - таймер процессорға мүлдем тәуелсіз. Осылайша, ол процессорға параллель жұмыс істейді және процессордың араласуы жоқ, бұл таймерді өте дәл етеді. Бұл бөлімде мен AVR таймерінің негізгі түсініктерін түсіндіремін. Мен таймерлерді қолдана отырып, жарықдиодты жарқылды басқару үшін С кодында қарапайым бағдарлама жазамын.
1 -қадам: Сипаттама
ATMega328 -де таймерлердің үш түрі бар:
Timer/Counter0 (TC0) - бұл 8 -разрядты Таймер/Санаудың жалпы мақсатты модулі, екі тәуелсіз OutputCompare қондырғысы бар және PWM қолдауымен;
Таймер/Санағыш1 (TC1) - 16 -разрядты Таймер/Санау қондырғысы бағдарламаның орындалу уақытын (оқиғаларды басқару), толқынды генерациялауды және сигналдың уақытын өлшеуге мүмкіндік береді;
Таймер/Санағыш2 (TC2) -бұл жалпы мақсатты, арна, PWM және асинхронды жұмысы бар 8 -разрядты Таймер/Санау модулі;
2 -қадам: Мәселе туралы мәлімдеме 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 секунд сайын екінші жарық диодты (көк) жыпылықтайық
Әдістеме:
- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін 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 м сайын үшінші жарықдиодты (қызыл) жыпылықтайық
Әдістеме:
- жоғары жиілікті электр сигналын бүтін сандар бойынша төменгі жиілікке дейін төмендету үшін 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 файлын микроконтроллердің флэш -жадына жүктеу
Біріктірілген даму платформасы - 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 -қадам: Электр тізбегін құру
Схемалық схемаға сәйкес компоненттерді қосыңыз.
Ұсынылған:
Жарық диодты текшені қалай жасауға болады - Жарық диодты текше 4x4x4: 3 қадам
Жарық диодты текшені қалай жасауға болады | 4x4x4 жарықдиодты текше: LED текшесін жарықдиодты экран деп санауға болады, онда қарапайым 5 мм жарық диодты сандық пиксель рөлін атқарады. Жарық диодты текше көру қабілеттілігі (POV) деп аталатын оптикалық құбылыс тұжырымдамасын қолдану арқылы суреттер мен өрнектер жасауға мүмкіндік береді. Сонымен
Жарық диодты жарық диодты жылдамдықты басқарудың және баламалы жыпылықтаудың үш әдісі: 3 қадам
Жарық диодты жарық диодты айналдыру жылдамдығының реттелуінің және баламалы жыпылықтаудың үш әдісі: Флэшерлік схема - бұл конденсатор әсер ететін светодиодты қосатын және өшіретін схема, мұнда мен сізге осы схеманы жасаудың үш түрлі әдісін көрсетемін. : 1. Транзисторлар 2. 555 Таймер IC3. Quartz CircuitLDR -ді сонымен қатар
Жарық диодты жолағы мен жарық диодты схемасы бар супер эффектілер: 11 қадам
Жарық диодты жолағы мен жарық диодты схемасы бар супер эффектілер: Сәлем досым, мен бүгін жарық диодты және жарықдиодты жарық диодтары бар супер эффект шамдарының тізбегін жасаймын
AVR микроконтроллері. Жарық диодты қосқыштың көмегімен ауыстырыңыз. Басқару түймесі: 4 қадам
AVR микроконтроллері. Жарық диодты қосқыштың көмегімен ауыстырыңыз. Түймешікті басу: Бұл бөлімде біз ATMega328PU үшін C бағдарламасының кодын қосқыштың қосқышына сәйкес үш жарық диодының күйін ауыстыруды үйренеміз. Сонымен қатар, біз «Switch Bounce» мәселесінің шешімін қарастырдық. Әдеттегідей, біз
Қарапайым жарық диодты схемасы (жарық диодты қалай қолдануға болады): 4 қадам
Қарапайым жарық диодты схемасы (жарықдиодты қалай қолдануға болады): Бұл нұсқаулық жарықдиодты қалай қолдануға және 3В, 6В, 9В & 12В. Жарық диоды электрониканың маңызды компоненті болып табылады, ол бірнеше индустрияда қолданылады