Arduino tajmer: igrajte se s vremenom u svojim projektima

Timer Arduino UNO

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?

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.

como Arduino UNO Ima MCU čip koji radi na 16 Mhz, 16.000.000 može biti izvršeno svake sekunde. Instrukcije trebaju X ciklusa da se izvrše, ne izvode se sve u istim ciklusima takta, na primjer, 16-bitnim je potrebno više ciklusa u ovoj AVR arhitekturi.

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

Arduino UNO milis funkcije

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?

tajmeri, tajmeri

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:

+1 je zato što je registar brojača indeksiran na 0, tj. ne počinje brojati na 1, već na 0.

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

Arduino IDE, tipovi podataka, programiranje

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
}

Više o Arduino programiranju

kupi tanjir Arduino UNO Rev3

Budite prvi koji komentarišete

Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.