Prije nekog vremena objavili smo više informacija o funkcija millis(). de ArduinoSada ćemo ući dublje u Arduino mjerač vremena, da biste započeli s ovom značajkom za značajku, shvatite kako ova ploča upravlja vremenom s MCU-om, kao i drugim funkcijama izvan millisa().
Što je Arduino tajmer?
El Arduino tajmer ili mjerač vremena, je funkcija koju implementira hardver (u mikrokontroleru, uz pomoć kvarcnog kristala koji generira impulse takta i koji postavlja "ritam", bez potrebe za vanjskim hardverom ili IC-ovima 555) koja omogućuje kontrolu privremenih događaja zahvaljujući satovima unutarnje. Na primjer, stvaranje zadatka u intervalima, precizna mjerenja vremena, itd., neovisno o kodu skice.
Zamislite da koristite funkcija kašnjenja()., to će blokirati izvršenje na Arduino MCU-u dok ne istekne navedeno vrijeme i zatim nastaviti s programom, ali mjerač vremena neće blokirati. To će biti vrijeme dok MCU nastavlja izvršavati druge instrukcije istovremeno. To je velika prednost.
Tajmer je povezan s prekidi Arduina, budući da će se izvršavati kroz njih kako bi prisustvovali nekom specifičnom zadatku. Drugim riječima, Arduino Timer je funkcija koja se pokreće u određeno vrijeme, izvršavajući funkciju prekida. Zato je također važno znati o tim prekidima.
Načini rada
Arduino tajmer ima 2 načina rada, moći ga koristiti u:
- PWM signal: Možete kontrolirati Arduino igle (~).
- CTC (Brisanje mjerača vremena za usporednu utakmicu): broji vrijeme unutar brojača i kada dosegne vrijednost navedenu u registru mjerača vremena, prekid se izvršava.
Koliko tajmera ima? Vrste mjerača vremena
tamo 3 mjerača vremena na pločama Arduino UNO, iako ih može biti više na drugim gornjim pločama:
- Odbrojavanje 0: 8-bitni, može brojati od 0 do 255 (256 mogućih vrijednosti). Koriste ga funkcije poput delay(), millis() i micros(). Ne preporučuje se njegova izmjena kako se ne bi mijenjali programi.
- Odbrojavanje 1: jednako mjeraču vremena 0. Koristi ga Servo knjižnica u UNO-u (Timer 5 za MEGA).
- Odbrojavanje 2: 16-bitni, a može se kretati od 0 do 65.525 (65.536 mogućih vrijednosti). Koristi se za funkciju tone(), ako se ne koristi, može se slobodno koristiti za vašu aplikaciju.
- Tajmer 3, 4, 5 (samo na Arduino MEGA): svi 16-bitni.
Kako radi Arduino tajmer?
Na raditi s Arduino timerom, od vitalnog je značaja znati kako sve ovo funkcionira elektronički u MCU-u ove razvojne ploče:
- Učestalost takta: je broj ciklusa u sekundi koje je sposoban razviti, u slučaju Arduina je 16 Mhz, ili što je isto, signal takta oscilira 16.000.000 puta u sekundi (ciklusi).
- razdoblje: predstavlja T, mjeri se u sekundama i inverzno je ciklusima. Na primjer, T=1/C, što bi rezultiralo 1/16000000 = 0.0000000625, vrijeme koje bi bilo potrebno da se svaki ciklus završi. A frekvencija je inverzna od perioda, pa je f = 1/T.
- ciklus: je svako od ponavljanja signala koje se događa u jedinici vremena. Na Arduinu bi to bilo 16M u sekundi. Ili što je isto, u ovom slučaju, kada je prošlo 16 milijuna ciklusa, prošla je jedna sekunda. Stoga se može reći da jedan ciklus traje 625 ns.
- rub signala: Signali sata su kvadratni, a rubovi mogu biti rastući ili opadajući. Rub je ravna linija signala kada se mijenja iz:
- 0 (nisko) do 1 (visoko): rastući rub.
- 1 (visoko) do 0 (nisko): padajući rub.
Rubovi su važni jer Arduino timeri mjere cikluse od rubova signala. A) Da kontador povećava se sa svakim ciklusom i kada dosegne vrijednost registra, prekid se izvršava.
Stoga, jednom kada to znate, ako znate 16Mhz na Arduino MCU, a koristi se 8-bitni mjerač vremena, može se reći da će se prekidi dogoditi svakih 16 μs (256/16000000) ili 4 ms za 16-bitni (65536/16000000). Stoga, ako 16-bitni registar brojača postavite na maksimum, s vrijednošću 65535, tada će se prekid pojaviti na 4 ms za izvršenje bilo kojeg zadatka.
Kada brojač dosegne najveću moguću vrijednost, ponovno će se vratiti na 0. To jest, dolazi do prelijevanja i odbrojavat će se od početka.
Za kontrolu brzine povećanja timera također možete koristiti predskaler, koji uzima vrijednosti 1, 8, 64, 256 i 1024 i mijenja vrijeme na sljedeći način:
Brzina tajmera (Hz) = taktna frekvencija Arduino / predskalera
Ako je 1 predskaler, regulator će se povećati na 16 Mhz, ako je 8 do 2 Mhz, ako je 64 do 250 kHz, i tako dalje. Zapamtite da će postojati komparator stanja brojača vremena za usporedbu vrijednosti brojača i predskalera dok se ne izjednače, a zatim izvršite akciju. Tako, frekvencija prekida je dan formulom:
Brzina prekida (Hz) = frekvencija sata Arduino / predskalera (vrijednost registra komparatora + 1)
Srećom, ne smijemo mijenjati zapise Arduino tajmera, budući da će se za to pobrinuti knjižnice koje koristimo u kodu. Ali ako se ne koriste, treba ih konfigurirati.
Primjeri u Arduino IDE
Kako bismo sve ovo malo bolje razumjeli, ovdje pokazujem dva skica koda za Arduino IDE s kojima možete iskusiti korištenje mjerača vremena. Prvi je kod koji će svake sekunde treptati LED spojenom na Arduino pin 8:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configurar Timer1 TCCR1A = 0; //Registro control A a 0, pines OC1A y OC1B deshabilitados TCCR1B = 0; //Limpia el registrador TCCR1B |= (1<<CS10)|(1 << CS12); //Configura prescaler a 1024: CS12 = 1 y CS10 = 1 TCNT1 = 0xC2F8; //Iniciar timer para desbordamiento a 1 segundo //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal TIMSK1 |= (1 << TOIE1); //Habilitar interrupción para Timer1 } void loop() { } ISR(TIMER1_OVF_vect) //Interrupción del TIMER1 { TCNT1 = 0xC2F7; // Reniciar Timer1 digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }
Programirajte treptanje ili treptanje LED-a, kao u prethodnom slučaju svake sekunde, ali ovaj put koristeći CTC tj. usporedba:
#define ledPin 8 void setup() { pinMode(ledPin, OUTPUT); // Configuración Timer1 TCCR1A = 0; //Registro de control A a 0 TCCR1B = 0; //Limpiar registro TCNT1 = 0; //Inicializar el temporizador OCR1A = 0x3D08; //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08 TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12); //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1 TIMSK1 |= (1 << OCIE1A); //Habilita interrupción por igualdad de comparación } void loop() { } ISR(TIMER1_COMPA_vect) //Interrupción por igualdad de comparación en TIMER1 { digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED }kupi tanjur Arduino UNO Otkrivenje 3