Arduino Timer: jucați-vă cu sincronizarea în proiectele dvs

Timer Arduino UNO

Cu ceva timp în urmă am publicat mai multe informații despre funcția millis(). de ArduinoAcum vom aprofunda mai mult în Temporizator Arduino, pentru a începe cu această caracteristică pentru caracteristică, înțelegeți cum această placă cu MCU gestionează timpul, precum și alte funcții dincolo de millis().

Ce este temporizatorul Arduino?

temporizator arduino

El Temporizator Arduino sau temporizator, este o funcție implementată de hardware (în microcontroler, cu ajutorul cristalului de cuarț care generează impulsurile de ceas și care stabilește „ritmul”, fără a fi nevoie de hardware extern sau IC-uri 555) care permite controlul evenimentelor temporare grație ceasurilor. intern. De exemplu, realizarea unei sarcini la intervale, efectuarea de măsurători precise de timp etc., independent de codul schiței.

Como Arduino UNO Are un cip MCU care funcționează la 16 Mhz, 16.000.000 ar putea fi executat în fiecare secundă. Instrucțiunile au nevoie de X cicluri pentru a fi executate, nu toate se execută în aceleași cicluri de ceas, de exemplu, cele pe 16 biți au nevoie de mai multe cicluri în această arhitectură AVR.

Imaginează-ți că folosești funcția delay()., aceasta va bloca execuția pe MCU Arduino până la trecerea timpului specificat și apoi va continua cu programul, dar temporizatorul nu se va bloca. Va fi sincronizat pe măsură ce MCU continuă să execute alte instrucțiuni simultan. Acesta este marele avantaj.

Cronometrul este legat de întreruperi de Arduino, deoarece acestea vor fi executate prin intermediul lor pentru a participa la o anumită sarcină. Cu alte cuvinte, Arduino Timer este o funcție care este declanșată la un anumit moment, executând o funcție de întrerupere. De aceea este important să știți și despre aceste întreruperi.

moduri

Timerul Arduino are 2 moduri de operare, putându-l folosi în:

  • semnal PWM: Puteți controla Pini Arduino (~).
  • CTC (Clear timer on compar match): numără timpul din interiorul unui contor și când atinge valoarea specificată într-un registru al temporizatoarelor, întreruperea este executată.

Cate cronometre are? Tipuri de cronometre

Arduino UNO funcții de milis

Acolo 3 cronometre pe farfurii Arduino UNO, deși pot fi mai multe pe alte plăci de sus:

  • Temporizator 0: 8 biți, poate număra de la 0 la 255 (256 de valori posibile). Folosit de funcții precum delay(), millis() și micros(). Nu se recomandă modificarea acestuia pentru a nu altera programele.
  • Temporizator 1: egal cu Timer 0. Folosit de biblioteca Servo din UNO (Timer 5 pentru MEGA).
  • Temporizator 2: 16 biți și poate varia de la 0 la 65.525 (65.536 de valori posibile). Folosită pentru funcția tone(), dacă nu este folosită, poate fi folosită liber pentru aplicația dvs.
  • Timer 3, 4, 5 (numai pe Arduino MEGA): toate pe 16 biți.

Cum funcționează temporizatorul Arduino?

cronometre, cronometre

De lucrează cu un temporizator Arduino, este vital să știm cum funcționează toate acestea electronic în MCU-ul acestei plăci de dezvoltare:

  • Frecvența ceasului: este numarul de cicluri pe secunda pe care este capabil sa le dezvolte, in cazul Arduino este de 16 Mhz, sau ce este la fel, semnalul de ceas oscileaza de 16.000.000 de ori intr-o secunda (cicluri).
  • periodo: este reprezentat de T și se măsoară în secunde și este inversul ciclurilor. De exemplu, T=1/C, care ar avea ca rezultat 1/16000000 = 0.0000000625, timpul necesar pentru finalizarea fiecărui ciclu. Și frecvența este inversul perioadei, deci f = 1/T.
  • ciclu: este fiecare dintre repetițiile semnalului care apar pe unitatea de timp. Pe Arduino ar fi 16M într-o secundă. Sau ce este la fel, în acest caz, când au trecut 16 milioane de cicluri, a trecut o secundă. Prin urmare, se poate spune că un ciclu durează 625 ns.
  • marginea unui semnal: Semnalele ceasului sunt pătrate, iar marginile pot fi în creștere sau în scădere. O muchie este linia dreaptă a semnalului atunci când acesta se schimbă de la:
    • 0 (scăzut) la 1 (mare): margine ascendentă.
    • 1 (înalt) la 0 (scăzut): margine de cădere.

Marginile sunt importante deoarece temporizatoarele Arduino măsoară ciclurile de la marginile semnalului. A) Da contadorul se incrementeaza cu fiecare ciclu si cand atinge valoarea registrului se executa intreruperea.

Prin urmare, odată ce știi asta, dacă ai 16 Mhz pe MCU Arduino, și se folosește un Timer de 8 biți, se poate spune că întreruperile vor avea loc la fiecare 16 μs (256/16000000) sau 4 ms pentru 16 biți (65536/16000000). Deci, dacă setați registrul contor de 16 biți la maxim, cu valoarea 65535, atunci întreruperea va apărea la 4 ms pentru a executa orice sarcină este.

Când contorul atinge valoarea maximă posibilă, va reveni la 0 din nou. Adică are loc o depășire și se va număra înapoi de la început.

Pentru a controla rata de creștere a temporizatorului, puteți utiliza și un prescaler, care ia valorile 1, 8, 64, 256 și 1024 și modifică sincronizarea astfel:

Viteza temporizatorului (Hz) = Frecvența ceasului Arduino/Prescaler

Dacă este 1 prescaler, controlerul va crește la 16 Mhz, dacă este de 8 până la 2 Mhz, dacă este de 64 până la 250 kHz și așa mai departe. Amintiți-vă că va exista un comparator de stare a contorului cronometrului pentru a compara valoarea contorului și a prescalerului până când acestea sunt egale și apoi executați o acțiune. Asa de, frecventa de intrerupere este dat de formula:

+1 se datorează faptului că registrul contor este indexat la 0, adică nu începe să numere la 1, ci la 0.

Viteza de întrerupere (Hz) = Frecvența ceasului Arduino/Prescaler (valoarea registrului de comparație + 1)

Din fericire, nu trebuie modifica înregistrările a temporizatoarelor Arduino, deoarece va fi îngrijită de bibliotecile pe care le folosim în cod. Dar dacă nu sunt folosite, ar trebui să fie configurate.

Exemple în IDE-ul Arduino

Arduino IDE, tipuri de date, programare

Pentru a înțelege puțin mai bine toate acestea, aici vă arăt două coduri de schiță pentru Arduino IDE cu care puteți ajunge să experimentați utilizarea temporizatoarelor. Primul este codul care va clipi un LED conectat la pinul 8 Arduino în fiecare secundă:

#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
}

Programați clipirea sau clipirea LED-ului, ca în cazul precedent în fiecare secundă, dar de data aceasta folosind CTC, adică comparație:

#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
}

Mai multe despre programarea Arduino

cumpără o farfurie Arduino UNO Rev3

Fii primul care comenteaza

Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.