Sadržaj:
- Korak 1: Opis
- Korak 2: Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms
- Korak 3: Izjava o problemu 2: Trepćimo drugu LED (plavu) svakih 1 s
- Korak 4: Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
- Korak 5: Pisanje koda za program na C. Učitavanje HEX datoteke u fleš memoriju mikrokontrolera
- Korak 6: Izrada električnog kruga
Video: AVR mikrokontroler. LED treperi pomoću tajmera. Tajmeri prekida. Tajmer CTC način rada: 6 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:07
Zdravo svima!
Tajmeri su važan koncept u oblasti elektronike. Svaka elektronička komponenta radi na vremenskoj osnovi. Ova vremenska baza pomaže da se sav rad uskladi. Svi mikrokontroleri rade na unaprijed definiranoj frekvenciji takta, svi imaju mogućnost postavljanja tajmera. AVR se može pohvaliti timerom koji je vrlo precizan, precizan i pouzdan. Nudi gomilu funkcija, pa ga čini velikom temom. Najbolji dio je tajmer koji je potpuno neovisan o CPU -u. Dakle, radi paralelno sa CPU -om i nema intervencije CPU -a, što tajmer čini prilično preciznim. U ovom odjeljku objašnjavam osnovne koncepte AVR mjerača vremena. Pišem jednostavan program u C kodu za upravljanje LED bljeskalicom, pomoću tajmera.
Korak 1: Opis
U ATMega328 postoje tri vrste mjerača vremena:
Timer/Counter0 (TC0) - je 8 -bitni Timer/Counter modul opće namjene, s dvije nezavisne jedinice OutputCompare i PWM podrškom;
Tajmer/brojač1 (TC1) - 16 -bitna mjerač vremena/brojač omogućava precizno mjerenje vremena izvođenja programa (upravljanje događajima), generiranje valova i mjerenje vremena signala;
Tajmer/brojač2 (TC2) -opća je namjena, kanal, 8 -bitni mjerač vremena/brojač sa PWM -om i asinhronom operacijom;
Korak 2: Izjava o problemu 1: Neka LED treperi prva (zelena) svakih 50 ms
Metodologija:
- korištenje predskalera Timer0 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;
- korištenje prekida svaki put kad se Timer0 prelije;
Tajmer 0 (8 bita) broji od 0 do 255 nakon toga, prelijevaju se, ova vrijednost se mijenja pri svakom taktu.
F_CPU = 16MHz: Vremenski period = 1000ms / 16000000Hz = 0.0000625ms
Brojač tajmera = (potrebno kašnjenje / vremenski period takta) -1 = (50ms / 0.0000625ms) = 799999
Sat je već otkucao 799999 puta i dao kašnjenje od samo 50 ms!
Za smanjenje broja tajmera možemo koristiti tehniku podjele frekvencije koja se naziva preskaliranje. AVR nam nudi sljedeće vrijednosti predskalera na izbor: 8, 64, 256 i 1024. Pogledajte tabelu sažeto prikazane rezultate korištenja različitih predkalera.
Vrijednost brojača uvijek treba biti cijeli broj. Odaberemo predšteč 256!
U većini mikrokontrolera postoji nešto što se zove Prekid. Ovaj prekid se može aktivirati kad god su ispunjeni određeni uvjeti. Sada, kad god se aktivira prekid, AVR zaustavlja i sprema izvršavanje glavne rutine, pristupa pozivu prekida (izvršavanjem posebne rutine, koja se naziva rutina usluge prekida, ISR) i nakon što se s njom završi, vraća se na main rutinu i nastavlja je izvršavati.
Budući da je potrebno kašnjenje (50ms) veće od maksimalnog mogućeg kašnjenja: 4, 096ms = 1000ms / 62500Hz * 256, očito će se tajmer preklopiti. I kad god se tajmer prelije, dolazi do prekida.
Koliko puta treba prekinuti prekid?
50ms / 4.096ms = 3125 /256 = 12.207 Ako je mjerač vremena preletio 12 puta, prošlo bi 12 * 4.096ms = 49.152ms. U 13. iteraciji potrebno nam je kašnjenje od 50 ms - 49,152 ms = 0,848 ms.
Na frekvenciji od 62500Hz (predskaler = 256), svaki tik traje 0,016 ms. Dakle, za postizanje kašnjenja od 0,848ms, bilo bi potrebno 0,848ms / 0,016ms = 53 takta. Dakle, u 13. iteraciji dopuštamo tajmeru da broji samo do 53, a zatim ga resetiramo.
Pokreni Timer0/Brojač (vidi sliku):
TCCR0B | = (1 << CS02) // podesite mjerač vremena s predkalerom = 256 TCNT0 = 0 // inicijalizira brojač TIMSK0 | = (1 << TOIE0) // omogući prekid prelijevanja sei () // omogući globalne prekide tot_overflow = 0 // inicijaliziranje varijable brojača preljeva
Korak 3: Izjava o problemu 2: Trepćimo drugu LED (plavu) svakih 1 s
Metodologija:
- korištenjem mjerača vremena Timer1 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;
- korišćenjem režima Clear Timer on Compare (CTC);
- korišćenje prekida sa CTC režimom;
Tajmer1 (16 bita) broji od 0 do 65534 nakon toga, prelijevaju se. Ova vrijednost se mijenja pri svakom impulsu takta.
F_CPU = 16MHz: Period takta = 1000ms / 16000000Hz = 0,0000625msTrimer = (potrebno kašnjenje / vremenski period takta) -1 = (1000ms / 0,0000625ms) = 15999999
Sat je već otkucao 15999999 puta i dao kašnjenje od 1 s!
Za smanjenje broja tajmera možemo koristiti tehniku podjele frekvencije koja se naziva preskaliranje. AVR nam nudi sljedeće vrijednosti predskalera na izbor: 8, 64, 256 i 1024. Pogledajte tabelu sažeto prikazane rezultate korištenja različitih predkalera. Vrijednost brojača uvijek treba biti cijeli broj. Odaberemo predšteč 256!
U načinu Clear timer on Compare (CTC), registar OCR1A ili ICR1 se koristi za manipulaciju rezolucijom brojača. U CTC načinu rada brojač se briše na nulu kada vrijednost brojača (TCNT1) odgovara OCR1A ili ICR1. OCR1A ili ICR1 definiraju najveću vrijednost brojača, pa stoga i njegovu razlučivost. Ovaj način rada omogućuje veću kontrolu izlazne frekvencije usporedbe. Također pojednostavljuje rad brojanja vanjskih događaja. Moramo reći AVR -u da resetira Timer1/Brojač čim njegova vrijednost dosegne vrijednost 62500, kako bi se postiglo kašnjenje od 1s.
Pokretanje tajmera 1/brojača (vidi sliku):
TCCR1B | = (1 << WGM12) | (1 << CS12) // podesite tajmer sa predkalerom = 256 i CTC načinom rada TCNT1 = 0 // inicijalizira brojač TIMSK1 | = (1 << OCIE1A) // omogućite usporedbu prekida OCR1A = 62500 // inicijalizira vrijednost usporedbe
Korak 4: Izjava o problemu 3: Trepćimo treći LED (crveni) svakih 16 ms
Metodologija:
- pomoću predskalera Timer2 za smanjenje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;
- korišćenjem režima Clear Timer on Compare (CTC);
- korištenje hardverskog CTC načina rada bez prekida;
Tajmer2 (8 bita) broji od 0 do 255 nakon toga, prelijevaju se. Ova vrijednost se mijenja pri svakom taktu.
F_CPU = 16MHz: Vremenski period = 1000ms / 16000000Hz = 0.0000625ms
Brojač tajmera = (potrebno kašnjenje / vremenski period sata) -1 = (16 ms / 0,0000625 ms) = 255999
Sat je već otkucao 255999 puta i dao kašnjenje od 16 ms!
Pogledajte tabelu sažeto prikazane rezultate korištenja različitih predskalera. Vrijednost brojača uvijek treba biti cijeli broj. Odaberimo predčistač 1024!
U CTC načinu rada brojač se briše na nulu kada vrijednost brojača (TCNT2) odgovara OCR2A ili ICR2. Pin PB3 je takođe pin za poređenje izlaza TIMER2 - OC2A (pogledajte dijagram).
Tajmer/brojač2 Kontrolni registar A - TCCR2A Bit 7: 6 - COM2A1: 0 - Uporedite izlazni način rada za jedinicu za usporedbu A. Budući da moramo uključiti LED, biramo opciju: Uključivanje OC2A na uporedivo podudaranje Kad god dođe do podudaranja, OC2A pin se automatski prebacuje. Nema potrebe provjeravati bilo koji bit zastavice, nema potrebe paziti na prekide.
Pokreni Timer2/Brojač
TCCR2A | = (1 << COM2A0) | (1 << WGM21) // postavljanje OC2A pina tajmera u preklopnom načinu i CTC načinu rada TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // podesite mjerač vremena s predikalerom = 1024 TCNT2 = 0 // inicijalizira brojač OCR2A = 250 // inicijalizira vrijednost usporedbe
Korak 5: Pisanje koda za program na C. Učitavanje HEX datoteke u fleš memoriju mikrokontrolera
Pisanje i izrada aplikacije AVR mikrokontrolera u C kodu pomoću Integrirane razvojne platforme - Atmel Studio.
F_CPU definira frekvenciju takta u Hercima i uobičajeno je u programima koji koriste biblioteku avr-libc. U ovom slučaju rutine kašnjenja se koriste za određivanje načina izračunavanja vremenskih kašnjenja.
#ifndef F_CPU
#define F_CPU 16000000UL // kristalna frekvencija regulatora kazivanja (16 MHz AVR ATMega328P) #endif
#include // zaglavlje za omogućavanje kontrole protoka podataka preko pinova. Definira pinove, priključke itd.
Prva datoteka uključivanja dio je avr-libc i koristit će se u gotovo svim AVR projektima na kojima radite. io.h će odrediti CPU koji koristite (zato određujete dio prilikom kompajliranja) i zauzvrat će uključiti odgovarajuće zaglavlje IO definicije za čip koji koristimo. Jednostavno definira konstante za sve vaše pinove, portove, posebne registre itd.
#include // zaglavlje za omogućavanje prekida
volatile uint8_t tot_overflow; // globalna varijabla za brojanje broja prelijevanja
Metodologija izjave o problemu: Prvo bljeska (zelena) LED svakih 50 ms
- korištenje predskalera Timer0 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;
- korištenje prekida svaki put kad se Timer0 prelije;
void timer0_init () // inicijalizira timer0, prekid i varijablu
{TCCR0B | = (1 << CS02); // postavljanje mjerača vremena s predkalerom = 256 TCNT0 = 0; // inicijaliziranje brojača TIMSK0 | = (1 << TOIE0); // omogući prelivanje nterrupt sei (); // omogući globalne prekide tot_overflow = 0; // inicijalizira varijablu brojača prelijevanja}
Metodologija izjave o problemu: Druga LED bljeska (plava) svakih 1 s
- korištenjem mjerača vremena Timer1 za smanjivanje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;
- korišćenjem režima Clear Timer on Compare (CTC);
- korišćenje prekida sa CTC režimom;
void timer1_init () // inicijalizira timer1, prekid i varijablu {TCCR1B | = (1 << WGM12) | (1 << CS12); // postavljanje tajmera sa predkalerom = 256 i CTC načinom rada TCNT1 = 0; // inicijaliziranje brojača OCR1A = 62500; // inicijalizira vrijednost uspoređivanja TIMSK1 | = (1 << OCIE1A); // omogući usporedi prekid}
Metodologija izjave o problemu: Treća LED lampica treperi (crveno) svakih 16 ms
- korištenjem mjerača vremena Timer2 za smanjenje visokofrekventnog električnog signala na nižu frekvenciju cjelobrojnom podjelom;
- korišćenjem režima Clear Timer on Compare (CTC);
- korištenje hardverskog CTC načina rada bez prekida;
void timer2_init () // inicijalizira timer2 {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // postavljanje OC2A pina tajmera u preklopnom modu i CTC načinu TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // postavljanje mjerača vremena s predkalerom = 1024 TCNT2 = 0; // inicijaliziranje brojača OCR2A = 250; // inicijalizira vrijednost usporedbe}
TIMER0 servisna rutina prekida prelijevanja poziva koja se poziva svaki put kada se TCNT0 prelije:
ISR (TIMER0_OVF_vect)
{tot_overflow ++; // prati broj prelivanja}
Ovaj ISR se aktivira kad god dođe do podudaranja, stoga ovdje uključite prekidač:
ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // prekidač je vodio ovdje}
int main (void)
{DDRB | = (1 << 0); // spojimo 1 (zeleno) na pin PB0 DDRC | = (1 << 1); // spojimo 2 (plavo) na pin PC1 DDRB | = (1 << 3); // spojimo 3 (crveno) led na pin PB3 (OC2A) timer0_init (); // inicijalizira timer0 timer1_init (); // inicijalizira timer1 timer2_init (); // inicijalizira timer2 while (1) // petlja zauvijek {
Da je Timer0 preletio 12 puta, prošlo bi 12 * 4.096ms = 49.152ms. U 13. iteraciji potrebno nam je kašnjenje od 50 ms - 49,152 ms = 0,848 ms. Dakle, u 13. iteraciji dopuštamo tajmeru da broji samo do 53, a zatim ga resetiramo.
if (tot_overflow> = 12) // provjerite da li nema. od prelivanja = 12 NAPOMENA: '> =' se koristi
{if (TCNT0> = 53) // provjerite da li tajmer dostiže 53 {PORTB ^= (1 << 0); // prebacuje LED TCNT0 = 0; // resetiranje brojača tot_overflow = 0; // poništavanje brojača prelijevanja}}}}
Otpremanje HEX datoteke u fleš memoriju mikrokontrolera:
otkucajte u prozoru DOS upita naredbu:
avrdude –c [ime programera] –p m328p –u –U blic: w: [naziv vaše heksadecimalne datoteke] U mom slučaju to je: avrdude –c ISPProgv1 –p m328p –u –U blic: w: Timers.hex
Ova naredba zapisuje heksadecimalnu datoteku u memoriju mikrokontrolera. Pogledajte video s detaljnim opisom snimanja flash memorije mikrokontrolera:
Snimanje fleš memorije mikrokontrolera …
Uredu! Sada mikrokontroler radi u skladu s uputama našeg programa. Hajde da provjerimo!
Korak 6: Izrada električnog kruga
Spojite komponente u skladu sa shematskim dijagramom.
Preporučuje se:
Upravljajte servo uređajem pomoću 555 tajmera IC: 3 koraka
Kontrola servo upravljača pomoću 555 tajmera: Moja prva instrukcija je bila " Upravljanje servo -ima pomoću analognog džojstika ". Od tada sam podijelio nekoliko projekata kojima su bili potrebni servo upravljači, na primjer: Robotska traka za ruke i lice. Uvijek smo koristili mikrokontroler za upravljanje servo pogonima. Ali da
Izuzetno jednostavan način za početak rada s kućnom automatizacijom pomoću DIY modula: 6 koraka
Izuzetno jednostavan način za početak rada s kućnom automatizacijom pomoću DIY modula: Bio sam ugodno iznenađen kada sam odlučio pokušati dodati neke DIY senzore kućnom pomoćniku. Korištenje ESPHomea izuzetno je jednostavno i u ovom ćemo članku naučiti kako kontrolirati GPIO pin i također postići temperaturu & podaci o vlažnosti sa bežičnog n
Oba načina rada ESP8266 (pristupni i klijentski način rada): 3 koraka
Oba načina ESP8266 (pristupni i klijentski način rada): U prethodnom članku napravio sam vodič o tome kako postaviti način rada na ESP8266, koji je kao pristupna točka ili WiFi stanica i kao wifi klijent. U ovom članku ću vam pokazati kako da postavite način rada ESP8266 na oba načina. Odnosno, u ovom načinu rada ESP8266 može
LED blinker i PWM oscilator pomoću 555 tajmera: 3 koraka
LED blinker i PWM oscilator pomoću 555 mjerača vremena: Svi su bili početnici u elektronici i za početnike ponekad može biti teško izgraditi neka funkcionalna kola. Zato sam odlučio objaviti ovakvu vrstu projekta. Ovo kolo je pojednostavljena verzija jednostavnog kola čije sheme o
NE555 Tajmer - Konfiguriranje tajmera NE555 u stabilnoj konfiguraciji: 7 koraka
NE555 Tajmer | Konfiguriranje tajmera NE555 u stabilnoj konfiguraciji: mjerač vremena NE555 jedan je od najčešće korištenih IC -ova u svijetu elektronike. U obliku je DIP 8, što znači da ima 8 pinova