Salta al contenuto
Note per Studenti Timer - prescaler, compare, capture e watchdog

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 fcont=fclk/PSCf_{cont}=f_{clk}/PSC, sottomultiplo di fclkf_{clk};
  • 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 216−1=655352^{16}-1=65535 e poi va in overflow.

Convenzione per il prescaler. Nei testi d'esame il registro di prescale rappresenta il fattore di divisione (per esempio PSC=4PSC=4 divide il clock per 4). Nelle librerie reali (HAL STM32) il registro contiene "fattore −1-1" e il registro di periodo "conteggi −1-1": 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 2n2^n (nn 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 fclk=10f_{clk}=10 MHz: massimo intervallo 216⋅216/10 MHz=429,52^{16}\cdot2^{16}/10\text{ MHz}=429{,}5 s; massima risoluzione 100100 ns; massimo intervallo alla massima risoluzione 65536⋅100 ns=6,5565536\cdot100\text{ ns}=6{,}55 ms.

Modi di funzionamento

Calcolo di prescaler e match

Per generare un evento ogni TT con clock fclkf_{clk} e contatore a 16 bit: i conteggi totali sono Ntot=T fclkN_{tot}=T\,f_{clk}. Si cerca PSC⋅N=NtotPSC\cdot N=N_{tot} con N≤216N\le2^{16}. Per la massima risoluzione si sceglie il minimo PSCPSC possibile: PSC=⌈Ntot/216⌉PSC=\lceil N_{tot}/2^{16}\rceil, poi N=Ntot/PSCN=N_{tot}/PSC arrotondato.

Dati NtotN_{tot} PSCPSC min match NN
10 MHz, 20 ms (prescaler a 8 bit) 200 000 ⌈3,05⌉=4\lceil3{,}05\rceil=4 50000=0xC35050000=\texttt{0xC350}
10 MHz, 12 ms 120 000 2 60000=0xEA6060000=\texttt{0xEA60}
20 MHz, 15 ms 300 000 5 60000=0xEA6060000=\texttt{0xEA60} (risoluzione 0,25 μ0{,}25\ \mus)
16 MHz, 100 Hz 160 000 3 53333=0xD05553333=\texttt{0xD055}
16 MHz, 100 Hz con errore nullo 160 000 4 4000040000
4 MHz, 300 Hz 13 333 1 13333=0x341513333=\texttt{0x3415}
10 MHz, 25 s (prescaler a 16 bit) 2,5⋅1082{,}5\cdot10^8 3815 6553165531 (0xFFFB)

Frequenza il più possibile prossima: quando NtotN_{tot} non è divisibile, l'errore sulla frequenza è dovuto all'arrotondamento di NN (per 4 MHz e 300 Hz: 4 MHz/13333=300,00754\,\text{MHz}/13333=300{,}0075 Hz). Errore nullo: si cerca una coppia PSC,NPSC,N con PSC⋅N=NtotPSC\cdot N=N_{tot} esatto: 160000 =4⋅40000=4\cdot40000 (con PSC=3PSC=3 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 SYNCPER=0x4572=17778SYNCPER=\texttt{0x4572}=17778: frequenza di conteggio 32 MHz; frequenza degli eventi 32 MHz/17778=180032\text{ MHz}/17778=1800 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: Δ=C2−C1\Delta=C_2-C_1 (in conteggi, risoluzione 1/fclk1/f_{clk}). 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 2162^{16}): la sottrazione "senza segno" dà sempre un risultato positivo e giusto. Se il periodo supera 2162^{16} 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: 1/12 MHz=83,31/12\text{ MHz}=83{,}3 ns. Periodo in conteggi: 12 MHz/1 kHz=12000=0x2EE012\text{ MHz}/1\text{ kHz}=12000=\texttt{0x2EE0}. Se all'ultimo evento il contatore valeva 0x015A\texttt{0x015A}, il precedente valeva (0x015A−0x2EE0) mod 216=0xD27A(\texttt{0x015A}-\texttt{0x2EE0})\bmod2^{16}=\texttt{0xD27A}.

Scelta del clock per una misura di periodo. Se fxf_{x} varia tra fminf_{min} e fmaxf_{max} e si vuole una precisione relativa ε\varepsilon:

  • il periodo vale N=fclk/fxN=f_{clk}/f_x conteggi e l'errore è di ±1\pm1 conteggio: 1N≤ε\frac1N\le\varepsilon per tutti i valori, cioè fclk≥fmaxεf_{clk}\ge\frac{f_{max}}\varepsilon;
  • per non superare un giro del contatore: fclk/fmin≤216f_{clk}/f_{min}\le2^{16}, cioè fclk≤216fminf_{clk}\le2^{16}f_{min}. Per fx∈[1,100]f_x\in[1,100] kHz e ε=1%\varepsilon=1\%: fclk≥100 kHz0,01=10f_{clk}\ge\frac{100\text{ kHz}}{0{,}01}=10 MHz e fclk≤65536⋅1 kHz=65,5f_{clk}\le65536\cdot1\text{ kHz}=65{,}5 MHz. Con fclk=50f_{clk}=50 MHz e fx=26f_x=26 kHz: Tp=50 MHz/26 kHz=1923,08→1923=0x0783T_p=50\text{ MHz}/26\text{ kHz}=1923{,}08\to1923=\texttt{0x0783}; errore relativo 11923=0,052%\frac1{1923}=0{,}052\%.

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 5,45{,}4 GHz con un PLL (170 MHz×32=5,44170\text{ MHz}\times32=5{,}44 GHz), risoluzione massima 184 ps. Per una portante a 100 kHz: periodo 5,44 GHz/100 kHz=54400=0xD4805{,}44\text{ GHz}/100\text{ kHz}=54400=\texttt{0xD480}; per un duty-cycle 50% il compare vale 27200=0x6A4027200=\texttt{0x6A40}.
  • 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

Esercizi su questo argomento

Teoria collegata