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. (i) Timer a 16 bit in capture su un'onda quadra tra 1 e 100 kHz, con precisione almeno dell'1% e periodo come differenza di due catture; frequenza minima e massima del clock e, a 50 MHz con 26 kHz, periodo ed errore (gennaio 2026). (ii) Capture a 12 MHz, senza prescaler, su un'onda a 1 kHz: risoluzione, periodo teorico e cattura precedente all'ultima 0x015A\texttt{0x015A} (dicembre 2020). (iii) Fronte di salita a 0xFFF0\texttt{0xFFF0}, discesa a 0x0210\texttt{0x0210}, salita successiva a 0x0A00\texttt{0x0A00}, con overflow tra le prime due: larghezza, periodo e duty.

  • (i) Frequenza minima del clock: l'errore peggiore è a 100 kHz, quindi fclk≥100 kHz0,01=10f_{clk}\ge\frac{100\text{ kHz}}{0{,}01}=10 MHz. Massima: il periodo più lungo (1 kHz) non deve superare un giro del contatore: fclk≤65536⋅1f_{clk}\le65536\cdot1 kHz =65,5=65{,}5 MHz.
  • (i) Con 50 MHz e 26 kHz: N=1923=0x0783N=1923=\texttt{0x0783} (periodo 38,4638{,}46 µs); errore relativo ±11923=0,052%\pm\frac{1}{1923}=0{,}052\%.
  • (ii) Risoluzione: 112 MHz=83,3\frac{1}{12\text{ MHz}}=83{,}3 ns. Periodo: 12000=0x2EE012000=\texttt{0x2EE0}. Se l'ultima cattura è 0x015A\texttt{0x015A}, quella precedente è (346−12000) mod 65536=0xD27A(346-12000)\bmod65536=\texttt{0xD27A}.
  • (ii) Overflow: da 0xD27A\texttt{0xD27A} a 0xFFFF\texttt{0xFFFF} e da 0 a 0x015A\texttt{0x015A} c'è un solo giro; la sottrazione senza segno 0x015A−0xD27A=0x2EE0\texttt{0x015A}-\texttt{0xD27A}=\texttt{0x2EE0} è comunque corretta.
  • (iii) Larghezza (salita → discesa): 0x0210−0xFFF0≡544=0x0220\texttt{0x0210}-\texttt{0xFFF0}\equiv544=\texttt{0x0220} conteggi.
  • (iii) Periodo (salita → salita): 0x0A00−0xFFF0≡2576=0x0A10\texttt{0x0A00}-\texttt{0xFFF0}\equiv2576=\texttt{0x0A10} conteggi.
  • (iii) Duty: 5442576=21,1%\frac{544}{2576}=21{,}1\%. Il risultato è corretto perché la durata è minore di 2162^{16} conteggi.

Teoria collegata