Arduino Timer: igrajte se s vremenom u svojim projektima

Odbrojavanje Arduino UNO

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?

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.

Como Arduino UNO Ima MCU čip koji radi na 16 Mhz, 16.000.000 može se izvršiti svake sekunde. Instrukcije trebaju X ciklusa za izvršenje, ne izvode se sve u istim taktnim ciklusima, na primjer, 16-bitne trebaju više ciklusa u ovoj AVR arhitekturi.

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

Arduino UNO milis funkcije

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?

mjerači vremena, mjerači vremena

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:

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

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

Arduino IDE, tipovi podataka, programiranje

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
}

Više o Arduino programiranju

kupi tanjur Arduino UNO Otkrivenje 3

Budite prvi koji će komentirati

Ostavite svoj komentar

Vaša email adresa neće biti objavljen. Obavezna polja su označena s *

*

*

  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 obvezi.
  5. Pohrana podataka: Baza podataka koju hostira Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.