Sisällysluettelo:
- Vaihe 1: Kuvaus
- Vaihe 2: Ongelmalausunto 1: Vilkataan ensin LED (vihreä) 50 ms välein
- Vaihe 3: Ongelmalausunto 2: Vilkataan toinen LED (sininen) 1 sekunnin välein
- Vaihe 4: Ongelmalausunto 3: Vilkataan kolmas LED (punainen) 16 ms: n välein
- Vaihe 5: Ohjelman koodin kirjoittaminen C
- Vaihe 6: Sähköpiirin tekeminen
Video: AVR -mikrokontrolleri. LEDit vilkkuvat ajastimen avulla. Ajastimet keskeyttävät. Ajastin CTC -tila: 6 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:02
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
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
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
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
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
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
Liitä komponentit kaavion mukaisesti.
Suositeltava:
Digitaalisen ajastimen luominen Blynkin avulla: 5 vaihetta
Digitaalisen ajastimen luominen Blynkin avulla: Tässä viestissä opimme, miten pääset alkuun Blynkin kanssa - IoT -alustalla, joka on suunniteltu yksinkertaistamaan koko prosessia meille ja joka toimii myös useiden Internet -yhteensopivien levyjen kanssa
Askelmoottori, jossa D -varvastossut ja 555 -ajastin; piirin ensimmäinen osa 555 -ajastin: 3 vaihetta
Askelmoottori, jossa D -varvastossut ja 555 -ajastin; piirin ensimmäinen osa 555 -ajastin: Askelmoottori on tasavirtamoottori, joka liikkuu erillisinä vaiheina, ja sitä käytetään usein tulostimissa ja jopa robotiikassa. Selitän tämän piirin vaiheittain. ajastin. Se on ensimmäinen kuva (katso yllä), jossa on 555 siru ja
Halloween -projekti kallo, Arduino, vilkkuvat LEDit ja vierittävät silmät - Maker, MakerED, MakerSpaces: 4 vaihetta
Halloween -projekti kallo, Arduino, vilkkuvat LEDit ja vierittävät silmät | Maker, MakerED, MakerSpaces: Halloween -projekti, jossa on kallo, Arduino, vilkkuvat LEDit ja vierittävät silmät Pian on Halloween, joten luomme pelottavan projektin koodauksen ja DIY: Opetusohjelma on tarkoitettu ihmisille, joilla ei ole 3D-tulostinta, käytämme 21 cm: n lasia
NE555 Ajastin - NE555 -ajastimen määrittäminen vakaana kokoonpanona: 7 vaihetta
NE555 Ajastin | NE555 -ajastimen määrittäminen epävakaassa kokoonpanossa: NE555 -ajastin on yksi yleisimmin käytetyistä IC -laitteista elektroniikkamaailmassa. Se on DIP 8: n muodossa, mikä tarkoittaa, että siinä on 8 nastaa
555 Ajastin, jossa on vuosikymmenen laskuri, LEDit ja pietsosummeri; piirin peruskuvaus: 6 vaihetta
555 Ajastin, jossa on vuosikymmenen laskuri, LEDit ja pietsosummeri; piirin peruskuvaus: Tämä piiri koostuu kolmesta osasta, ne ovat pietsosummeri, joka tuottaa ääntä. Koodi (ohjelma) soittaa " Hyvää syntymäpäivää " Arduino pietson kautta. Seuraava askel on 555 -ajastin, joka tuottaa pulsseja, jotka toimivat kellona