Oggi vedremo come impostare i timer interni di Arduino, la suddivisione del clock ed il controllo dei vari contatori per la generazione dei segnali, un argomento un pò lungo e complesso che spero di affrontare in modo chiaro, vi anticipo che per questa lezione userò come base di esempio Arduino UNO.
Arduino UNO ha un generatore di clock che sviluppa un segnale a 16Mhz, che permette il funzionamento di 3 timer chiamati t0, t1, t2 che vengono usati dalla scheda per le esecuzione delle funzioni:
- Timer t0: funziona ad 8bit (0-255), viene usato per funzioni come delay, milli, micro ecc.
Visto il suo utilizzo vi consiglio di non toccarlo onde evitare che queste funzioni abbiano problemi. - Timer t1: è di tipo 16bit (0-65535) ed è usato per i servo motori.
- Timer t2: anche esso a 16 bit viene usato per tone.
Sostanzialmente il timer è un contatore che può essere impostato in modo che al raggiungimento o al superamento di un valore, venga generato un interruppe che richiama una funzione personalizzata.
Arduino lavora su una frequenza di 16Mhz, quindi riesce ad elaborare 16 istruzioni al secondo, lo stesso oscillatore è disponibile per i timer, per avere un uso del timer più comodo questi 16Mhz vengono divisi da un dispositivo chiamato prescaler.

Il prescaler può dividere i 16Mhz solo con divisori ben precisi che sono 1024, 256, 64, 8, 1; quindi se impostiamo il prescaler con uno di questi valori troveremo quante volte al secondo verrà incrementato il contatore.
Facciamo un esempio: supponiamo di voler impostare il prescaler a 256, avremo:
- 16Mhz/256 = 16.000.000/256 = 62.500
Quindi il timer verrà incrementato di 62.500 volte al secondo, se impostiamo il prescaler con valore 1 avremo un incremento di 16milioni di volte al secondo che è il valore massimo ottenibile, una volta arrivato al fine conteggio del timer (ad esempio per il t1 a 16bit sarà 65535), questo sviluppa un segnale che possiamo intercettare.

In Arduino abbiamo la possibilità di impostare il valore di partenza del registro, così da ottenere un tempo minore per arrivare a fine conteggio e di conseguenza una frequenza più veloce in uscita.
I registri il controllo del prescaler e del suo comportamento sono TCCRxA per la gestione della modalità di comparazione ed i PWM (COMx/COMx0 per output sui pin, WGMx1/WGMx0 per il waveform), TCCRxB invece controlla clock e prescaler (CSx2/CSx1/CSx0 per la velocità, WGMx2/WGMx3 per il waveform), dove x è il numero del timer che vogliamo gestire (0, 1, 2).
Mentre per poter precaricare dei valori all’interno del timer useremo i registri TCNTx dove x indica il timer che volgiamo gestire (0, 1, 2).
Riprendendo l’esempio precedente, per far scattare il timer ogni secondo con un prescaler impostato a 256, basi impostare TCNT1= 65.535-62.500 = 3.035
Così il timer eseguirà solo 62.500 cicli.
Allo scadere del timer, occorre richiamare una funzione tramite la Interrupt Service Routine (ISR), tramite un comando tipo:
|
1 2 3 |
ISR(TIMERx_OVF_vect){ // codice da eseguire } |
Questa parte di codice viene chiamato al verificarsi di un overflow del timer, ovvero quando il contatore supera il valore impostato.
I contatori possono essere usati per la generazione di segnali di modulazione di frequenza (PWM), questa però è una modalità avanzata, che magari vedremo successivamente.
Per finire questa lezione, vorrei parlare brevemente del WDT o Watchdog timer di Arduino (trovate maggiori dettagli, salvo aggiornamenti del datasheet, al capitolo 11.8).
Il WDT ha un oscillatore separato ed un scopo ben preciso, il suo uso standard quello di provocare un riavvio completo del Microcontrollore quando il WDT non viene fatto ripartire tramite un “Reset”.
Tale funzione è un meccanismo di sicurezza ed il funzionamento è semplice, si imposta un valore limite oltre il quale se il sistema non reagisce secondo uno schema prestabilito resecando il WDT, il sistema viene riavviato.
Il WDT ha solo 10 valori possibili, che vanno da 16ms a 8 secondi, può essere usato anche per forzare il “risveglio” del sistema quando questo va in risparmio energetico.
In questa pagina di Adafruit potete trovare risorse extra sull’argomento ed una libreria chiamata “TimerOne“, che permette una programmazione più semplice dei timer.
Qui potete trovare due tutorial che spiegano meglio come settare i timer:
Allegati
In questa pagina sono presenti link di affiliazione che garantiscono a questo sito una piccola quota di ricavi, senza variazione del prezzo per l'acquirente.