Timer - prescaler, compare, capture e watchdog
In questa pagina 7
Nei sistemi di controllo si devono misurare intervalli di tempo (cicli di attesa, comandi con cadenza prefissata, durata di segnali esterni). I µC, e alcuni DSP, offrono unità periferiche dedicate: i timer, di tipo general purpose (GPT) oppure specifici (PWM, watchdogtimer di guardia: reinizializza il sistema se non viene azzerato in tempo, real time clocktimer che genera interruzioni a cadenza prefissata, per tenere il tempo). Si potrebbe temporizzare con cicli di attesa nel programma (istruzioni inutili), ma è molto inefficiente: con un timercontatore binario che conta i periodi di un clock si genera una interruzione a intervalli prefissati e nel frattempo la CPU lavora (Sottosistema di I-O - polling, interruzioni e DMALe periferiche si collegano al bus con una interfaccia che ha registri di dati (DREG), controllo (CREG) e stato (SREG); nei µC e DSP sono mappati in memoria (si leggono e scrivono come locazioni). Poiché le periferiche sono asincrone e lente, la sincronizzazione avviene per polling (inefficiente), per interruzioni (la più usata) o per DMA (costoso, per grandi quantità di dati). Una interruzione: completa l'istruzione, salva il contesto (PC e registro di stato, spesso altro), esegue la ISR, ripristina. Le sorgenti si distinguono con ISR di stato, interruzioni vettorizzate o daisy-chaincollegamento delle periferiche in catena, in cui il segnale di riconoscimento passa dall'una all'altra; le NMI non sono mascherabili.Sottosistema di I-O - polling, interruzioni e DMA →).
Struttura di un timer
Un timer è un semplice contatore binario che conta i periodi del clock del processore o di un suo sottomultiplo. Ha:
- un prescaler (registro di divisione): imposta la frequenza di conteggio , sottomultiplo di ;
- un registro di configurazione (verso di conteggio, avvio e arresto, modo continuo o singolo, azioni all'evento);
- un registro di compare (o match), confrontato con il conteggio da un comparatore binario;
- talvolta un registro di pre-carica (valore iniziale del conteggio);
- uscite: richiesta di interruzione e/o azione diretta su un pin (set, reset, togglel'uscita cambia livello a ogni evento) senza intervento della CPU. Un timer a 16 bit conta da 0 a e poi va in overflow.
Convenzione per il prescaler. Nei testi d'esame il registro di prescale rappresenta il fattore di divisione (per esempio divide il clock per 4). Nelle librerie reali (HAL STM32) il registro contiene "fattore " e il registro di periodo "conteggi ": il testo dell'esercizio indica la convenzione; qui si usa il fattore e il numero di conteggi.
Intervallo massimo e risoluzione. Il rapporto tra il massimo intervallo misurabile e la risoluzione è sempre ( bit del contatore). Un prescalerdivisore di frequenza posto prima del contatore basso dà alta risoluzione ma intervalli corti; uno alto intervalli lunghi ma bassa risoluzione. Esempio: timer a 16 bit con prescaler a 16 bit e MHz: massimo intervallo s; massima risoluzione ns; massimo intervallo alla massima risoluzione ms.
Modi di funzionamento
- Single-shot (arresto dopo il match): ritardo di durata prefissata fra due azioni A e B del processore: dopo A si avvia il timer e solo alla interruzione di match si esegue B; nel frattempo la CPU fa altro.
- Free-run (ricarica automatica e ripartenza): ripete un'azione con frequenza di ripetizione prefissata e jitterpiccola variazione casuale nell'istante di un evento periodico minimo (interruzioni a cadenza fissa).
- Compare con uscita su pin: un impulso di durata variabile. Il registro di compareconfronto del conteggio con un registro: all'uguaglianza il timer genera un evento contiene la durata (in conteggi); all'avvio il pin viene asserito e si deassera al match; se si cambia il valore del registro a ogni ciclo si ottiene un impulso a durata variabile (è la base dei modulatori PWM (Modulazione PWM - duty-cycle, risoluzione e demodulazioneLa PWM trasferisce un segnale modulante $V^$ nella larghezza degli impulsi di un'onda quadra a frequenza fissa: con duty-cycle $d=t_1/T$ e livelli $\pm\frac E2$ la media è $V_{med}=(d-\frac12)E=E,\frac{V^}{V_p}$. L'informazione sta nel valor medio; il resto dello spettro (armoniche della portante) si elimina con un passa-basso (demodulazione). Il modulatore digitale è un timer: contatore + comparatore, $N=f_{clk}/f_{PWM}$ conteggi per periodo, risoluzione $n=\log_2N$ bit (massima frequenza per $n$ bit: $f_{clk}/2^n$), registro di compare = duty-cycle. Servono almeno 8 bit per evitare cicli limite.Modulazione PWM - duty-cycle, risoluzione e demodulazione →)).
- Capture: vedi sotto. Se la ISR del timer è disturbata da un'altra interruzione a priorità maggiore ne risulta un jitter sugli eventi; è trascurabile se piccolo (per esempio ); in caso contrario si possono mascherare le interruzioni di priorità maggiore, dare al timer la priorità massima oppure usare il compare con azione hardware sul pin (Sistemi di interruzioni - latenza, nesting e sostenibilitàCon $N$ sorgenti, ciascuna ISR $i$ ha durata $T_{d,i}$ (spesso già comprensiva della latenza intrinseca $T_{LI}$ e dell'istruzione in corso) e periodo minimo $T_{p,i}$. Condizione necessaria: $\sum_iT_{d,i}/T_{p,i}<1$ (la percentuale di impegno della CPU è la somma). Condizione di intervallo per ogni $i$ (priorità 1 = massima): $T_{d,i}+\sum_{k<i}n_k,T_{d,k};[+\max(T_{RC},\max_{j>i}T_{d,j})\text{ senza nesting}]\le T_{p,i}$, con $n_k=\lceil T_{p,i}/T_{p,k}\rceil$. Latenza massima della priorità $n$: con nesting $T_{LI}+\sum_{i<n}T_{ex,i}$; senza nesting si aggiunge $\max_{j>n}T_{ex,j}$.Sistemi di interruzioni - latenza, nesting e sostenibilità →).
Calcolo di prescaler e match
Per generare un evento ogni con clock e contatore a 16 bit: i conteggi totali sono . Si cerca con . Per la massima risoluzione si sceglie il minimo possibile: , poi arrotondato.
| Dati | min | match | |
|---|---|---|---|
| 10 MHz, 20 ms (prescaler a 8 bit) | 200 000 | ||
| 10 MHz, 12 ms | 120 000 | 2 | |
| 20 MHz, 15 ms | 300 000 | 5 | (risoluzione s) |
| 16 MHz, 100 Hz | 160 000 | 3 | |
| 16 MHz, 100 Hz con errore nullo | 160 000 | 4 | |
| 4 MHz, 300 Hz | 13 333 | 1 | |
| 10 MHz, 25 s (prescaler a 16 bit) | 3815 | (0xFFFB) |
Frequenza il più possibile prossima: quando non è divisibile, l'errore sulla frequenza è dovuto all'arrotondamento di (per 4 MHz e 300 Hz: Hz). Errore nullo: si cerca una coppia con esatto: 160000 (con non è esatto perché 160000 non è divisibile per 3).
Timer in modalità toggle. Se all'evento di compare l'uscita commuta (toggle), ogni evento cambia il livello: la frequenza dell'onda quadra è la metà di quella degli eventi e il duty-cycle è 50%. Esempio d'esame: clock del timer 32 MHz, prescaler 0 (divisione 1), periodo : frequenza di conteggio 32 MHz; frequenza degli eventi Hz; onda quadra a 900 Hz, duty-cycle 50%.
Modalità capture
Nella modalità capture il timer, in free-runil timer riparte da solo dopo ogni evento e conta in continuazione, salva il valore del contatore in un registro al verificarsi di un evento esterno (fronte di salita o di discesa su un pin). Salvando il valore a due eventi consecutivi si misura la distanza nel tempo: (in conteggi, risoluzione ). Si può misurare la durata di un impulso (due fronti diversi) o il periodo di un'onda (due fronti uguali), o realizzare sincronizzazioni (PLL: PLL digitale con i timerUn PLL (anello ad aggancio di fase) tiene un segnale generato a frequenza e fase in relazione costante con un riferimento. In un µC si realizza con un timer in capture (misura il periodo del riferimento) e uno in compare (genera gli impulsi). L'errore di fase $\Delta\phi$ (intervallo tra due eventi) va portato a 0 con un regolatore sul periodo $P$ degli impulsi: compensare solo l'errore istantaneo non basta, serve un PI: $P_{int}(k)=P_{int}(k-1)+\frac{\Delta\phi(k)}N$, $P(k+1)=P_{int}(k)+\frac{\Delta\phi(k)}N$ (con $N$ = rapporto delle frequenze), che è dead-beat (errore nullo in un passo, polo in $z=0$). In pratica si riducono i guadagni per robustezza.PLL digitale con i timer →). L'interruzione si associa di solito solo all'evento che conclude la misura, e nella ISR si fa: (1) rimuovere la richiesta (altrimenti resta attiva); (2) leggere il registro di captureil timer salva il valore del contatore quando arriva un evento esterno; (3) sottrarre il valore precedente; (4) scrivere il risultato.
Overflow innocuo. Se tra i due eventi il contatore va in overflowil contatore supera il massimo valore e riparte da zero una sola volta, la differenza è comunque corretta per l'aritmetica circolare in complemento a 2 (modulo ): la sottrazione "senza segno" dà sempre un risultato positivo e giusto. Se il periodo supera conteggi (più di un giro) la misura è invece errata.
Esempio. Clock 12 MHz (nessun prescaler), contatore a 16 bit, onda quadra a 1 kHz. Risoluzione: ns. Periodo in conteggi: . Se all'ultimo evento il contatore valeva , il precedente valeva .
Scelta del clock per una misura di periodo. Se varia tra e e si vuole una precisione relativa :
- il periodo vale conteggi e l'errore è di conteggio: per tutti i valori, cioè ;
- per non superare un giro del contatore: , cioè . Per kHz e : MHz e MHz. Con MHz e kHz: ; errore relativo .
Watchdog e altri timer
Il watchdog timer lavora sempre in free-run. Una volta attivato genera, di solito all'overflow, una richiesta di interruzione non mascherabile (NMIinterruzione non mascherabile). L'ultima azione dell'algoritmo di controllo è azzerare il watchdog (impedirne l'overflow). Se l'algoritmo non arriva in fondo entro il periodo del watchdog, questo non viene azzerato e interrompe il processore: la ISR esegue un reset del µC che consente di rivelare il malfunzionamento e ripartire da condizioni note, evitando che il sistema resti bloccato in uno stallo (per esempio in un while(!evento){} che non termina). Il real time clock è programmabile solo per generare interruzioni a cadenza fissa. Altri timer: modulatori PWM (Modulazione PWM - duty-cycle, risoluzione e demodulazioneLa PWM trasferisce un segnale modulante $V^$ nella larghezza degli impulsi di un'onda quadra a frequenza fissa: con duty-cycle $d=t_1/T$ e livelli $\pm\frac E2$ la media è $V_{med}=(d-\frac12)E=E,\frac{V^}{V_p}$. L'informazione sta nel valor medio; il resto dello spettro (armoniche della portante) si elimina con un passa-basso (demodulazione). Il modulatore digitale è un timer: contatore + comparatore, $N=f_{clk}/f_{PWM}$ conteggi per periodo, risoluzione $n=\log_2N$ bit (massima frequenza per $n$ bit: $f_{clk}/2^n$), registro di compare = duty-cycle. Servono almeno 8 bit per evitare cicli limite.Modulazione PWM - duty-cycle, risoluzione e demodulazione →).
Esempi di timer reali
- PIC18F452: 4 timer (TIMER0 general purposetimer di uso generale, non dedicato a una funzione specifica a 8 o 16 bit; TIMER1 e 3 con capture, TIMER2 per il PWM), con prescaler nei registri di configurazione.
- NXP LPC2129: timer a 32 bit con capture and compare su 4 canali, PWM su 6, RTC, watchdog.
- STM32G474RE: timer a 16 bit e un timer ad alta risoluzione (HRTIMtimer ad alta risoluzione del microcontrollore STM32G474) con 6 contatori (un master e 5 moduli A-E, ciascuno con capture/compare e due pin). Il clock interno di HRTIM arriva a circa GHz con un PLL ( GHz), risoluzione massima 184 ps. Per una portante a 100 kHz: periodo ; per un duty-cycle 50% il compare vale .
- Pin condivisi: i pin di I/O sono meno numerosi delle periferiche: un multiplexer di alternate functionfunzione alternativa: modo in cui un pin viene collegato a una periferica collega ciascun pin a una periferica scelta dal programmatore.
Errori comuni
- Confondere frequenza degli eventi (di compare) e frequenza dell'onda in toggle (metà).
- Non scegliere il minimo prescaler (si perde risoluzione).
- Dimenticare che il periodo in capture è la differenza di due letture e non il valore del registro.
- Pensare che l'overflow del contatore invalidi la misura di capture (vale solo se più di uno).
- Confondere "registro di prescale = divisione" con "= divisione − 1" senza guardare il testo.
Versione ripasso
- Timer: contatore a 16 bit; ; compare/match (interruzione, reset, azione su pin), single-shot o free-run. 16+16 bit a 10 MHz: 429,5 s, risoluzione 100 ns, 6,55 ms a risoluzione massima.
- Match per un evento ogni : , (minimo), (10 MHz 20 ms: 4 e ; 12 ms: 2 e ; 16 MHz 100 Hz: 3, 53333 o 4, 40000 esatto).
- Toggle: onda a metà frequenza, duty 50% (32 MHz, : 1800 Hz → 900 Hz).
- Capture: , un overflow è innocuo; e (1-100 kHz, 1%: 10-65,5 MHz); 50 MHz, 26 kHz: , 0,052%.
- Watchdog: free-run, NMI e reset se non viene azzerato. HRTIM STM32G474: 5,44 GHz, 184 ps; 100 kHz → , 50% → .
- Errori: eventi contro toggle; prescaler non minimo; capture ≠ differenza; overflow (Modulazione PWM - duty-cycle, risoluzione e demodulazioneLa PWM trasferisce un segnale modulante $V^$ nella larghezza degli impulsi di un'onda quadra a frequenza fissa: con duty-cycle $d=t_1/T$ e livelli $\pm\frac E2$ la media è $V_{med}=(d-\frac12)E=E,\frac{V^}{V_p}$. L'informazione sta nel valor medio; il resto dello spettro (armoniche della portante) si elimina con un passa-basso (demodulazione). Il modulatore digitale è un timer: contatore + comparatore, $N=f_{clk}/f_{PWM}$ conteggi per periodo, risoluzione $n=\log_2N$ bit (massima frequenza per $n$ bit: $f_{clk}/2^n$), registro di compare = duty-cycle. Servono almeno 8 bit per evitare cicli limite.Modulazione PWM - duty-cycle, risoluzione e demodulazione →).
Esercizi su questo argomento
- Esercizio 21 · controllo digitale della velocità di un motore con regolatore PI, scale, timer e trasmissione seriale (tema d'esame 3 settembre 2020)
- Esercizio 23 · timer, calcolo di prescaler e registro di match, modalità toggle (temi d'esame febbraio 2023, 2004 e novembre 2020)
- Esercizio 24 · timer in modalità capture, misura di periodo e di duty-cycle (temi d'esame gennaio 2026 e dicembre 2020)
- Esercizio 25 · modulatore PWM con timer a 16 bit, registri di periodo e di confronto, risoluzione (temi d'esame gennaio 2025, febbraio 2025, gennaio 2026 e 2006)
- Esercizio 28 · programmazione degli STM32 con la HAL e quesiti di linguaggio C (temi d'esame gennaio 2021, gennaio 2022, febbraio 2022, febbraio 2025 e 2020-21)
- Esercizio 29 · PLL digitale con timer, regolatore dead-beat e margini di tempo di calcolo (esempio del corso)