Satura rādītājs:

AVR mikrokontrolleris. Gaismas diodes mirgo, izmantojot taimeri. Taimeri pārtrauc. Taimera CTC režīms: 6 soļi
AVR mikrokontrolleris. Gaismas diodes mirgo, izmantojot taimeri. Taimeri pārtrauc. Taimera CTC režīms: 6 soļi

Video: AVR mikrokontrolleris. Gaismas diodes mirgo, izmantojot taimeri. Taimeri pārtrauc. Taimera CTC režīms: 6 soļi

Video: AVR mikrokontrolleris. Gaismas diodes mirgo, izmantojot taimeri. Taimeri pārtrauc. Taimera CTC režīms: 6 soļi
Video: LDmicro 21: настройка режима C и Arduino Mega (программирование микроконтроллера с помощью LDmicro) 2024, Jūlijs
Anonim
Image
Image

Sveiki visiem!

Taimeri ir svarīgs jēdziens elektronikas jomā. Katra elektroniskā sastāvdaļa darbojas uz laika bāzes. Šī laika bāze palīdz visu darbu sinhronizēt. Visi mikrokontrolleri darbojas ar noteiktu pulksteņa frekvenci, un tiem visiem ir iespēja iestatīt taimerus. AVR lepojas ar ļoti precīzu, precīzu un uzticamu taimeri. Tajā ir daudz funkciju, tādējādi padarot to par plašu tēmu. Labākais ir tas, ka taimeris ir pilnīgi neatkarīgs no CPU. Tādējādi tas darbojas paralēli CPU un nav CPU iejaukšanās, kas padara taimeri diezgan precīzu. Šajā sadaļā es izskaidroju AVR taimeru pamatjēdzienus. Es rakstu vienkāršu programmu C kodā, lai kontrolētu LED zibspuldzi, izmantojot taimerus.

1. darbība. Apraksts

1. problēmas izklāsts: iedegsim pirmo LED (zaļā krāsā) ik pēc 50 ms
1. problēmas izklāsts: iedegsim pirmo LED (zaļā krāsā) ik pēc 50 ms

ATMega328 ir trīs veidu taimeri:

Taimeris/skaitītājs0 (TC0) - ir universāls 8 bitu taimera/skaitītāja modulis ar divām neatkarīgām OutputCompare vienībām un PWM atbalstu;

Taimeris/skaitītājs1 (TC1) - 16 bitu taimera/skaitītāja vienība ļauj precīzi izpildīt programmas izpildes laiku (notikumu pārvaldība), viļņu ģenerēšanu un signāla laika mērīšanu;

Taimeris/skaitītājs2 (TC2) -ir universāls kanāls, 8 bitu taimera/skaitītāja modulis ar PWM un asinhronu darbību;

2. darbība: 1. problēmas izklāsts: vispirms iedegsimies gaismas diode (zaļa) ik pēc 50 ms

1. problēmas izklāsts: iedegsim pirmo LED (zaļā krāsā) ik pēc 50 ms
1. problēmas izklāsts: iedegsim pirmo LED (zaļā krāsā) ik pēc 50 ms
1. problēmas izklāsts: iedegsim pirmo LED (zaļā krāsā) ik pēc 50 ms
1. problēmas izklāsts: iedegsim pirmo LED (zaļā krāsā) ik pēc 50 ms

Metodoloģija:

- izmantojot Timer0 prescaler, lai samazinātu augstfrekvences elektrisko signālu līdz zemākai frekvencei, sadalot veselus skaitļus;

- izmantojot pārtraukumu katru reizi, kad taimeris0 pārplūst;

Taimeris0 (8 biti) tas tiek skaitīts no 0 līdz 255 pēc tam, tie pārplūst, šī vērtība mainās katrā pulksteņa impulsā.

F_CPU = 16MHz: pulksteņa laika periods = 1000ms / 16000000Hz = 0.0000625ms

Taimera skaits = (nepieciešamais aizkave / pulksteņa laika periods) -1 = (50 ms / 0,0000625 ms) = 799999

Pulkstenis jau ir atzīmējies 799999 reizes, lai aizkavētos tikai 50 ms!

Lai samazinātu taimera skaitu, mēs varam izmantot frekvenču dalīšanas paņēmienu, ko sauc par iepriekšēja mērogošanu. AVR piedāvā šādas prescaler vērtības: 8, 64, 256 un 1024. Skatiet tabulu, kurā apkopoti dažādu prescaler izmantošanas rezultāti.

Skaitītāja vērtībai vienmēr jābūt veselam skaitlim. Izvēlēsimies prescaler 256!

Lielākajā daļā mikrokontrolleru ir kaut kas tāds, ko sauc par Pārtraukt. Šo pārtraukumu var atlaist, kad ir izpildīti noteikti nosacījumi. Tagad, kad tiek atlaists pārtraukums, AVR pārtrauc un saglabā galvenās rutīnas izpildi, rūpējas par pārtraukuma zvanu (izpildot īpašu rutīnu, ko sauc par pārtraukšanas pakalpojuma kārtību, ISR) un, kad tas ir izdarīts, atgriežas pie galvenā rutīna un turpina to izpildīt.

Tā kā nepieciešamā aizture (50 ms) ir lielāka par maksimālo iespējamo aizkavi: 4, 096ms = 1000ms / 62500Hz * 256, acīmredzot taimeris pārplūdīs. Un ikreiz, kad taimeris pārplūst, tiek pārtraukts.

Cik reizes pārtraukums jāatlaiž?

50 ms / 4,096 ms = 3125 /256 = 12,207 Ja taimeris ir pārskrējis 12 reizes, būtu pagājis 12 * 4,096 ms = 49,152 ms. 13. atkārtojumā mums ir nepieciešama aizkavēšanās 50 ms - 49,152 ms = 0,848 ms.

Ar frekvenci 62500Hz (prescaler = 256) katra ērce aizņem 0,016 ms. Tādējādi, lai sasniegtu 0,848 ms aizkavi, būtu nepieciešami 0,848 ms / 0,016 ms = 53 ērces. Tādējādi 13. atkārtojumā mēs atļaujam taimerim saskaitīt tikai līdz 53 un pēc tam to atiestatīt.

Inicializēt taimeri0/skaitītāju (skat. Attēlu):

TCCR0B | = (1 << CS02) // iestatīt taimeri ar prescaler = 256 TCNT0 = 0 // inicializēt skaitītāju TIMSK0 | = (1 << TOIE0) // iespējot pārplūdes pārtraukumu sei () // iespējot globālos pārtraukumus tot_overflow = 0 // inicializēt pārpildes skaitītāja mainīgo

3. darbība: 2. paziņojums par problēmu: iedegsim otro LED (zils) ik pēc 1 sekundes

2. problēmas izklāsts: iedegsim otro LED (zils) ik pēc 1 sekundes
2. problēmas izklāsts: iedegsim otro LED (zils) ik pēc 1 sekundes
2. problēmas izklāsts: iedegsim otro LED (zils) ik pēc 1 sekundes
2. problēmas izklāsts: iedegsim otro LED (zils) ik pēc 1 sekundes
2. problēmas izklāsts: iedegsim otro LED (zils) ik pēc 1 sekundes
2. problēmas izklāsts: iedegsim otro LED (zils) ik pēc 1 sekundes

Metodoloģija:

- izmantojot Timer1 prescaler, lai samazinātu augstfrekvences elektrisko signālu līdz zemākai frekvencei, sadalot veselus skaitļus;

- izmantojot Clear Timer on Compare (CTC) režīmu;

- izmantojot pārtraukumus ar CTC režīmu;

Taimeris1 (16 bitu) tas skaitās no 0 līdz 65534, pēc tam tie pārplūst. Šī vērtība mainās ar katru pulksteņa impulsu.

F_CPU = 16MHz: Pulksteņa laika periods = 1000ms / 16000000Hz = 0.0000625ms Taimera skaits = (Nepieciešamais aizkave / pulksteņa laika periods) -1 = (1000ms / 0.0000625ms) = 15999999

Pulkstenis jau ir atzīmējies 15999999 reizes, lai aizkavētos 1 s!

Lai samazinātu taimera skaitu, mēs varam izmantot frekvenču dalīšanas paņēmienu, ko sauc par iepriekšēja mērogošanu. AVR piedāvā šādas prescaler vērtības: 8, 64, 256 un 1024. Skatiet tabulu, kurā apkopoti dažādu prescaler izmantošanas rezultāti. Skaitītāja vērtībai vienmēr jābūt veselam skaitlim. Izvēlēsimies prescaler 256!

Režīmā Clear timer on Compare (CTC), lai kontrolētu skaitītāja izšķirtspēju, tiek izmantots OCR1A vai ICR1 reģistrs. CTC režīmā skaitītājs tiek notīrīts līdz nullei, ja skaitītāja vērtība (TCNT1) atbilst vai nu OCR1A, vai ICR1. OCR1A vai ICR1 nosaka skaitītāja augstāko vērtību, tātad arī tā izšķirtspēju. Šis režīms ļauj labāk kontrolēt salīdzināšanas izvades frekvenci. Tas arī vienkāršo ārējo notikumu skaitīšanas darbību. Mums ir jāpasaka AVR, lai atiestatītu taimeri 1/skaitītāju, tiklīdz tā vērtība sasniedz vērtību 62500, tādējādi panākot 1 s aizkavi.

Inicializēt taimeri 1/skaitītāju (skat. Attēlu):

TCCR1B | = (1 << WGM12) | (1 << CS12) // iestatīt taimeri ar prescaler = 256 un CTC režīmu TCNT1 = 0 // inicializēt skaitītāju TIMSK1 | = (1 << OCIE1A) // iespējot salīdzināšanas pārtraukumu OCR1A = 62500 // inicializēt salīdzināšanas vērtību

4. solis: 3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms

3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms
3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms
3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms
3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms
3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms
3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms
3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms
3. problēmas izklāsts: iedegsim trešo LED (sarkans) ik pēc 16 ms

Metodoloģija:

- izmantojot Timer2 prescaler, lai samazinātu augstfrekvences elektrisko signālu līdz zemākai frekvencei, sadalot veselus skaitļus;

- izmantojot Clear Timer on Compare (CTC) režīmu;

- izmantojot aparatūras CTC režīmu bez pārtraukumiem;

Taimeris2 (8 biti) tas skaitās no 0 līdz 255 pēc tam, tie pārplūst. Šī vērtība mainās ar katru pulksteņa impulsu.

F_CPU = 16MHz: pulksteņa laika periods = 1000ms / 16000000Hz = 0.0000625ms

Taimera skaits = (nepieciešamais aizkave / pulksteņa laika periods) -1 = (16 ms / 0,0000625 ms) = 255999

Pulkstenis jau ir atzīmējies 255999 reizes, lai aizkavētos 16 ms!

Skatiet tabulu, kurā apkopoti dažādu pirmsskalotāju izmantošanas rezultāti. Skaitītāja vērtībai vienmēr jābūt veselam skaitlim. Izvēlēsimies prescaler 1024!

CTC režīmā skaitītājs tiek notīrīts līdz nullei, ja skaitītāja vērtība (TCNT2) atbilst vai nu OCR2A, vai ICR2. Piespraude PB3 ir arī TIMER2 - OC2A izejas salīdzināšanas tapa (skat. Diagrammu).

Taimeris/Counter2 Control Register A - TCCR2A Bit 7: 6 - COM2A1: 0 - Salīdziniet A izvades režīmu. Tā kā mums ir jāpārslēdz LED, mēs izvēlamies opciju: Pārslēgt OC2A uz Compare Match Ikreiz, kad notiek salīdzināšanas atbilstība, OC2A tapa tiek automātiski pārslēgta. Nav nepieciešams pārbaudīt nevienu karoga bitu, nav jāapmeklē pārtraukumi.

Inicializēt taimeri2/skaitītāju

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // iestatīt taimera OC2A tapu pārslēgšanas režīmā un CTC režīmā TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // iestatīt taimeri ar prescaler = 1024 TCNT2 = 0 // inicializēt skaitītāju OCR2A = 250 // inicializēt salīdzināšanas vērtību

5. darbība. Programmas koda ierakstīšana C. Augšupielādējiet HEX failu mikrokontrollera zibatmiņā

Programmas rakstīšanas kods C. Augšupielādējot HEX failu mikrokontrollera zibatmiņā
Programmas rakstīšanas kods C. Augšupielādējot HEX failu mikrokontrollera zibatmiņā
Programmas rakstīšanas kods C. Augšupielādējot HEX failu mikrokontrollera zibatmiņā
Programmas rakstīšanas kods C. Augšupielādējot HEX failu mikrokontrollera zibatmiņā

AVR mikrokontrollera lietojumprogrammas rakstīšana un veidošana C kodā, izmantojot integrēto attīstības platformu - Atmel Studio.

F_CPU definē pulksteņa frekvenci hercos un ir izplatīta programmās, kurās tiek izmantota avr-libc bibliotēka. Šajā gadījumā to izmanto kavēšanās kārtība, lai noteiktu, kā aprēķināt laika aizkavēšanos.

#ifndef F_CPU

#define F_CPU 16000000UL // stāsta kontroliera kristāla frekvence (16 MHz AVR ATMega328P) #endif

#include // galvene, lai iespējotu datu plūsmas kontroli pār tapām. Nosaka tapas, ostas utt.

Pirmais iekļaušanas fails ir daļa no avr-libc un tiks izmantots gandrīz visos AVR projektos, pie kuriem strādājat. io.h noteiks jūsu izmantoto centrālo procesoru (tāpēc jūs sastādīšanas laikā norādāt daļu) un, savukārt, iekļaus mūsu izmantotajai mikroshēmai atbilstošo IO definīcijas galveni. Tas vienkārši nosaka konstantes visām jūsu tapām, ostām, īpašiem reģistriem utt.

#include // galvene, lai iespējotu pārtraukšanu

gaistošs uint8_t tot_overflow; // globālais mainīgais, lai skaitītu pārplūdes

Problēmas izklāsta metodoloģija: Pirmā mirgojošā (zaļā) gaismas diode ik pēc 50 ms

- izmantojot Timer0 prescaler, lai samazinātu augstfrekvences elektrisko signālu līdz zemākai frekvencei, sadalot veselus skaitļus;

- izmantojot pārtraukumu katru reizi, kad taimeris0 pārplūst;

void timer0_init () // inicializēt taimeri0, pārtraukt un mainīties

{TCCR0B | = (1 << CS02); // iestatīt taimeri ar prescaler = 256 TCNT0 = 0; // inicializēt skaitītāju TIMSK0 | = (1 << TOIE0); // iespējot pārplūdi nterrupt sei (); // iespējot globālos pārtraukumus tot_overflow = 0; // inicializēt pārpildes skaitītāja mainīgo}

Problēmas izklāsta metodika: zibspuldzes otrā gaismas diode (zila) ik pēc 1 s

- izmantojot Timer1 prescaler, lai samazinātu augstfrekvences elektrisko signālu līdz zemākai frekvencei, sadalot veselus skaitļus;

- izmantojot Clear Timer on Compare (CTC) režīmu;

- izmantojot pārtraukumus ar CTC režīmu;

void timer1_init () // inicializēt taimeri1, pārtraukt un mainīties {TCCR1B | = (1 << WGM12) | (1 << CS12); // iestatīt taimeri ar prescaler = 256 un CTC režīmu TCNT1 = 0; // inicializēt skaitītāju OCR1A = 62500; // inicializēt salīdzināt vērtību TIMSK1 | = (1 << OCIE1A); // iespējot salīdzināšanas pārtraukšanu}

Problēmas izklāsta metodika: zibspuldzes trešā gaismas diode (sarkana) ik pēc 16 ms

- izmantojot Timer2 prescaler, lai samazinātu augstfrekvences elektrisko signālu līdz zemākai frekvencei, sadalot veselus skaitļus;

- izmantojot Clear Timer on Compare (CTC) režīmu;

- izmantojot aparatūras CTC režīmu bez pārtraukumiem;

void timer2_init () // inicializēt taimeri2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // iestatīt taimera OC2A tapu pārslēgšanas režīmā un CTC režīmā TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // iestatīt taimeri ar prescaler = 1024 TCNT2 = 0; // inicializēt skaitītāju OCR2A = 250; // inicializēt salīdzināt vērtību}

TIMER0 pārpildes pārtraukšanas pakalpojumu rutīna tiek izsaukta ikreiz, kad TCNT0 pārplūst:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // izsekot pārpildījumu skaitam}

Šis ISR tiek aktivizēts ikreiz, kad notiek atbilstība, tāpēc pārslēgšanās ved šeit:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // pārslēgt vadību šeit}

int main (anulēts)

{DDRB | = (1 << 0); // pieslēgt 1 (zaļš) noveda pie tapas PB0 DDRC | = (1 << 1); // savienot 2 (zils) noveda pie tapas PC1 DDRB | = (1 << 3); // savienot 3 (sarkans) noveda pie tapas PB3 (OC2A) timer0_init (); // inicializēt taimeri0 timer1_init (); // inicializēt taimeri1 timer2_init (); // inicializēt taimeri2, kamēr (1) // cilpa uz visiem laikiem {

Ja Taimeris0 ir pārlidojis 12 reizes, būtu pagājis 12 * 4,096 ms = 49,152 ms. 13. atkārtojumā mums ir nepieciešama aizkavēšanās 50 ms - 49,152 ms = 0,848 ms. Tādējādi 13. atkārtojumā mēs atļaujam taimerim saskaitīt tikai līdz 53 un pēc tam to atiestatīt.

ja (tot_overflow> = 12) // pārbaudiet, vai nē. no pārplūdēm = 12 PIEZĪME. Tiek izmantots '> ='

{if (TCNT0> = 53) // pārbaudiet, vai taimeru skaits sasniedz 53 {PORTB ^= (1 << 0); // pārslēdz ledus TCNT0 = 0; // atiestatīt skaitītāju tot_overflow = 0; // atiestatīt pārpildes skaitītāju}}}}

HEX faila augšupielāde mikrokontrollera zibatmiņā:

DOS uzvednes logā ierakstiet komandu:

avrdude –c [programmētāja nosaukums] –p m328p –u –U flash: w: [jūsu hex faila nosaukums] Manā gadījumā tas ir: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex

Šī komanda ieraksta hex failu mikrokontrollera atmiņā. Noskatieties video ar detalizētu mikrokontrollera zibatmiņas ierakstīšanas aprakstu:

Mikrokontrollera zibatmiņas ierakstīšana…

Labi! Tagad mikrokontrolleris darbojas saskaņā ar mūsu programmas norādījumiem. Pārbaudīsim!

6. darbība: elektriskās ķēdes izveide

Elektriskās ķēdes izgatavošana
Elektriskās ķēdes izgatavošana
Elektriskās ķēdes izgatavošana
Elektriskās ķēdes izgatavošana
Elektriskās ķēdes izgatavošana
Elektriskās ķēdes izgatavošana

Savienojiet komponentus saskaņā ar shēmu.

Ieteicams: