Prije nekog vremena objavili smo više informacija o funkcija millis(). de ArduinoSada ćemo ući dublje u Arduino tajmer, da biste započeli sa ovom funkcijom za ovu funkciju, shvatite kako ova ploča upravlja vremenom sa MCU-om, kao i drugim funkcijama izvan millisa().
Šta je Arduino tajmer?
El Arduino tajmer ili tajmer, je funkcija koju implementira hardver (u mikrokontroleru, uz pomoć kvarcnog kristala koji generiše impulse takta i koji postavlja "ritam", bez potrebe za eksternim hardverom ili IC-ovima 555) koja omogućava kontrolu privremenih događaja zahvaljujući satovima interni. Na primjer, stvaranje zadatka u intervalima, precizna mjerenja vremena, itd., neovisno o kodu skice.
Zamislite da koristite funkcija kašnjenja()., ovo će blokirati izvršenje na Arduino MCU dok ne istekne navedeno vrijeme, a zatim nastaviti s programom, ali tajmer se neće blokirati. To će biti tajming jer MCU nastavlja da izvršava druge instrukcije istovremeno. To je velika prednost.
Tajmer je povezan sa prekidi Arduina, budući da će se oni izvršavati preko njih kako bi prisustvovali nekom specifičnom zadatku. Drugim riječima, Arduino tajmer je funkcija koja se pokreće u određeno vrijeme, izvršavajući funkciju prekida. Zato je takođe važno znati o ovim prekidima.
Načini rada
Arduino tajmer ima 2 načina rada, moći ga koristiti u:
- PWM signal: Možete kontrolirati Arduino pinovi (~).
- CTC (Brisanje tajmera na uporednoj utakmici): broji vrijeme unutar brojača i kada dostigne vrijednost specificiranu u registru tajmera, prekid se izvršava.
Koliko tajmera ima? Vrste tajmera
Postoje 3 tajmera na tanjirima Arduino UNO, iako ih može biti više na drugim gornjim pločama:
- Tajmer 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 modifikacija kako se ne bi mijenjali programi.
- Tajmer 1: jednako tajmeru 0. Koristi ga Servo biblioteka u UNO (Timer 5 za MEGA).
- Tajmer 2: 16-bitni, i 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?
Da budem u stanju rad sa Arduino tajmerom, bitno je znati kako sve ovo funkcionira elektronski u MCU-u ove razvojne ploče:
- Frekvencija 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).
- Period: je predstavljen sa T, i mjeri se u sekundama, i inverzan 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 javlja u jedinici vremena. Na Arduinu bi to bilo 16M u sekundi. Ili šta je isto, u ovom slučaju, kada je prošlo 16 miliona ciklusa, prošla je jedna sekunda. Stoga se može reći da jedan ciklus traje 625 ns.
- ivica signala: Signali sata su kvadratni, a ivice mogu biti rastuće ili opadajuće. Ivica je prava linija signala kada se mijenja od:
- 0 (nisko) do 1 (visoko): rastuća ivica.
- 1 (visoko) do 0 (nisko): padajući rub.
Ivice su važne jer Arduino tajmeri mjere cikluse od ivica signala. A) Da the contador on se povećava sa svakim ciklusom i kada dostigne vrijednost registra, prekid se izvršava.
Stoga, kada to znate, ako jeste 16Mhz na Arduino MCU, a koristi se 8-bitni tajmer, može se reći da će se prekidi pojaviti svakih 16 μs (256/16000000) ili 4 ms za 16-bit (65536/16000000). Dakle, ako postavite 16-bitni registar brojača na maksimum, sa vrijednošću 65535, tada će se prekid pojaviti na 4 ms da bi se izvršio bilo koji zadatak.
Kada brojač dostigne maksimalnu moguću vrijednost, ponovo će se vratiti na 0. To jest, dolazi do prelivanja i odbrojavat će se od početka.
Za kontrolu brzine povećanja tajmera 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 preskaler, kontroler će se povećati na 16 Mhz, ako je 8 do 2 Mhz, ako je 64 do 250 kHz, itd. Zapamtite da će postojati komparator stanja brojača tajmera za upoređivanje vrijednosti brojača i predskalera dok se ne izjednače, a zatim izvrši akciju. dakle, frekvencija prekida je dato formulom:
Brzina prekida (Hz) = Arduino / Preskaler taktna frekvencija (vrijednost registra komparatora + 1)
Srećom, ne smijemo modificirati zapise Arduino tajmera, jer će se za to pobrinuti biblioteke 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 pomoću kojih možete iskusiti korištenje tajmera. Prvi je kod koji će svake sekunde treptati LED spojenim 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. poređenje:
#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 tanjir Arduino UNO Rev3