Turinys:
- 1 žingsnis: aprašymas
- 2 veiksmas: 1 problemos teiginys: pirmiausia mirksi LED (žalia) kas 50 ms
- 3 veiksmas: 2 problemos teiginys: mirksime antrą šviesos diodą (mėlynas) kas 1 sekundę
- 4 žingsnis: 3 problemos teiginys: mirksėkime trečiuoju šviesos diodu (raudonu) kas 16 ms
- 5 veiksmas: programos kodo rašymas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį
- 6 žingsnis: sukurkite elektros grandinę
Video: AVR mikrovaldiklis. Šviesos diodai mirksi naudojant laikmatį. Laikmačiai pertraukia. Laikmačio CTC režimas: 6 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:47
Sveiki visi!
Laikmačiai yra svarbi sąvoka elektronikos srityje. Kiekvienas elektroninis komponentas veikia pagal laiką. Ši laiko bazė padeda sinchronizuoti visus darbus. Visi mikrovaldikliai veikia tam tikru iš anksto nustatytu laikrodžio dažniu, jie visi turi galimybę nustatyti laikmačius. AVR gali pasigirti laikmačiu, kuris yra labai tikslus, tikslus ir patikimas. Jame yra daugybė funkcijų, todėl tai yra plati tema. Geriausia tai, kad laikmatis yra visiškai nepriklausomas nuo procesoriaus. Taigi, jis veikia lygiagrečiai procesoriui ir nėra CPU įsikišimo, todėl laikmatis yra gana tikslus. Šiame skyriuje paaiškinu pagrindines AVR laikmačių sąvokas. Aš rašau paprastą programą C kodu, kad valdyčiau LED blykstę, naudodamas laikmačius.
1 žingsnis: aprašymas
„ATMega328“yra trijų tipų laikmačiai:
Laikmatis/skaitiklis0 (TC0) - yra bendrosios paskirties 8 bitų laikmačio/skaitiklio modulis, turintis du nepriklausomus „OutputCompare“įrenginius ir PWM palaikymą;
Laikmatis/skaitiklis1 (TC1) - 16 bitų laikmatis/skaitiklis leidžia tiksliai atlikti programos vykdymą (įvykių valdymą), bangų generavimą ir signalo laiko matavimą;
Laikmatis/skaitiklis2 (TC2) -tai bendrosios paskirties kanalas, 8 bitų laikmačio/skaitiklio modulis su PWM ir asinchroniniu valdymu;
2 veiksmas: 1 problemos teiginys: pirmiausia mirksi LED (žalia) kas 50 ms
Metodika:
- naudojant „Timer0“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;
- naudojant pertraukimą kiekvieną kartą, kai Timer0 perpildo;
Laikmatis0 (8 bitai) po to skaičiuojamas nuo 0 iki 255, jie perpildomi, ši vertė keičiasi kiekvienu laikrodžio impulsu.
F_CPU = 16MHz: Laikrodžio laikotarpis = 1000ms / 16000000Hz = 0.0000625ms
Laikmačio skaičius = (būtinas atidėjimas / laikrodžio laiko periodas) -1 = (50 ms / 0,0000625 ms) = 799999
Laikrodis jau tiksėjo 799999 kartus, kad vėluotų tik 50 ms!
Norėdami sumažinti laikmačio skaičių, galime naudoti dažnio padalijimo techniką, vadinamą prescaling. AVR siūlo šias iš anksto parinktas skalės reikšmes: 8, 64, 256 ir 1024. Žiūrėkite lentelę, kurioje apibendrinti skirtingų prescalerių naudojimo rezultatai.
Skaitiklio vertė visada turi būti sveikasis skaičius. Rinkimės prescaler 256!
Daugelyje mikrovaldiklių yra kažkas, kas vadinama pertraukimu. Šis pertraukimas gali būti paleistas, kai įvykdomos tam tikros sąlygos. Dabar, kai tik įjungiamas pertraukimas, AVR sustoja ir išsaugo pagrindinės rutinos vykdymą, pasirūpina pertraukimo skambučiu (vykdydamas specialią procedūrą, vadinamą pertraukimo paslaugų tvarka, ISR), ir kai tai atliekama, grįžta į pagrindinė rutina ir toliau ją vykdyti.
Kadangi reikalingas vėlavimas (50 ms) yra didesnis nei didžiausias galimas uždelsimas: 4, 096 ms = 1000 ms / 62500 Hz * 256, akivaizdu, kad laikmatis perpildys. Ir kai laikmatis perpildomas, nutraukiamas pertraukimas.
Kiek kartų pertrauka turi būti atleista?
50 ms / 4,096 ms = 3125/256 = 12,207 Jei laikmatis perskrido 12 kartų, praėjo 12 * 4,096 ms = 49,152 ms. 13 -oje iteracijoje mums reikia 50 ms delsos - 49,152 ms = 0,848 ms.
Esant 62500 Hz dažniui (prescaler = 256), kiekviena erkė užtrunka 0,016 ms. Taigi, norint pasiekti 0,848 ms vėlavimą, reikės 0,848 ms / 0,016 ms = 53 erkių. Taigi, 13 -oje iteracijoje leidžiame tik laikmačiui suskaičiuoti iki 53, o tada jį iš naujo nustatyti.
Inicijuoti laikmatį0/skaitiklį (žr. Paveikslėlį):
TCCR0B | = (1 << CS02) // nustatyti laikmatį su prescaler = 256 TCNT0 = 0 // inicijuoti skaitiklį TIMSK0 | = (1 << TOIE0) // įgalinti perpildymo pertraukimą sei () // įgalinti visuotinius pertraukimus tot_overflow = 0 // inicijuoti perpildymo skaitiklio kintamąjį
3 veiksmas: 2 problemos teiginys: mirksime antrą šviesos diodą (mėlynas) kas 1 sekundę
Metodika:
- naudojant „Timer1“prescalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;
- naudojant „Clear Timer on Compare“(CTC) režimą;
- naudojant pertraukas su CTC režimu;
Laikmatis1 (16 bitų) jis skaičiuojamas nuo 0 iki 65534, po to jie perpildomi. Ši vertė keičiasi kiekvienu laikrodžio impulsu.
F_CPU = 16MHz: Laikrodžio trukmė = 1000ms / 16000000Hz = 0.0000625ms
Laikrodis jau tiksėjo 15999999 kartus, kad būtų atidėtas 1 s!
Norėdami sumažinti laikmačio skaičių, galime naudoti dažnio padalijimo techniką, vadinamą prescaling. AVR siūlo šias iš anksto parinktas skalės reikšmes: 8, 64, 256 ir 1024. Žiūrėkite lentelę, kurioje apibendrinti skirtingų prescalerių naudojimo rezultatai. Skaitiklio vertė visada turi būti sveikasis skaičius. Rinkimės prescaler 256!
„Clear timer on Compare“(CTC) režimu OCR1A arba ICR1 registras naudojamas manipuliuoti skaitiklio raiška. CTC režimu skaitiklis išvalomas iki nulio, kai skaitiklio vertė (TCNT1) atitinka OCR1A arba ICR1. OCR1A arba ICR1 apibrėžia didžiausią skaitiklio vertę, taigi ir jo skiriamąją gebą. Šis režimas leidžia geriau kontroliuoti rungtynių išvesties dažnį. Taip pat supaprastinamas išorinių įvykių skaičiavimas. Turime pasakyti AVR, kad iš naujo nustatytų laikmatį1/skaitiklį, kai tik jo vertė pasieks 62500 vertę, kad būtų pasiektas 1 s atidėjimas.
Inicijuoti laikmatį1/skaitiklį (žr. Paveikslėlį):
TCCR1B | = (1 << WGM12) | (1 << CS12) // nustatyti laikmatį su prescaler = 256 ir CTC režimu TCNT1 = 0 // inicijuoti skaitiklį TIMSK1 | = (1 << OCIE1A) // įgalinti palyginimo pertraukimą OCR1A = 62500 // inicijuoti palyginimo vertę
4 žingsnis: 3 problemos teiginys: mirksėkime trečiuoju šviesos diodu (raudonu) kas 16 ms
Metodika:
- naudojant „Timer2“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;
- naudojant „Clear Timer on Compare“(CTC) režimą;
- naudojant aparatūros CTC režimą be pertraukų;
Laikmatis2 (8 bitai) jis skaičiuojamas nuo 0 iki 255 po to, jie perpildomi. Ši vertė keičiasi kiekvienu laikrodžio impulsu.
F_CPU = 16MHz: Laikrodžio laikotarpis = 1000ms / 16000000Hz = 0.0000625ms
Laikmačio skaičius = (būtinas atidėjimas / laikrodžio laiko periodas) -1 = (16 ms / 0,0000625 ms) = 255999
Laikrodis jau tiksėjo 255999 kartus, kad vėluotų 16 ms!
Žiūrėkite lentelę, kurioje apibendrinti skirtingų prescalerių naudojimo rezultatai. Skaitiklio vertė visada turi būti sveikasis skaičius. Išsirinkime prescaler 1024!
CTC režimu skaitiklis išvalomas iki nulio, kai skaitiklio vertė (TCNT2) atitinka OCR2A arba ICR2. Smeigtukas PB3 taip pat yra TIMER2 - OC2A išvesties palyginimo kaištis (žr. Diagramą).
Laikmatis/Counter2 valdymo registras A - TCCR2A Bit 7: 6 - COM2A1: 0 - Palyginkite A palyginimo įrenginio išvesties režimą. Kadangi mums reikia perjungti šviesos diodą, pasirenkame parinktį: Perjungti OC2A į palyginimo rungtynes Kaskart lyginant, OC2A kaištis automatiškai perjungiamas. Nereikia tikrinti vėliavos bitų, nereikia rūpintis jokiais pertraukimais.
Inicijuokite laikmatį2/skaitiklį
TCCR2A | = (1 << COM2A0) | (1 << WGM21) // nustatyti laikmačio OC2A kaištį perjungimo ir CTC režimu TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // nustatyti laikmatį su prescaler = 1024 TCNT2 = 0 // inicijuoti skaitiklį OCR2A = 250 // inicijuoti palyginimo vertę
5 veiksmas: programos kodo rašymas C. Įkeliant HEX failą į mikrovaldiklio „Flash“atmintį
AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą - „Atmel Studio“.
F_CPU nustato laikrodžio dažnį hercais ir yra įprastas programose, kuriose naudojama avr-libc biblioteka. Šiuo atveju jį naudoja vėlavimo tvarka, kad nustatytų, kaip apskaičiuoti vėlavimą.
#ifndef F_CPU
#define F_CPU 16000000UL // nurodo valdiklio kristalų dažnį (16 MHz AVR ATMega328P) #endif
#include // antraštė, kad būtų galima valdyti srautų duomenų srautus. Apibrėžia kaiščius, prievadus ir kt.
Pirmasis įtraukimo failas yra avr-libc dalis ir bus naudojamas beveik bet kuriame AVR projekte, prie kurio dirbate. „io.h“nustatys jūsų naudojamą procesorių (todėl kompiliavimo metu nurodote dalį) ir savo ruožtu įtraukia atitinkamą naudojamo lusto IO apibrėžimo antraštę. Tai tiesiog apibrėžia visų jūsų kaiščių, prievadų, specialių registrų ir kt.
#include // antraštė, leidžianti pertraukti
nepastovus uint8_t tot_overflow; // pasaulinis kintamasis, kad būtų galima skaičiuoti perpildymų skaičių
Problemos aprašymo metodika: pirmiausia mirksi (žalia) šviesos diodas kas 50 ms
- naudojant „Timer0“prescalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;
- naudojant pertraukimą kiekvieną kartą, kai Timer0 perpildo;
void timer0_init () // inicijuoti laikmatį0, pertraukti ir kintamas
{TCCR0B | = (1 << CS02); // nustatyti laikmatį su prescaler = 256 TCNT0 = 0; // inicijuoti skaitiklį TIMSK0 | = (1 << TOIE0); // įgalinti perpildymą nterrupt sei (); // įgalinti visuotinius pertraukimus tot_overflow = 0; // inicijuoti perpildymo skaitiklio kintamąjį}
Problemos konstatavimo metodika: blykstė Antrasis šviesos diodas (mėlynas) kas 1 sekundė
- naudojant „Timer1“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;
- naudojant „Clear Timer on Compare“(CTC) režimą;
- naudojant pertraukas su CTC režimu;
void timer1_init () // inicijuoti laikmatį1, pertraukimas ir kintamasis {TCCR1B | = (1 << WGM12) | (1 << CS12); // nustatyti laikmatį su prescaler = 256 ir CTC režimu TCNT1 = 0; // inicijuoti skaitiklį OCR1A = 62500; // inicijuoti palyginimo vertę TIMSK1 | = (1 << OCIE1A); // įgalinti palyginimo pertraukimą}
Problemos aprašymo metodika: blykstė trečias šviesos diodas (raudonas) kas 16 ms
- naudojant „Timer2“preskalerį, siekiant sumažinti aukšto dažnio elektrinį signalą iki žemesnio dažnio dalijant sveikus skaičius;
- naudojant „Clear Timer on Compare“(CTC) režimą;
- naudojant aparatūros CTC režimą be pertraukų;
void timer2_init () // inicijuoti laikmatį2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // nustatyti laikmačio OC2A kaištį perjungimo režimu ir CTC režimu TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // nustatyti laikmatį su prescaler = 1024 TCNT2 = 0; // inicijuoti skaitiklį OCR2A = 250; // inicijuoti palyginimo vertę}
TIMER0 perpildymo pertraukimo paslaugų teikimo tvarka iškviečiama kaskart, kai TCNT0 perpildo:
ISR (TIMER0_OVF_vect)
{tot_overflow ++; // sekti perpildymų skaičių}
Šis ISR suaktyvinamas kiekvieną kartą, kai įvyksta rungtynės, todėl perjungimo piktograma patenka čia:
ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // čia perjungti
int main (niekinis)
{DDRB | = (1 << 0); // prijungti 1 (žalia) vedė prie kaiščio PB0 DDRC | = (1 << 1); // prijungti 2 (mėlyna) vedė prie kaiščio PC1 DDRB | = (1 << 3); // prijungti 3 (raudona) vedė prie kaiščio PB3 (OC2A) timer0_init (); // inicijuoti laikmatį0 timer1_init (); // inicijuoti laikmatį1 timer2_init (); // inicijuoti laikmatį2 while (1) // ciklą visam laikui {
Jei laikmatis0 perskrido 12 kartų, būtų praėję 12 * 4,096 ms = 49,152 ms. 13 -oje iteracijoje mums reikia 50 ms delsos - 49,152 ms = 0,848 ms. Taigi, 13 -oje iteracijoje leidžiame tik laikmačiui suskaičiuoti iki 53, o tada jį iš naujo nustatyti.
if (tot_overflow> = 12) // patikrinkite, ar ne. iš perpildymų = 12 PASTABA: naudojama „> =“
{if (TCNT0> = 53) // patikrinkite, ar laikmačių skaičius pasiekia 53 {PORTB ^= (1 << 0); // perjungia vedamą TCNT0 = 0; // atstatyti skaitiklį tot_overflow = 0; // iš naujo nustatyti perpildymo skaitiklį}}}}
HEX failo įkėlimas į mikrovaldiklio „flash“atmintį:
įveskite komandą DOS eilutės lange:
avrdude –c [programuotojo vardas] –p m328p –u –U „flash“: w: [jūsų šešiakampio failo pavadinimas] Mano atveju tai yra: avrdude –c ISPProgv1 –p m328p –u –U „flash“: w: Timers.hex
Ši komanda įrašo hex failą į mikrovaldiklio atmintį. Žiūrėkite vaizdo įrašą su išsamiu mikrovaldiklio „flash“atminties įrašymo aprašymu:
Įrašoma mikrovaldiklio „flash“atmintis…
Gerai! Dabar mikrovaldiklis veikia pagal mūsų programos instrukcijas. Patikrinkime!
6 žingsnis: sukurkite elektros grandinę
Prijunkite komponentus pagal schemą.
Rekomenduojamas:
Mirksi šviesos diodai!: 4 žingsniai
Mirksi šviesos diodai!: ATSARGIAI! Šviesos diodų mirksėjimas su muzika gali jus priversti beprotiškai! Ši pamoka yra apie tam tikrų šviesos diodų mirksėjimą pagal bet kokios muzikos ritmą! Šio proceso idėja yra tikrai paprasta ir grandinė yra tikrai maža. Pagrindinė koncepcija yra tokia: 1-maža
AVR mikrovaldiklis. Perjunkite šviesos diodus naudodami mygtuko jungiklį. Paspaudimo mygtuko išjungimas .: 4 žingsniai
AVR mikrovaldiklis. Perjunkite šviesos diodus naudodami mygtuko jungiklį. Mygtuko išjungimas. Šiame skyriuje mes išmoksime, kaip padaryti ATMega328PU programos C kodą, kad būtų galima perjungti trijų šviesos diodų būseną pagal mygtuko jungiklio įvestį. Be to, mes ištyrėme problemos „Switch Bounce“sprendimo būdus. Kaip paprastai, mes
AVR mikrovaldiklis. Impulsų pločio moduliavimas. Nuolatinės srovės variklio ir LED šviesos intensyvumo valdiklis: 6 žingsniai
AVR mikrovaldiklis. Impulsų pločio moduliavimas. Nuolatinės srovės variklio ir šviesos diodų šviesos intensyvumo valdiklis .: Sveiki visi! Impulso pločio moduliacija (PWM) yra labai paplitusi telekomunikacijų ir galios valdymo technika. jis dažniausiai naudojamas valdyti elektros prietaisui tiekiamą galią, nesvarbu, ar tai būtų variklis, šviesos diodas, garsiakalbiai ir tt. Iš esmės tai yra modulis
Mirksi šviesos diodai: 5 žingsniai (su nuotraukomis)
Mirksintys šviesos diodai: Klausydamasis muzikos savo kompiuteryje (išdidžiai naudodamasis WINAMP), man buvo įdomu, kaip kai kurie šviesos diodai mirksės nuo garso, sklindančio iš P2 jungties, todėl nusprendžiau padaryti paprastą grandinę. Tai veikė gana gerai, todėl nusprendžiau
Šviesos aktyvuoti mirksi šviesos diodai: 4 žingsniai
Šviesos aktyvuoti mirksintys šviesos diodai: šioje instrukcijoje aš jums parodysiu, kaip sudėti mirksinčią LED grandinę, kuri įsijungia, kai mojuojate ranka, mirksi sekundę ar dvi, o tada užgęsta. Blykstančios grandinės schemą gavau iš steven123654 instrukcijos