Salta al contenuto
Note per Studenti Esercizio 24 · timer in modalità capture, misura di periodo e di duty-cycle (temi d'esame gennaio 2026 e dicembre 2020)

Esercizio 24timer in modalità capture, misura di periodo e di duty-cycle (temi d'esame gennaio 2026 e dicembre 2020)

Esame
In questa pagina 5

Testo (tema d'esame gennaio 2026 problema P5; esercizi del 4 dicembre 2020 problema 4).

(i) Il timer a 16 bit di un microcontrollore è configurato in modalità di cattura (capture). Al pin di cattura è applicato un segnale a onda quadra xQ(t)x_Q(t) con frequenza tra 1 kHz e 100 kHz. Si desidera misurare il periodo in tempo reale garantendo una precisione della misura almeno dell'1%. L'algoritmo sottrae due valori consecutivi del registro di cattura, salvati a ogni fronte positivo. Determinare: (a) la frequenza minima del clock del timer; (b) la frequenza massima del clock; e, con fclk=50f_{clk}=50 MHz: (c) il valore ottenuto per il periodo TpT_p quando xQx_Q è a 26 kHz; (d) l'errore relativo atteso per questa misura.

(ii) Un timer in capture, con contatore a 16 bit e clock di 12 MHz (senza prescaler), misura l'onda quadra a 1 kHz sui fronti di salita. Determinare: (a) la risoluzione temporale; (b) il valore esadecimale teorico del periodo (differenza tra due catture); (c) il valore del contatore al precedente evento di capture, sapendo che all'ultimo evento era 0x015A\texttt{0x015A}.

(iii) Un impulso ha il fronte di salita catturato a 0xFFF0\texttt{0xFFF0}, il fronte di discesa a 0x0210\texttt{0x0210} e il successivo fronte di salita a 0x0A00\texttt{0x0A00} (il contatore è andato in overflow tra le due prime catture). Calcolare larghezza dell'impulso, periodo e duty-cycle.


Teoria usata: Timer - prescaler, compare, capture e watchdogUn timer è un contatore binario di periodi di clock: $f_{cont}=f_{clk}/PSC$ ($PSC$ = fattore del prescaler). In modalità compare/match genera un evento (interruzione, reset del conteggio, azione su un pin) quando il conteggio raggiunge il registro di match: per un evento ogni $T$ servono $N=T,f_{clk}/PSC\le2^{16}$ conteggi, e si prende il minimo $PSC$ (massima risoluzione). Con uscita in modo toggle la frequenza dell'onda quadra è metà di quella degli eventi, il duty-cycle 50%. In modalità capture il valore del contatore, salvato a due fronti, dà il periodo: $T=C_2-C_1$ (corretto anche con un overflow), risoluzione $1/f_{clk}$. Il watchdog reinizializza il sistema se non viene azzerato in tempo.Timer - prescaler, compare, capture e watchdog →, Numeri binari e complemento a dueI processori lavorano con un numero fisso di bit $n$. I naturali vanno da $0$ a $2^n-1$; per i negativi si usa il complemento a due: $C_2(N)=2^n-N=\overline N+1$ (si invertono tutti i bit e si somma 1). Con $n$ bit rappresenta $-2^{n-1}\le N\le2^{n-1}-1$, ha un solo zero e unifica somma e sottrazione. Quando il risultato esce dall'intervallo c'è overflow; gli overflow intermedi si compensano se il risultato finale è rappresentabile. La lunghezza di parola non è l'accuratezza.Numeri binari e complemento a due →.

Principio

In capture il contatore del timer è in free-run (a fclkf_{clk}) e a ogni evento sul pin ne salva il valore in un registro. Se C1C_1 e C2C_2 sono due catture successive sullo stesso tipo di fronte, il periodo in conteggi è N=C2−C1N=C_2-C_1 (modulo 2162^{16}) e il periodo del segnale Tx=N/fclkT_x=N/f_{clk}. L'errore di quantizzazione è di ±1\pm1 conteggio (1 LSB =1/fclk=1/f_{clk}): errore relativo 1N=fxfclk\frac1N=\frac{f_x}{f_{clk}}.

(i) Specifiche di precisione

(a) Frequenza minima. L'errore relativo fxfclk\frac{f_x}{f_{clk}} è peggiore alla frequenza più alta (fx=100f_x=100 kHz): per averlo ≤1%\le1\%: fclk≥fx,max0,01=100 kHz0,01=10 MHzf_{clk}\ge\frac{f_{x,max}}{0{,}01}=\frac{100\text{ kHz}}{0{,}01}=\mathbf{10\ MHz} (a 100 kHz il periodo vale 100 conteggi: 1100=1%\frac1{100}=1\%). (b) Frequenza massima. Il periodo più lungo (fx=1f_x=1 kHz) non deve superare un giro del contatore: fclkfx,min≤216=65536⇒fclk≤65536⋅1 kHz=65,5 MHz\frac{f_{clk}}{f_{x,min}}\le2^{16}=65536\Rightarrow f_{clk}\le65536\cdot1\text{ kHz}=\mathbf{65{,}5\ MHz} (con un solo overflow tra due catture la sottrazione resta corretta; con più di uno la misura è errata). (c) Con fclk=50f_{clk}=50 MHz e fx=26f_x=26 kHz: Tp=50 MHz26 kHz=1923,08→1923=0x0783T_p=\frac{50\ \text{MHz}}{26\ \text{kHz}}=1923{,}08\to1923=\mathbf{0x0783} conteggi (cioè 38,46 μ38{,}46\ \mus; il periodo vero è 38,4615 μ38{,}4615\ \mus). (d) Errore relativo atteso: ±11923=0,052%\pm\frac1{1923}=\mathbf{0{,}052\%} (un LSB =20=20 ns su 38,46 μ38{,}46\ \mus).

(ii) Capture a 12 MHz, onda a 1 kHz

(a) Risoluzione temporale: 112 MHz=83,3 ns\frac1{12\ \text{MHz}}=\mathbf{83{,}3\ ns}. (b) Periodo teorico: 12 MHz1 kHz=12000=0x2EE0\frac{12\ \text{MHz}}{1\ \text{kHz}}=12000=\mathbf{0x2EE0} conteggi. (c) Se all'ultimo evento C2=0x015A=346C_2=\texttt{0x015A}=346, il precedente era C1=(C2−N) mod 65536=(346−12000) mod 65536=53882=0xD27AC_1=(C_2-N)\bmod65536=(346-12000)\bmod65536=53882=\mathbf{0xD27A}: il contatore è andato in overflow tra le due catture (da 0xD27A\texttt{0xD27A} a 0xFFFF\texttt{0xFFFF}, poi da 0 a 0x015A\texttt{0x015A}) e la sottrazione senza segno 0x015A−0xD27A=0x2EE0\texttt{0x015A}-\texttt{0xD27A}=\texttt{0x2EE0} dà comunque il risultato corretto.

(iii) Larghezza e duty-cycle

Le differenze si fanno modulo 2162^{16} (aritmetica circolare):

  • larghezza (fronte di discesa meno fronte di salita): 0x0210−0xFFF0=528−65520=−64992≡544=0x0220\texttt{0x0210}-\texttt{0xFFF0}=528-65520=-64992\equiv544=\mathbf{0x0220} conteggi;
  • periodo (salita-salita): 0x0A00−0xFFF0=2560−65520≡2576=0x0A10\texttt{0x0A00}-\texttt{0xFFF0}=2560-65520\equiv2576=\mathbf{0x0A10} conteggi;
  • duty-cycle =5442576=21,1%=\frac{544}{2576}=\mathbf{21{,}1\%}. Il risultato non dipende dall'overflow, purché la durata misurata non superi 2162^{16} conteggi: qui 2576≪655362576\ll65536.

Errori comuni

  • Credere che l'overflow del contatore falsi la misura: con una sola occorrenza la differenza modulo 2162^{16} è corretta.
  • Cercare fclkf_{clk} minima con la frequenza più bassa (è la più alta a dare l'errore relativo peggiore) e massima con la più alta (la più bassa è quella che potrebbe fare più di un giro).
  • Dimenticare che l'errore di un conteggio è un errore relativo pari a fx/fclkf_x/f_{clk}.
  • Confondere larghezza dell'impulso (due fronti diversi) con il periodo (due fronti uguali).

Versione ripasso

Testo. Capture a 16 bit: clock per precisione 1% con fx∈[1,100]f_x\in[1,100] kHz; misura a 50 MHz e 26 kHz; 12 MHz e 1 kHz; larghezza e duty con overflow (gennaio 2026, dicembre 2020).

Teoria collegata