Sisukord:

AVR mikrokontroller. LEDid vilguvad taimeri abil. Taimerid katkestavad. Taimeri CTC -režiim: 6 sammu
AVR mikrokontroller. LEDid vilguvad taimeri abil. Taimerid katkestavad. Taimeri CTC -režiim: 6 sammu

Video: AVR mikrokontroller. LEDid vilguvad taimeri abil. Taimerid katkestavad. Taimeri CTC -režiim: 6 sammu

Video: AVR mikrokontroller. LEDid vilguvad taimeri abil. Taimerid katkestavad. Taimeri CTC -režiim: 6 sammu
Video: LDmicro 18: GPS-будильник Ublox NEO-6M (программирование лестничной схемы ПЛК микроконтроллера с помощью LDmicro) 2024, Juuli
Anonim
Image
Image

Tere kõigile!

Taimerid on elektroonika valdkonnas oluline mõiste. Iga elektrooniline komponent töötab ajapõhiselt. See ajabaas aitab hoida kogu tööd sünkroonis. Kõik mikrokontrollerid töötavad teatud ettemääratud taktsagedusel, neil kõigil on taimerite seadistamise võimalus. AVR -il on väga täpne, täpne ja usaldusväärne taimer. See pakub selles palju funktsioone, muutes selle suureks teemaks. Parim osa on see, et taimer on protsessorist täiesti sõltumatu. Seega töötab see protsessoriga paralleelselt ja protsessor ei sekku, mis muudab taimeri üsna täpseks. Selles osas selgitan AVR -taimerite põhimõisteid. Kirjutan C -koodis lihtsat programmi LED -välklambi juhtimiseks, kasutades taimerit.

Samm: kirjeldus

Probleemi avaldus 1: vilgutage esimene LED (roheline) iga 50 ms järel
Probleemi avaldus 1: vilgutage esimene LED (roheline) iga 50 ms järel

ATMega328 -s on kolme tüüpi taimerit:

Timer/Counter0 (TC0) - on üldotstarbeline 8 -bitine taimeri/loenduri moodul, millel on kaks sõltumatut OutputCompare ühikut ja PWM tugi;

Taimer/loendur1 (TC1) - 16 -bitine taimer/loendur võimaldab täpset programmi täitmise ajastust (sündmuste haldamine), laine genereerimist ja signaali ajastuse mõõtmist;

Taimer/loendur2 (TC2) -on üldotstarbeline kanal, 8 -bitine taimer/loendur, millel on PWM ja asünkroonne töö;

2. samm. Probleemi avaldus 1: vilgutage esimene LED (roheline) iga 50 ms järel

Probleemi avaldus 1: vilgutage esimene LED (roheline) iga 50 ms järel
Probleemi avaldus 1: vilgutage esimene LED (roheline) iga 50 ms järel
Probleemi avaldus 1: vilgutage esimene LED (roheline) iga 50 ms järel
Probleemi avaldus 1: vilgutage esimene LED (roheline) iga 50 ms järel

Metoodika:

- Timer0 eelskaleri kasutamine kõrgsagedusliku elektrisignaali vähendamiseks madalamale sagedusele täisarvude jagamise teel;

- katkestuse kasutamine iga kord, kui taimer0 ületab;

Taimer0 (8 bitti) see loeb 0 kuni 255 pärast seda, need voolavad üle, see väärtus muutub igal kellaimpulsil.

F_CPU = 16MHz: kellaajaperiood = 1000ms / 16000000Hz = 0,0000625ms

Taimeri arv = (nõutav viivitus / kellaajaperiood) -1 = (50 ms / 0,0000625 ms) = 799999

Kell on juba tiksunud 799999 korda, et anda viivitus vaid 50 ms!

Taimeri arvu vähendamiseks saame kasutada sagedusjaotustehnikat, mida nimetatakse eelseadistamiseks. AVR pakub meile järgmisi eelhäälestusväärtusi: 8, 64, 256 ja 1024. Vaadake tabelit, mis võtab kokku erinevate eelhääletajate kasutamise tulemused.

Loenduri väärtus peab alati olema täisarv. Valime eelsalvesti 256!

Enamikus mikrokontrollerites on midagi, mida nimetatakse katkestamiseks. Selle katkestuse saab vallandada, kui teatud tingimused on täidetud. Nüüd, kui katkestus vallandatakse, peatub AVR ja salvestab põhirutiini täitmise, jälgib katkestuskõnet (käivitades spetsiaalse rutiini, mida nimetatakse teenuse katkestamise rutiiniks, ISR) ja kui see on tehtud, naaseb see peamine rutiin ja jätkab selle täitmist.

Kuna nõutav viivitus (50 ms) on suurem kui maksimaalne võimalik viivitus: 4, 096 ms = 1000 ms / 62500 Hz * 256, läheb taimer ilmselgelt üle. Ja alati, kui taimer ületab, käivitatakse katkestus.

Mitu korda tuleks katkestust vallandada?

50ms / 4,096ms = 3125/256 = 12,207 Kui taimer on 12 korda üle lennanud, oleks 12 * 4,096ms = 49,152ms möödunud. 13. iteratsioonis vajame viivitust 50 ms - 49,152 ms = 0,848 ms.

Sagedusel 62500Hz (prescaler = 256) võtab iga linnuke 0,016 ms. Seega 0,848 ms viivituse saavutamiseks oleks vaja 0,848 ms / 0,016 ms = 53 puuki. Seega lubame 13. iteratsioonil taimeril loendada ainult kuni 53 ja seejärel lähtestada.

Taimer0/loenduri initsialiseerimine (vt pilti):

TCCR0B | = (1 << CS02) // seadistage taimer eelhääletajaga = 256 TCNT0 = 0 // initsialiseerige loendur TIMSK0 | = (1 << TOIE0) // lubage ülevoolu katkestus sei () // lubage globaalsed katkestused tot_overflow = 0 // initsialiseeri ülevoolu loenduri muutuja

Samm: probleemipüstitus 2: vilgutage teine LED (sinine) iga 1 sekundi järel

Probleemi avaldus 2: vilgutage teine LED (sinine) iga 1 sekundi järel
Probleemi avaldus 2: vilgutage teine LED (sinine) iga 1 sekundi järel
Probleemi avaldus 2: vilgutage teine LED (sinine) iga 1 sekundi järel
Probleemi avaldus 2: vilgutage teine LED (sinine) iga 1 sekundi järel
Probleemi avaldus 2: vilgutage teine LED (sinine) iga 1 sekundi järel
Probleemi avaldus 2: vilgutage teine LED (sinine) iga 1 sekundi järel

Metoodika:

- eeltakaja Timer1 kasutamine kõrgsagedusliku elektrisignaali vähendamiseks madalamale sagedusele täisarvude jagamise teel;

- kasutades Clear Timer on Compare (CTC) režiimi;

- katkestuste kasutamine CTC -režiimis;

Taimer1 (16 -bitine) see loeb 0 kuni 65534, pärast seda liiguvad need üle. See väärtus muutub igal kellaimpulsil.

F_CPU = 16MHz: kellaajaperiood = 1000ms / 16000000Hz = 0,0000625ms Taimeri arv = (nõutav viivitus / kellaajaperiood) -1 = (1000ms / 0,0000625ms) = 15999999

Kell on juba 15999999 korda tiksunud, et anda 1s viivitus!

Taimeri arvu vähendamiseks saame kasutada sagedusjaotustehnikat, mida nimetatakse eelseadistamiseks. AVR pakub meile järgmisi eelhäälestusväärtusi: 8, 64, 256 ja 1024. Vaadake tabelit, mis võtab kokku erinevate eelhääletajate kasutamise tulemused. Loenduri väärtus peab alati olema täisarv. Valime eelsalvesti 256!

Režiimis Clear Timer on Compare (CTC), kasutatakse loenduri eraldusvõime muutmiseks OCR1A või ICR1 registrit. CTC -režiimis tühjendatakse loendur nullini, kui loenduri väärtus (TCNT1) vastab kas OCR1A või ICR1. OCR1A või ICR1 määravad loenduri ülemise väärtuse, seega ka selle eraldusvõime. See režiim võimaldab suuremat kontrolli võrdlusväljundi sageduse üle. See lihtsustab ka väliste sündmuste loendamist. Peame ütlema AVR -ile, et taimer1/loendur lähtestatakse kohe, kui selle väärtus jõuab väärtuseni 62500, et saavutada 1 -sekundiline viivitus.

Taimer1/loenduri initsialiseerimine (vt pilti):

TCCR1B | = (1 << WGM12) | (1 << CS12) // seadistage taimer eelskaleriga = 256 ja CTC -režiim TCNT1 = 0 // initsialiseerige loendur TIMSK1 | = (1 << OCIE1A) // lubage võrdluskatkestus OCR1A = 62500 // initsialiseeri võrdlusväärtus

4. samm: probleemipüstitus 3: vilgutage kolmas LED (punane) iga 16 ms järel

Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel
Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel
Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel
Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel
Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel
Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel
Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel
Probleemi avaldus 3: vilgutage kolmas LED (punane) iga 16 ms järel

Metoodika:

- Timer2 eelskaleri kasutamine kõrgsagedusliku elektrisignaali vähendamiseks madalamale sagedusele täisarvude jagamise teel;

- kasutades Clear Timer on Compare (CTC) režiimi;

- riistvara CTC -režiimi kasutamine katkestusteta;

Taimer2 (8 bitti) see loeb 0 kuni 255 pärast seda, nad ülevoolavad. See väärtus muutub igal kellaimpulsil.

F_CPU = 16MHz: kellaaeg = 1000ms / 16000000Hz = 0,0000625ms

Taimeri arv = (nõutav viivitus / kellaajaperiood) -1 = (16 ms / 0,0000625 ms) = 255999

Kell on juba 255999 korda tiksunud, et anda 16 ms viivitus!

Vaadake tabelit, kus on kokku võetud erinevate eelkvalifitseerijate kasutamise tulemused. Loenduri väärtus peab alati olema täisarv. Valime eelsalvesti 1024!

CTC -režiimis tühjendatakse loendur nullini, kui loenduri väärtus (TCNT2) vastab kas OCR2A või ICR2. Tihvt PB3 on ka TIMER2 - OC2A väljundvõrdluse tihvt (vt diagrammi).

Taimer/Counter2 Control Register A - TCCR2A Bit 7: 6 - COM2A1: 0 - Compare Unit A väljundrežiim. OC2A tihvt lülitatakse automaatselt sisse. Pole vaja kontrollida ühtegi lipu bitti, pole vaja katkestuste eest hoolitseda.

Taimer2/loenduri lähtestamine

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // seadistage taimer OC2A pin lülitus- ja CTC -režiimis TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // seadistage taimer eelskaleriga = 1024 TCNT2 = 0 // initsialiseerimisloendur OCR2A = 250 // lähtesta võrdlusväärtus

Samm: programmi koodi kirjutamine C -s. HEX -faili üleslaadimine mikrokontrolleri välkmällu

Programmi kirjutamine koodis C. HEX -faili üleslaadimine mikrokontrolleri välkmällu
Programmi kirjutamine koodis C. HEX -faili üleslaadimine mikrokontrolleri välkmällu
Programmi kirjutamine koodis C. HEX -faili üleslaadimine mikrokontrolleri välkmällu
Programmi kirjutamine koodis C. HEX -faili üleslaadimine mikrokontrolleri välkmällu

AVR -i mikrokontrolleri rakenduse kirjutamine ja ehitamine C -koodis, kasutades integreeritud arendusplatvormi - Atmel Studio.

F_CPU määrab kella sageduse hertsides ja on levinud programmides, mis kasutavad avr-libc raamatukogu. Sel juhul kasutavad seda viivitusrutiinid ajaviivituste arvutamiseks.

#ifndef F_CPU

#define F_CPU 16000000UL // ütle kontrolleri kristallsagedust (16 MHz AVR ATMega328P) #endif

#include // päis, et võimaldada andmevoo juhtimist nööpnõelte üle. Määrab tihvtid, pordid jne.

Esimene kaasamisfail on osa avr-libcist ja seda kasutatakse peaaegu igas AVR-projektis, millega töötate. io.h määrab teie kasutatava protsessori (seetõttu määrate selle koostamisel osa) ja lisab omakorda kasutatava kiibi jaoks sobiva IO määratluse päise. See määratleb lihtsalt kõigi teie tihvtide, portide, eriregistrite jms konstandid.

Katkestamise lubamiseks #include // päis

lenduv uint8_t tot_overflow; // globaalne muutuja ülevoolude arvu lugemiseks

Probleemi avaldamise metoodika: esmalt vilgub (roheline) LED iga 50 ms tagant

- Timer0 eelskaleri kasutamine kõrgsagedusliku elektrisignaali vähendamiseks täisarvude jagamisega madalamale sagedusele;

- katkestuse kasutamine iga kord, kui taimer0 ületab;

void timer0_init () // initsialiseeri taimer0, katkesta ja muutuv

{TCCR0B | = (1 << CS02); // seadista taimer eelskaleriga = 256 TCNT0 = 0; // lähtestada loendur TIMSK0 | = (1 << TOIE0); // lubada ülevool nterrupt sei (); // globaalsete katkestuste lubamine tot_overflow = 0; // initsialiseeri ülevoolu loenduri muutuja}

Probleemi avaldamise metoodika: välklambi teine LED (sinine) iga 1 sekundi järel

- eeltakaja Timer1 kasutamine kõrgsagedusliku elektrisignaali vähendamiseks madalamale sagedusele täisarvude jagamise teel;

- kasutades Clear Timer on Compare (CTC) režiimi;

- katkestuste kasutamine CTC -režiimis;

void timer1_init () // initsialiseeri taimer1, katkestus ja muutuja {TCCR1B | = (1 << WGM12) | (1 << CS12); // seadista taimer eelskaleriga = 256 ja CTC režiim TCNT1 = 0; // lähtestada loendur OCR1A = 62500; // initsialiseeri võrdlusväärtus TIMSK1 | = (1 << OCIE1A); // lubage võrdluse katkestamine}

Probleemi avaldamise metoodika: välk kolmas LED (punane) iga 16 ms järel

- Timer2 eelskaleri kasutamine kõrgsagedusliku elektrisignaali vähendamiseks madalamale sagedusele täisarvude jagamise teel;

- kasutades Clear Timer on Compare (CTC) režiimi;

- riistvara CTC -režiimi kasutamine katkestusteta;

void timer2_init () // initsialiseeri taimer2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // seadistage taimer OC2A pin lülitusrežiimis ja CTC režiimis TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // seadista taimer eelskaleriga = 1024 TCNT2 = 0; // lähtestada loendur OCR2A = 250; // lähtesta võrdlusväärtus}

TIMER0 ülevoolu katkestusteenuse rutiin kutsutakse välja iga kord, kui TCNT0 ületab:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // jälgi ülevoolude arvu}

See ISR käivitatakse alati, kui vaste toimub, seega lülitab lüliti ise siia:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // lülita siia

int main (tühine)

{DDRB | = (1 << 0); // ühenda 1 (roheline) viinud tihvti PB0 DDRC | = (1 << 1); // ühenda 2 (sinine) viis pin PC1 DDRB | = (1 << 3); // ühenda 3 (punane) viinud tihvtiga PB3 (OC2A) timer0_init (); // initsialiseeri taimer0 timer1_init (); // initsialiseeri taimer1 timer2_init (); // initsialiseeri taimer2 samas (1) // silmus igavesti {

Kui Taimer0 on 12 korda üle lennanud, oleks 12 * 4,096 ms = 49,152 ms möödunud. 13. iteratsioonis vajame viivitust 50 ms - 49,152 ms = 0,848 ms. Seega lubame 13. iteratsioonil taimeril loendada ainult kuni 53 ja seejärel lähtestada.

if (tot_overflow> = 12) // kontrollige, kas ei. of overflows = 12 MÄRKUS. Kasutatakse '> ='

{if (TCNT0> = 53) // kontrollige, kas taimerite arv ulatub 53 -ni {PORTB ^= (1 << 0); // lülitab led TCNT0 = 0; // lähtesta loendur tot_overflow = 0; // ületäitmisloenduri lähtestamine}}}}

HEX -faili üleslaadimine mikrokontrolleri välkmällu:

tippige DOS -i aknasse käsk:

avrdude –c [programmeerija nimi] –p m328p –u –U flash: w: [teie hex -faili nimi] Minu puhul on see: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex

See käsk kirjutab hex -faili mikrokontrolleri mällu. Vaadake videot mikrokontrolleri välkmälu põletamise üksikasjaliku kirjeldusega:

Mikrokontrolleri välkmälu põletamine…

Okei! Nüüd töötab mikrokontroller vastavalt meie programmi juhistele. Vaatame üle!

6. samm: elektriahela valmistamine

Elektriahela tegemine
Elektriahela tegemine
Elektriahela tegemine
Elektriahela tegemine
Elektriahela tegemine
Elektriahela tegemine

Ühendage komponendid vastavalt skemaatilisele skeemile.

Soovitan: