- Cos'è il TIMER nell'elettronica incorporata?
- Registri timer Arduino
- Interruzioni del timer di Arduino
- Componenti richiesti
- Schema elettrico
- Programmazione dei timer di Arduino UNO
La piattaforma di sviluppo Arduino è stata originariamente sviluppata nel 2005 come dispositivo programmabile di facile utilizzo per progetti di design artistico. La sua intenzione era quella di aiutare i non ingegneri a lavorare con l'elettronica di base e i microcontrollori senza molte conoscenze di programmazione. Ma poi, a causa della sua natura facile da usare, è stato presto adattato dai principianti dell'elettronica e dagli hobbisti di tutto il mondo e oggi è persino preferito per lo sviluppo di prototipi e sviluppi POC.
Mentre va bene iniziare con Arduino, è importante passare lentamente ai microcontrollori principali come AVR, ARM, PIC, STM ecc. E programmarlo utilizzando le loro applicazioni native. Questo perché il linguaggio di programmazione Arduino è molto facile da capire poiché la maggior parte del lavoro viene svolto da funzioni predefinite come digitalWrite (), AnalogWrite (), Delay () ecc. Mentre il linguaggio macchina di basso livello è nascosto dietro di loro. I programmi Arduino non sono simili ad altri codici Embedded C in cui ci occupiamo di bit di registro e li rendiamo alti o bassi in base alla logica del nostro programma.
Timer Arduino senza ritardi:
Quindi, per capire cosa sta succedendo all'interno delle funzioni predefinite, dobbiamo scavare dietro questi termini. Ad esempio, quando viene utilizzata una funzione delay (), questa imposta effettivamente i bit del registro del timer e del contatore del microcontrollore ATmega.
In questo tutorial sul timer di arduino eviteremo l'uso di questa funzione delay () e invece ci occuperemo effettivamente dei registri stessi. La cosa buona è che puoi usare lo stesso IDE Arduino per questo. Imposteremo i nostri bit di registro del timer e utilizzeremo l'interrupt di overflow del timer per attivare un LED ogni volta che si verifica l'interrupt. Il valore del preloader del bit Timer può anche essere regolato utilizzando i pulsanti per controllare la durata in cui si verifica l'interrupt.
Cos'è il TIMER nell'elettronica incorporata?
Il timer è una specie di interruzione. È come un semplice orologio che può misurare l'intervallo di tempo di un evento. Ogni microcontrollore ha un orologio (oscillatore), diciamo in Arduino Uno è 16 Mhz. Questo è responsabile della velocità. Maggiore è la frequenza di clock, maggiore sarà la velocità di elaborazione. Un timer utilizza un contatore che conta a una certa velocità a seconda della frequenza di clock. In Arduino Uno ci vogliono 1/16000000 di secondo o 62 nanosecondi per fare un singolo conteggio. Significa che Arduino passa da un'istruzione all'altra ogni 62 nano secondi.
Timer in Arduino UNO:
In Arduino UNO ci sono tre timer utilizzati per diverse funzioni.
Timer0:
È un timer a 8 bit e viene utilizzato in funzioni timer come delay (), millis ().
Timer1:
È un timer a 16 bit e viene utilizzato nella libreria servo.
Timer2:
È un timer a 8 bit e viene utilizzato nella funzione tone ().
Registri timer Arduino
Per modificare la configurazione dei timer, vengono utilizzati i registri dei timer.
1. Registri di controllo timer / contatore (TCCRnA / B):
Questo registro contiene i bit di controllo principali del timer e viene utilizzato per controllare i prescaler del timer. Consente inoltre di controllare la modalità del timer utilizzando i bit WGM.
Formato frame:
TCCR1A | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | CIEM1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler:
I bit CS12, CS11, CS10 in TCCR1B impostano il valore del prescaler. Un prescaler viene utilizzato per impostare la velocità di clock del timer. Arduino Uno ha prescaler di 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | USO |
0 | 0 | 0 | No Clock Timer STOP |
0 | 0 | 1 | CLCK i / o / 1 No Prescaling |
0 | 1 | 0 | CLK i / o / 8 (da Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (da Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (da Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (da Prescaler) |
1 | 1 | 0 | Sorgente di clock esterna su pin T1. Orologio sul bordo di caduta |
1 | 1 | 1 | Sorgente di clock esterno sul pin T1. Orologio sul fronte di salita. |
2. Registro timer / contatore (TCNTn)
Questo registro viene utilizzato per controllare il valore del contatore e per impostare un valore di precaricamento.
Formula per il valore del preloader per il tempo richiesto in secondi:
TCNTn = 65535 - (16x10 10 xTime in sec / valore prescaler)
Per calcolare il valore del preloader per timer1 per un tempo di 2 sec:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Interruzioni del timer di Arduino
In precedenza abbiamo appreso degli interrupt Arduino e abbiamo visto che gli interrupt del timer sono una specie di interrupt software. Ci sono vari interrupt del timer in Arduino che sono spiegati di seguito.Interruzione di overflow del timer:
Ogni volta che il timer raggiunge il valore massimo, ad esempio (16 bit-65535), si verifica l' interruzione di overflow del timer . Quindi, una routine di servizio di interrupt ISR viene chiamata quando il bit di interrupt di overflow del timer è abilitato nel TOIEx presente nel registro della maschera di interrupt del timer TIMSKx.
Formato ISR:
ISR (TIMERx_OVF_vect) { }
Registro confronto output (OCRnA / B):
Qui, quando si verifica l'interrupt di corrispondenza confronto output, viene chiamato il servizio di interrupt ISR (TIMERx_COMPy_vect) e anche il bit flag OCFxy verrà impostato nel registro TIFRx. Questo ISR viene abilitato impostando il bit di abilitazione in OCIExy presente nel registro TIMSKx. Dove TIMSKx è Timer Interrupt Mask Register.
Acquisizione input timer:
Successivamente, quando si verifica il timer Input Capture Interrupt, viene chiamato il servizio di interrupt ISR (TIMERx_CAPT_vect) e anche il bit flag ICFx verrà impostato in TIFRx (Timer Interrupt Flag Register). Questo ISR viene abilitato impostando il bit di abilitazione in ICIEx presente nel registro TIMSKx.
Componenti richiesti
- Arduino UNO
- Pulsanti (2)
- LED (qualsiasi colore)
- Resistore 10k (2), 2,2k (1)
- Display LCD 16x2
Schema elettrico
Collegamenti del circuito tra Arduino UNO e display LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Al perno centrale del potenziometro per il controllo del contrasto del display LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UN |
+ 5V |
K |
GND |
Due pulsanti con resistenze pull down da 10K sono collegati ai pin 2 e 4 di Arduino e un LED è collegato al PIN 7 di Arduino tramite una resistenza da 2.2K.
La configurazione sarà simile all'immagine sottostante.
Programmazione dei timer di Arduino UNO
In questo tutorial useremo il TIMER OVERFLOW INTERRUPT e lo useremo per far lampeggiare il LED ON e OFF per una certa durata regolando il valore del preloader (TCNT1) usando i pulsanti. Alla fine viene fornito il codice completo per Arduino Timer. Qui stiamo spiegando il codice riga per riga:
Poiché nel progetto viene utilizzato un LCD 16x2 per visualizzare il valore del preloader, viene utilizzata la libreria a cristalli liquidi.
#includere
Il pin dell'anodo LED collegato al pin 7 di Arduino è definito ledPin .
#define ledPin 7
Successivamente viene dichiarato l'oggetto per l'accesso alla classe Liquid Crystal con i pin LCD (RS, E, D4, D5, D6, D7) che sono collegati ad Arduino UNO.
LiquidCrystal lcd (8,9,10,11,12,13);
Quindi impostare il valore del preloader 3035 per 4 secondi. Controllare la formula sopra per calcolare il valore del precaricatore.
valore float = 3035;
Successivamente, in void setup (), impostare prima l'LCD in modalità 16x2 e visualizzare un messaggio di benvenuto per alcuni secondi.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); ritardo (2000); lcd.clear ();
Quindi impostare il pin LED come pin OUTPUT ei pulsanti a pressione sono impostati come pin INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, INPUT);
Quindi disabilita tutti gli interrupt:
noInterrupts ();
Successivamente il Timer1 viene inizializzato.
TCCR1A = 0; TCCR1B = 0;
Il valore del timer del precaricatore è impostato (inizialmente come 3035).
TCNT1 = valore;
Quindi il valore Pre scaler 1024 viene impostato nel registro TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
L'interrupt di overflow del timer è abilitato nel registro della maschera di interruzione del timer in modo che sia possibile utilizzare l'ISR.
TIMSK1 - = (1 << TOIE1);
Finalmente tutti gli interrupt sono abilitati.
interrompe ();
Ora scrivi l'ISR per Timer Overflow Interrupt che è responsabile dell'accensione e dello spegnimento del LED utilizzando digitalWrite . Lo stato cambia ogni volta che si verifica l'interrupt di overflow del timer.
ISR (TIMER1_OVF_vect) { TCNT1 = valore; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Nel void loop () il valore del preloader viene incrementato o decrementato utilizzando gli ingressi dei pulsanti e anche il valore viene visualizzato sul display LCD 16x2.
if (digitalRead (2) == HIGH) { value = value + 10; // Valore precarico incemento } if (digitalRead (4) == HIGH) { value = value-10; // Decrementa il valore del precarico } lcd.setCursor (0,0); lcd.print (valore); }
Quindi è così che un timer può essere utilizzato per produrre un ritardo nel programma Arduino. Guarda il video qui sotto dove abbiamo dimostrato la modifica del ritardo aumentando e diminuendo il valore del preloader usando i pulsanti.