Мазмуну:

AVR микроконтроллери. Таймерди колдонуп LED жарыгы. Таймерлер үзгүлтүккө учурайт. Таймер CTC режими: 6 кадам
AVR микроконтроллери. Таймерди колдонуп LED жарыгы. Таймерлер үзгүлтүккө учурайт. Таймер CTC режими: 6 кадам

Video: AVR микроконтроллери. Таймерди колдонуп LED жарыгы. Таймерлер үзгүлтүккө учурайт. Таймер CTC режими: 6 кадам

Video: AVR микроконтроллери. Таймерди колдонуп LED жарыгы. Таймерлер үзгүлтүккө учурайт. Таймер CTC режими: 6 кадам
Video: ESP32 Tutorial 15 - DC Motor Speed Control with ESP32 L293D | SunFounder's ESP32 IoT Learnig kit 2024, Июль
Anonim
Image
Image

Баарыңарга салам!

Таймер - электроника тармагындагы маанилүү түшүнүк. Ар бир электрондук компонент убакыттын негизинде иштейт. Бул убакыт базасы бардык иштерди синхрондоштурууга жардам берет. Бардык микроконтроллерлер алдын ала аныкталган саат жыштыгында иштешет, алардын бардыгында таймерлерди орнотуу шарты бар. AVR абдан так, так жана ишенимдүү таймерге ээ. Ал көптөгөн өзгөчөлүктөрдү сунуштайт, ошону менен аны кеңири темага айландырат. Эң жакшы жери, таймер CPUдан толугу менен көз каранды эмес. Ошентип, ал CPUга параллелдүү иштейт жана таймерди так кылып турган CPU кийлигишүүсү жок. Бул бөлүмдө мен AVR таймеринин негизги түшүнүктөрүн түшүндүрөм. Мен таймерди колдонуп, LED жарыгын көзөмөлдөө үчүн C кодунда жөнөкөй программа жазып жатам.

1 -кадам: Description

Көйгөйдүн билдирүүсү 1: Келгиле, биринчи LEDди (жашыл) Ар 50 Мс сайын жарк эттирели
Көйгөйдүн билдирүүсү 1: Келгиле, биринчи LEDди (жашыл) Ар 50 Мс сайын жарк эттирели

ATMega328де таймерлердин үч түрү бар:

Timer/Counter0 (TC0) - жалпы көз карандысыз 8 биттик Таймер/Counter модулу, эки көз карандысыз OutputCompare бирдиги жана PWM колдоосу менен;

Timer/Counter1 (TC1) - 16 -бит Таймер/Саноочу бирдиги программанын так аткарылышына (окуяны башкаруу), толкундун пайда болушуна жана сигналдын убактысын өлчөөгө мүмкүндүк берет;

Таймер/Counter2 (TC2) -бул жалпы максат, канал, PWM жана асинхрондуу операциясы бар 8 -бит Таймер/Counter модулу;

2 -кадам: Көйгөйдүн билдирүүсү 1: Келгиле, биринчи Жарк этели LED (жашыл) Ар 50 Ms

Көйгөйдүн билдирүүсү 1: Келгиле, биринчи LEDди (жашыл) Ар 50 Мс сайын жарк эттирели
Көйгөйдүн билдирүүсү 1: Келгиле, биринчи LEDди (жашыл) Ар 50 Мс сайын жарк эттирели
Көйгөйдүн билдирүүсү 1: Келгиле, биринчи LED (жашыл) Ар 50 Мс сайын жарк этип турсун
Көйгөйдүн билдирүүсү 1: Келгиле, биринчи LED (жашыл) Ар 50 Мс сайын жарк этип турсун

Методология:

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

- Timer0 ашкан сайын үзгүлтүктү колдонуу;

Timer0 (8 бит) андан кийин 0дон 255ке чейин эсептелет, алар толуп кетет, бул маани ар бир сааттын импульсунда өзгөрөт.

F_CPU = 16MHz: Сааттын убактысы = 1000ms / 16000000Hz = 0.0000625ms

Таймердин саны = (Керектүү кечиктирүү / Сааттын мезгили) -1 = (50ms / 0.0000625ms) = 799999

Саат буга чейин 50 мс кечиктирүү үчүн 799999 жолу белгиленген!

Таймердин санын азайтуу үчүн жыштыкты бөлүү техникасын колдоно алабыз. AVR бизге тандоо үчүн төмөнкү prescaler баалуулуктарын сунуштайт: 8, 64, 256 жана 1024. Таблицада ар кандай алдын ала эсептегичтерди колдонуунун жыйынтыктары көрсөтүлгөн.

Эсептегичтин мааниси ар дайым бүтүн сан болушу керек. Келгиле, алдын ала эсептөөчү 256 тандап алалы!

Көпчүлүк микроконтроллерлерде Interrupt деген нерсе бар. Бул үзгүлтүк белгилүү бир шарттар аткарылганда иштен чыгарылышы мүмкүн. Эми үзгүлтүккө учураганда, AVR токтоп, негизги күн тартибинин аткарылышын сактап калат, үзгүлтүккө чалууга катышат (үзгүлтүккө учуроо кызматы тартиби, ISR деп аталган атайын тартипти аткаруу менен) жана аны аткаргандан кийин, кайра негизги тартип жана аны аткарууну улантууда.

Керектүү кечиктирүү (50ms) мүмкүн болгон максималдуу кечигүүдөн чоң болгондуктан: 4, 096ms = 1000ms / 62500Hz * 256, албетте, таймер ашып кетет. Ал эми таймер ашкан сайын үзгүлтүккө учурайт.

Канча жолу үзгүлтүккө учуроо керек?

50ms / 4.096ms = 3125/256 = 12.207 Эгерде таймер 12 жолу ашып кетсе, 12 * 4.096ms = 49.152ms өтмөк. 13 -кайталоодо бизге 50ms кечигүү керек - 49.152ms = 0.848ms.

62500Гц жыштыкта (prescaler = 256), ар бир кене 0.016ms алат. Ошентип, 0.848ms кечигүүгө жетүү үчүн, 0.848ms / 0.016ms = 53 кенени талап кылат. Ошентип, 13 -кайталоодо биз таймерди 53кө чейин санап, анан аны баштапкы абалга келтирүүгө уруксат беребиз.

Timer0/Counterди баштоо (сүрөттү караңыз):

TCCR0B | = (1 << CS02) // таймерди prescaler менен орнотуу = 256 TCNT0 = 0 // эсептегичти инициализациялоо TIMSK0 | = (1 << TOIE0) // иштетүүнү токтотуу sei () // глобалдык үзгүлтүктөрдү иштетүү tot_overflow = 0 // ашыкча эсептегичтин өзгөрмөсүн баштоо

3 -кадам: Көйгөйдү билдирүү 2: Экинчи LEDди (көк) ар бир 1с жарк этели

Көйгөйдүн билдирүүсү 2: Экинчи LEDди (көк) ар бир 1с жарк этели
Көйгөйдүн билдирүүсү 2: Экинчи LEDди (көк) ар бир 1с жарк этели
Көйгөйдүн билдирүүсү 2: Экинчи LEDди (көк) ар бир 1с жарк этип көрөлү
Көйгөйдүн билдирүүсү 2: Экинчи LEDди (көк) ар бир 1с жарк этип көрөлү
Көйгөйдүн билдирүүсү 2: Экинчи LEDди (көк) ар бир 1с жарк этели
Көйгөйдүн билдирүүсү 2: Экинчи LEDди (көк) ар бир 1с жарк этели

Методология:

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

- Clear Timer салыштыруу (CTC) режиминде колдонуу;

- CTC режими менен үзгүлтүктөрдү колдонуу;

Timer1 (16 бит) ал 0дөн 65534кө чейин санайт, алар толуп кетет. Бул маани ар бир сааттын импульсунда өзгөрөт.

F_CPU = 16MHz: Сааттын убактысы = 1000ms / 16000000Hz = 0.0000625ms Таймердин саны = (Керектүү кечиктирүү / Сааттын мезгили) -1 = (1000ms / 0.0000625ms) = 15999999

Саат 15999999 жолу 1с кечиктирүү үчүн такталды!

Таймердин санын азайтуу үчүн жыштыкты бөлүү техникасын колдоно алабыз. AVR бизге тандоо үчүн төмөнкү prescaler баалуулуктарын сунуштайт: 8, 64, 256 жана 1024. Таблицада ар кандай алдын ала эсептегичтерди колдонуунун жыйынтыктары көрсөтүлгөн. Эсептегичтин мааниси ар дайым бүтүн сан болушу керек. Келгиле, алдын ала эсептегичти 256 тандап алалы!

Clear timer on Compare (CTC) режиминде, OCR1A же ICR1 реестри эсептегичтин чечимин иштетүү үчүн колдонулат. CTC режиминде, эсептегич 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: Үчүнчү LEDди (кызыл) ар бир 16 мс жарк этели

Көйгөй 3 -билдирүү: Үчүнчү LEDди (кызыл) ар бир 16 мс жарк этели
Көйгөй 3 -билдирүү: Үчүнчү LEDди (кызыл) ар бир 16 мс жарк этели
Көйгөйдүн билдирүүсү 3: Үчүнчү LEDди (кызыл) Ар 16мс сайын жарк этип көрөлү
Көйгөйдүн билдирүүсү 3: Үчүнчү LEDди (кызыл) Ар 16мс сайын жарк этип көрөлү
Көйгөйдүн билдирүүсү 3: Үчүнчү LEDди (кызыл) Ар 16мс сайын жарк этип көрөлү
Көйгөйдүн билдирүүсү 3: Үчүнчү LEDди (кызыл) Ар 16мс сайын жарк этип көрөлү
Көйгөйдүн билдирүүсү 3: Үчүнчү LEDди (кызыл) Ар 16мс сайын жарк этип көрөлү
Көйгөйдүн билдирүүсү 3: Үчүнчү LEDди (кызыл) Ар 16мс сайын жарк этип көрөлү

Методология:

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

- Clear Timer салыштыруу (CTC) режиминде колдонуу;

- аппараттык CTC режимин үзгүлтүксүз колдонуу;

Timer2 (8 бит) ал 0дөн 255ке чейин санайт, алар толуп кетет. Бул маани ар бир сааттын импульсунда өзгөрөт.

F_CPU = 16MHz: Сааттын убактысы = 1000ms / 16000000Hz = 0.0000625ms

Таймердин саны = (Керектүү кечиктирүү / Сааттын мезгили) -1 = (16ms / 0.0000625ms) = 255999

Саат буга чейин 255999 жолу кысып, 16 мс кечигүүнү берди!

Таблицада ар кандай prescalers колдонуу натыйжалары жалпыланганын караңыз. Эсептегичтин мааниси ар дайым бүтүн сан болушу керек. Келгиле, prescaler 1024 тандап алалы!

CTC режиминде эсептегич OCR2A же ICR2ге туура келсе, эсептегич нөлгө чейин тазаланат. Pin PB3 дагы TIMER2 - OC2Aнын Чыгаруу Салыштырма пини (диаграмманы караңыз).

Таймер/Counter2 Control Register A - TCCR2A Bit 7: 6 - COM2A1: 0 - А бирдигин салыштыруу үчүн Чыгуу режимин салыштыруу. Светодиодду алмаштыруу керек болгондуктан, биз опцияны тандайбыз: Салыштыруу матчында OC2A которуштуруу Салыштыруу дал келген сайын, OC2A пин автоматтык түрдө которулат. Эч кандай желекти текшерүүнүн кереги жок, эч кандай үзгүлтүккө катышуунун кажети жок.

Timer2/Counterди баштоо

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

5 -кадам: C программасына код жазуу. HEX файлын микроконтроллердин флэш -эсине жүктөө

C программасында код жазуу. HEX файлын микроконтроллердин флэш -эсине жүктөө
C программасында код жазуу. HEX файлын микроконтроллердин флэш -эсине жүктөө
C программасында код жазуу. HEX файлын микроконтроллердин флэш -эсине жүктөө
C программасында код жазуу. HEX файлын микроконтроллердин флэш -эсине жүктөө

Интегралдык өнүктүрүү платформасын колдонуу менен C Codeде AVR микроконтроллер тиркемесин жазуу жана куруу - Atmel Studio.

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

#ifndef F_CPU

#define F_CPU 16000000UL // контроллердин кристаллдык жыштыгын айтуу (16 MHz AVR ATMega328P) #endif

#include // header, пиндердин үстүндө маалымат агымын башкарууну иштетүү үчүн. Пиндерди, портторду ж.

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

#include // header үзгүлтүккө учуратуу үчүн

туруксуз uint8_t tot_overflow; // толуп кетүү санын эсептөө үчүн глобалдык өзгөрмө

Проблеманы билдирүүнүн методологиясы: Жарык биринчи (Жашыл) LED ар 50 мс

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

- Timer0 ашкан сайын үзгүлтүктү колдонуу;

void timer0_init () // таймерди инициализациялоо, үзгүлтүккө учуроо жана өзгөрмө

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

Проблеманы билдирүүнүн методологиясы: Жарык Экинчи LED (көк) ар бир 1с

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

- Clear Timer салыштыруу (CTC) режиминде колдонуу;

- CTC режими менен үзгүлтүктөрдү колдонуу;

void timer1_init () // таймерди инициализациялоо, үзгүлтүккө учуроо жана өзгөрмө {TCCR1B | = (1 << WGM12) | (1 << CS12); // таймерди prescaler = 256 жана CTC режими менен орнотуу TCNT1 = 0; // эсептегичти инициализациялоо OCR1A = 62500; // инициализациялоо салыштыруу мааниси TIMSK1 | = (1 << OCIE1A); // салыштырууну үзүүнү иштетүү}

Проблеманы билдирүүнүн методологиясы: Жарык үчүнчү LED (кызыл) ар бир 16 мс

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

- Clear Timer салыштыруу (CTC) режиминде колдонуу;

- аппараттык CTC режимин үзгүлтүксүз колдонуу;

void timer2_init () // таймерди инициализациялоо {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // таймер OC2A пинди которуштуруу режиминде жана CTC режиминде орнотуу 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 (жашыл) pin PB0 DDRC | = (1 << 1); // туташтыруу 2 (көк) PC1 DDRB пинге алып келди | = (1 << 3); // туташтыруу 3 (кызыл) pin PB3 (OC2A) timer0_init () алып келди; // таймерди инициализациялоо0 timer1_init (); // инициализация timer1 timer2_init (); // timer2ди баштоо (1) // түбөлүк цикл {

Эгерде Timer0 12 жолу ашып кетсе, 12 * 4.096ms = 49.152ms өтмөк. 13 -кайталоодо бизге 50ms кечигүү керек - 49.152ms = 0.848ms. Ошентип, 13 -кайталоодо биз таймерди 53кө чейин санап, анан аны баштапкы абалга келтирүүгө уруксат беребиз.

if (tot_overflow> = 12) // жок болсо текшериңиз. of overflows = 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 -кадам: Электр схемасын жасоо

Электр чынжырын жасоо
Электр чынжырын жасоо
Электр чынжырын жасоо
Электр чынжырын жасоо
Электр чынжырын жасоо
Электр чынжырын жасоо

Схемалык схемага ылайык компоненттерди туташтырыңыз.

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