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?
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.
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
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?
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:
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
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