Sisällysluettelo:

AVR -mikrokontrolleri. LEDit vilkkuvat ajastimen avulla. Ajastimet keskeyttävät. Ajastin CTC -tila: 6 vaihetta
AVR -mikrokontrolleri. LEDit vilkkuvat ajastimen avulla. Ajastimet keskeyttävät. Ajastin CTC -tila: 6 vaihetta

Video: AVR -mikrokontrolleri. LEDit vilkkuvat ajastimen avulla. Ajastimet keskeyttävät. Ajastin CTC -tila: 6 vaihetta

Video: AVR -mikrokontrolleri. LEDit vilkkuvat ajastimen avulla. Ajastimet keskeyttävät. Ajastin CTC -tila: 6 vaihetta
Video: LDmicro 13: HC-05 Bluetooth Phone App Control (Microcontroller PLC Ladder Programming with LDmicro) 2024, Heinäkuu
Anonim
Image
Image

Hei kaikki!

Ajastimet ovat tärkeä käsite elektroniikan alalla. Jokainen elektroninen komponentti toimii aikapohjalla. Tämä aikapohja auttaa pitämään kaiken työn synkronoituna. Kaikki mikrokontrollerit toimivat tietyllä ennalta määrätyllä kellotaajuudella, ja niillä kaikilla on mahdollisuus asettaa ajastimet. AVR: ssä on ajastin, joka on erittäin tarkka, tarkka ja luotettava. Se tarjoaa runsaasti ominaisuuksia, joten se on laaja aihe. Parasta on, että ajastin on täysin riippumaton suorittimesta. Siten se toimii rinnakkain suorittimen kanssa eikä suorittimen väliintuloa ole, mikä tekee ajastimesta varsin tarkan. Tässä osassa selitän AVR -ajastimien peruskäsitteet. Kirjoitan yksinkertaista ohjelmaa C -koodissa ohjaamaan LED -vilkkuria ajastimilla.

Vaihe 1: Kuvaus

Ongelma 1: Vilkataan ensin LED (vihreä) 50 ms välein
Ongelma 1: Vilkataan ensin LED (vihreä) 50 ms välein

ATMega328: ssa on kolmenlaisia ajastimia:

Ajastin/laskuri0 (TC0) - on yleiskäyttöinen 8 -bittinen ajastin/laskuri -moduuli, jossa on kaksi itsenäistä OutputCompare -yksikköä ja PWM -tuki;

Ajastin/laskuri1 (TC1) - 16 -bittinen ajastin/laskuriyksikkö mahdollistaa tarkan ohjelman suorituksen ajoituksen (tapahtumanhallinnan), aallon generoinnin ja signaalin ajoituksen mittaamisen;

Ajastin/laskuri2 (TC2) -on yleiskäyttöinen kanava, 8 -bittinen ajastin/laskuri -moduuli, jossa on PWM ja asynkroninen käyttö;

Vaihe 2: Ongelmalausunto 1: Vilkataan ensin LED (vihreä) 50 ms välein

Ongelma 1: Vilkataan ensin LED (vihreä) 50 ms välein
Ongelma 1: Vilkataan ensin LED (vihreä) 50 ms välein
Ongelma 1: Vilkataan ensin LED (vihreä) 50 ms välein
Ongelma 1: Vilkataan ensin LED (vihreä) 50 ms välein

Metodologia:

- käyttämällä esimerkintä Timer0 pienentääkseen suurtaajuisen sähköisen signaalin alemmalle taajuudelle kokonaislukujakautuksella;

- keskeytyksen käyttäminen aina, kun ajastin0 ylittää;

Ajastin0 (8 bittiä) se laskee sen jälkeen 0: sta 255: een, ne ylittävät, tämä arvo muuttuu jokaisella kellopulssilla.

F_CPU = 16MHz: Kellonaika = 1000ms / 16000000Hz = 0.0000625ms

Ajastimen määrä = (pakollinen viive / kellonaika) -1 = (50 ms / 0,0000625 ms) = 799999

Kello on jo tikannut 799999 kertaa, jolloin viive on vain 50 ms!

Voimme käyttää taajuusjakautumistekniikkaa, jota kutsutaan esiasetukseksi, ajastimen laskemiseksi. AVR tarjoaa meille seuraavat esivalinta -arvot: 8, 64, 256 ja 1024. Katso taulukko, jossa on yhteenveto eri esivalitsimien käytön tuloksista.

Laskurin arvon tulee aina olla kokonaisluku. Valitse esivalitsin 256!

Useimmissa mikro -ohjaimissa on keskeytys. Tämä keskeytys voidaan laukaista aina, kun tietyt ehdot täyttyvät. Nyt aina kun keskeytys laukaistaan, AVR pysähtyy ja tallentaa päärutiinin suorituksen, huolehtii keskeytyskutsusta (suorittamalla erityisen rutiinin, nimeltään Interrupt Service Routine, ISR) ja palaa sen jälkeen tärkein rutiini ja jatkaa sen suorittamista.

Koska vaadittu viive (50 ms) on suurempi kuin suurin mahdollinen viive: 4, 096 ms = 1000 ms / 62500 Hz * 256, ajastin ylittää luonnollisesti. Ja aina kun ajastin ylittää, keskeytys laukaistaan.

Kuinka monta kertaa keskeytys pitää laukaista?

50 ms / 4,096 ms = 3125/256 = 12,207 Jos ajastin on ylittänyt 12 kertaa, 12 * 4,096 ms = 49,152 ms olisi kulunut. 13. iteroinnissa tarvitaan 50 ms - 49,152 ms = 0,848 ms viive.

Taajuudella 62500 Hz (esiskaalain = 256) jokainen rasti vie 0,016 ms. Näin ollen 0,848 ms: n viiveen saavuttamiseksi se vaatii 0,848 ms / 0,016 ms = 53 punkkia. Siten 13. iteroinnissa sallimme vain ajastimen laskea jopa 53 ja nollata sen sitten.

Alusta ajastin0/laskuri (katso kuva):

TCCR0B | = (1 << CS02) // aseta ajastin esivahvistimella = 256 TCNT0 = 0 // alustuslaskuri TIMSK0 | = (1 << TOIE0) // ota käyttöön ylivuotokeskeytys sei () // ota käyttöön maailmanlaajuiset keskeytykset tot_overflow = 0 // alustaa ylivuotolaskurimuuttuja

Vaihe 3: Ongelmalausunto 2: Vilkataan toinen LED (sininen) 1 sekunnin välein

Ongelma 2: Vilkataan toinen LED (sininen) 1 sekunnin välein
Ongelma 2: Vilkataan toinen LED (sininen) 1 sekunnin välein
Ongelma 2: Vilkataan toinen LED (sininen) 1 sekunnin välein
Ongelma 2: Vilkataan toinen LED (sininen) 1 sekunnin välein
Ongelma 2: Vilkataan toinen LED (sininen) 1 sekunnin välein
Ongelma 2: Vilkataan toinen LED (sininen) 1 sekunnin välein

Metodologia:

- käyttämällä esiajastinta Timer1 suuren taajuuden sähköisen signaalin pienentämiseksi alemmalle taajuudelle kokonaislukujakautuksella;

- käyttämällä Clear Timer on Compare (CTC) -tilaa;

- keskeytysten käyttäminen CTC -tilassa;

Ajastin1 (16 -bittinen) se laskee 0: sta 65534: een, sen jälkeen ne täyttyvät. Tämä arvo muuttuu jokaisella kellopulssilla.

F_CPU = 16MHz: Kellonaika = 1000ms / 16000000Hz = 0.0000625ms Ajastimen lukumäärä = (Vaadittu viive / kellonaika) -1 = (1000ms / 0.0000625ms) = 15999999

Kello on kulunut jo 15999999 kertaa 1 sekunnin viiveellä!

Voimme käyttää taajuusjakautumistekniikkaa, jota kutsutaan esiasetukseksi, ajastimen laskemiseksi. AVR tarjoaa meille seuraavat esivalinta -arvot: 8, 64, 256 ja 1024. Katso taulukko, jossa on yhteenveto eri esivalitsimien käytön tuloksista. Laskurin arvon tulee aina olla kokonaisluku. Valitse esivalitsin 256!

CTC (Clear timer on Compare) -tilassa OCR1A- tai ICR1 -rekisteriä käytetään laskurin resoluution manipulointiin. CTC -tilassa laskuri nollataan, kun laskurin arvo (TCNT1) vastaa joko OCR1A: ta tai ICR1: tä. OCR1A tai ICR1 määrittävät laskurin yläarvon ja siten myös sen resoluution. Tämä tila mahdollistaa paremman vertailun ottelun lähtötaajuuteen. Se myös yksinkertaistaa ulkoisten tapahtumien laskemista. Meidän on kehotettava AVR: ää nollaamaan ajastin1/laskuri heti, kun sen arvo saavuttaa arvon 62500, jotta saavutetaan 1 sekunnin viive.

Alusta ajastin1/laskuri (katso kuva):

TCCR1B | = (1 << WGM12) | (1 << CS12) // aseta ajastin, jossa esiasetin = 256 ja CTC -tila = 62500 // vertaile arvon alustaminen

Vaihe 4: Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein

Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein

Metodologia:

- käyttämällä esimerkintä Timer2 suuren taajuuden sähköisen signaalin pienentämiseksi alemmalle taajuudelle kokonaislukujakautuksella;

- käyttämällä Clear Timer on Compare (CTC) -tilaa;

- Laitteiston CTC -tilan käyttö keskeytyksettä;

Ajastin2 (8 -bittinen) se laskee 0: sta 255: een, sen jälkeen ne täyttyvät. Tämä arvo muuttuu jokaisella kellopulssilla.

F_CPU = 16MHz: Kellonaika = 1000ms / 16000000Hz = 0.0000625ms

Ajastimen määrä = (pakollinen viive / kellonaika) -1 = (16 ms / 0,0000625 ms) = 255999

Kello on jo tikannut 255999 kertaa ja viive on 16 ms!

Katso taulukko, jossa on yhteenveto eri esiskaalauslaitteiden käytön tuloksista. Laskurin arvon tulee aina olla kokonaisluku. Valitaan esikaapeli 1024!

CTC -tilassa laskuri nollataan, kun laskurin arvo (TCNT2) vastaa joko OCR2A: ta tai ICR2: ta. Nasta PB3 on myös TIMER2 - OC2A: n lähdön vertailutappi (katso kaavio).

Ajastin/laskuri2 -ohjausrekisteri A - TCCR2A Bitti 7: 6 - COM2A1: 0 - Vertaa lähtöyksikköä A vertailulaitteeseen A. Koska meidän on vaihdettava LED -valoa, valitsemme vaihtoehdon: Vaihda OC2A -vertailupelissä Aina kun vertailutulos tulee, OC2A -nasta vaihtuu automaattisesti. Sinun ei tarvitse tarkistaa mitään lippubittiä, ei tarvitse huolehtia keskeytyksistä.

Alusta ajastin2/laskuri

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // aseta ajastimen OC2A -nasta kytkentä- ja CTC -tilaan TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // aseta ajastin esikaalaimella = 1024 TCNT2 = 0 // alustuslaskuri OCR2A = 250 // alustava vertailuarvo

Vaihe 5: Ohjelman koodin kirjoittaminen C

Ohjelman kirjoittaminen C -muodossa. HEX -tiedoston lataaminen mikro -ohjaimen flash -muistiin
Ohjelman kirjoittaminen C -muodossa. HEX -tiedoston lataaminen mikro -ohjaimen flash -muistiin
Ohjelman kirjoittaminen C -muodossa. HEX -tiedoston lataaminen mikro -ohjaimen flash -muistiin
Ohjelman kirjoittaminen C -muodossa. HEX -tiedoston lataaminen mikro -ohjaimen flash -muistiin

AVR -mikrokontrollerisovelluksen kirjoittaminen ja rakentaminen C -koodissa integroidulla kehitysalustalla - Atmel Studio.

F_CPU määrittää kellotaajuuden hertseinä ja on yleinen avr-libc-kirjastoa käyttävissä ohjelmissa. Tässä tapauksessa viivästysrutiinit käyttävät sitä määrittämään, miten aikaviiveet lasketaan.

#ifndef F_CPU

#define F_CPU 16000000UL // kertoo ohjaimen kristallitaajuuden (16 MHz AVR ATMega328P) #endif

#include // otsikko, joka mahdollistaa tiedonkulun hallinnan nastojen yli. Määrittää nastat, portit jne.

Ensimmäinen sisällytystiedosto on osa avr-libc-tiedostoa ja sitä käytetään melkein missä tahansa AVR-projektissa, jonka parissa työskentelet. io.h määrittää käyttämäsi suorittimen (minkä vuoksi määrität osan kääntäessäsi) ja sisältää puolestaan sopivan IO -määritysotsikon käyttämäämme sirua varten. Se yksinkertaisesti määrittää vakiot kaikille nastoille, porteille, erityisille rekistereille jne.

#include // otsikko keskeytyksen ottamiseksi käyttöön

haihtuva uint8_t tot_overflow; // globaali muuttuja, joka laskee ylivuotojen määrän

Ongelmanilmaisumenetelmä: Vilkkuu ensin (vihreä) -merkkivalo 50 ms: n välein

- käyttämällä esimerkintä Timer0 pienentääkseen suurtaajuisen sähköisen signaalin alemmalle taajuudelle kokonaislukujakautuksella;

- keskeytyksen käyttäminen aina, kun ajastin0 ylittää;

void timer0_init () // alustaa ajastin0, keskeyttää ja muuttua

{TCCR0B | = (1 << CS02); // aseta ajastin esikaalaimella = 256 TCNT0 = 0; // alustaa laskuri TIMSK0 | = (1 << TOIE0); // salli ylivuoto nterrupt sei (); // salli globaalit keskeytykset tot_overflow = 0; // ylivuotolaskurimuuttujan alustaminen}

Ongelmanilmaisumenetelmä: Salaman toinen LED (sininen) 1 sekunnin välein

- käyttämällä esiajastinta Timer1 suuren taajuuden sähköisen signaalin pienentämiseksi alemmalle taajuudelle kokonaislukujakautuksella;

- käyttämällä Clear Timer on Compare (CTC) -tilaa;

- keskeytysten käyttäminen CTC -tilassa;

void timer1_init () // alustetaan ajastin1, keskeytys ja muuttuja {TCCR1B | = (1 << WGM12) | (1 << CS12); // aseta ajastin, jossa esiasetin = 256 ja CTC -tila TCNT1 = 0; // alustetaan laskuri OCR1A = 62500; // alustaa vertailuarvo TIMSK1 | = (1 << OCIE1A); // salli vertailun keskeytys}

Ongelmanilmaisumenetelmä: Salaman kolmas LED (punainen) 16 ms: n välein

- käyttämällä esimerkintä Timer2 suuren taajuuden sähköisen signaalin pienentämiseksi alemmalle taajuudelle kokonaislukujakautuksella;

- käyttämällä Clear Timer on Compare (CTC) -tilaa;

- Laitteiston CTC -tilan käyttö keskeytyksettä;

void timer2_init () // alustaa ajastin2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // aseta ajastimen OC2A -nasta kytkentä- ja CTC -tilaan TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // aseta ajastin esikaalaimella = 1024 TCNT2 = 0; // alustetaan laskuri OCR2A = 250; // alustetaan vertailuarvo}

TIMER0 -ylivuotokeskeytyspalvelurutiini kutsutaan aina, kun TCNT0 ylittää:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // seuraa ylivuotojen määrää}

Tämä ISR laukaistaan aina, kun ottelu tapahtuu, joten kytkin johtaa tähän itse:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // vaihda led tänne}

int main (mitätön)

{DDRB | = (1 << 0); // yhdistä 1 (vihreä) johti nastaan PB0 DDRC | = (1 << 1); // liitä 2 (sininen) johti nastaan PC1 DDRB | = (1 << 3); // liitä 3 (punainen) johti nastaan PB3 (OC2A) timer0_init (); // alustetaan ajastin0 timer1_init (); // alustetaan ajastin1 timer2_init (); // alustetaan ajastin2 while (1) // silmukka ikuisesti {

Jos Ajastin0 on ylittänyt 12 kertaa, 12 * 4,096 ms = 49,152 ms olisi kulunut. 13. iteroinnissa tarvitaan 50 ms - 49,152 ms = 0,848 ms viive. Siten 13. iteroinnissa sallimme vain ajastimen laskea jopa 53 ja nollata sen sitten.

if (tot_overflow> = 12) // tarkista, jos ei. of overflows = 12 HUOMAUTUS: '> =' käytetään

{if (TCNT0> = 53) // tarkista saavuttaako ajastimen määrä 53 {PORTB ^= (1 << 0); // vaihtaa ledin TCNT0 = 0; // nollaa laskuri tot_overflow = 0; // nollaa ylivuotolaskuri}}}}

HEX -tiedoston lataaminen mikro -ohjaimen flash -muistiin:

kirjoita DOS -kehoteikkunaan komento:

avrdude –c [ohjelmoijan nimi] –p m328p –u –U flash: w: [hex -tiedoston nimi] Minun tapauksessani se on: avrdude –c ISPProgv1 –p m328p –u –U flash: w: Timers.hex

Tämä komento kirjoittaa heksatiedoston mikro -ohjaimen muistiin. Katso video, jossa on yksityiskohtainen kuvaus mikro -ohjaimen flash -muistin polttamisesta:

Mikro -ohjaimen flash -muisti poltetaan…

Ok! Nyt mikrokontrolleri toimii ohjelmamme ohjeiden mukaisesti. Tarkistetaan se!

Vaihe 6: Sähköpiirin tekeminen

Sähköpiirin tekeminen
Sähköpiirin tekeminen
Sähköpiirin tekeminen
Sähköpiirin tekeminen
Sähköpiirin tekeminen
Sähköpiirin tekeminen

Liitä komponentit kaavion mukaisesti.

Suositeltava: