Salta al contenuto
Note per Studenti Esercizio 23 · timer, calcolo di prescaler e registro di match, modalità toggle (temi d'esame febbraio 2023, 2004 e novembre 2020)

Esercizio 23timer, calcolo di prescaler e registro di match, modalità toggle (temi d'esame febbraio 2023, 2004 e novembre 2020)

Esame
In questa pagina 5

Testo (temi d'esame febbraio 2023 problemi P6 e P8; prove del 2004; esercizi del 27 novembre 2020 problema 5).

(i) Il timer di un microcontrollore è collegato a un clock di 16 MHz; ha un contatore e un prescaler (PSC) a 16 bit. Si vuole un segnale periodico a 100 Hz. Determinare i valori del registro di match e del registro di divisione di frequenza: (a) con la massima risoluzione possibile; (b) con errore nullo sulla frequenza.

(ii) Timer con clock 10 MHz che deve generare un interrupt ogni: (a) 20 ms (contatore a 16 bit, prescaler a 8 bit); (b) 12 ms (prescaler a 16 bit); (c) 25 s (prescaler a 16 bit). Indicare il valore esadecimale del registro di compare con il minimo valore del prescaler possibile. Per un timer a 20 MHz che deve generare un interrupt ogni 15 ms indicare anche la risoluzione temporale ottenuta.

(iii) Si consideri la routine di configurazione del Timer 1 (STM32F334R8): Prescaler = 0, Period = SYNCPER, OCMode = TIM_OCMODE_TOGGLE, HAL_TIM_OC_Start(...). Sapendo che il timer è collegato a un clock di 32 MHz e che SYNCPER =0x4572=\texttt{0x4572}: (a) la frequenza di conteggio; (b) la frequenza dell'onda quadra generata; (c) il duty-cycle.

(iv) Un µC ha un modulatore PWM a 16 bit con clock a 20 MHz. Con duty-cycle di 10 bit: (a) la massima frequenza di modulazione; (b) il prescaler per una frequenza il più possibile prossima a 8 kHz con risoluzione almeno 10 bit; (c) il registro di compare per D=0,3D=0{,}3.


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 →, Microcontrollori STM32 - clock, timer, ADC e codice HALI µC STM32 (core ARM Cortex-M) del corso si configurano con la libreria HAL: si riempiono strutture C (...InitTypeDef) con valori simbolici e si chiamano funzioni di libreria. Clock (STM32F334R8): oscillatore esterno HSE 8 MHz × PLL (MUL9) = SYSCLK 72 MHz (massimo); AHB ÷1, APB1 ÷2 (36 MHz), APB2 ÷1 (72 MHz); clock dell'ADC = clock del bus ÷ divisore (÷6 → 12 MHz). Timer in PWM: $f=f{clk}/((PSC+1)(Period+1))$, Pulse = duty $\times$ conteggi. Toggle: onda quadra a metà della frequenza di match. ADC: SAR a 12 bit, conversioni injected avviate da un trigger del timer, lettura con interruzione.Microcontrollori STM32 - clock, timer, ADC e codice HAL →, 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 →.

(i) 16 MHz, 100 Hz

Conteggi totali Ntot=16 MHz100 Hz=160 000N_{tot}=\frac{16\ \text{MHz}}{100\ \text{Hz}}=160\,000. Il contatore è a 16 bit (≤65536\le65536).

  • (a) Massima risoluzione = massimo numero di conteggi per periodo = minimo prescaler: PSC=⌈16000065536⌉=⌈2,44⌉=3PSC=\lceil\frac{160000}{65536}\rceil=\lceil2{,}44\rceil=\mathbf3 e match 1600003=53333,3→53333\frac{160000}3=53333{,}3\to\mathbf{53333} (0xD055\texttt{0xD055}). Frequenza ottenuta 16 MHz3⋅53333=100,0006\frac{16\ \text{MHz}}{3\cdot53333}=100{,}0006 Hz (errore relativo 6⋅10−66\cdot10^{-6}).
  • (b) Errore nullo: serve PSC⋅N=160000PSC\cdot N=160000 esatto. 160000=28⋅54160000=2^8\cdot5^4: con PSC=3PSC=3 no (160000 non è multiplo di 3), PSC=4PSC=4 sì: N=1600004=40000N=\frac{160000}4=\mathbf{40000} (0x9C40\texttt{0x9C40}): f=16 MHz4⋅40000=100f=\frac{16\text{ MHz}}{4\cdot40000}=100 Hz esatti (a spese della risoluzione: 40000 conteggi invece di 53333).

(ii) Interrupt periodici a 10 MHz

Intervallo Ntot=T⋅10 MHzN_{tot}=T\cdot10\text{ MHz} PSCPSC minimo match Ntot/PSCN_{tot}/PSC
20 ms (8 bit) 200 000200\,000 ⌈3,05⌉=4\lceil3{,}05\rceil=4 (0x04\texttt{0x04}; con 8 bit al massimo 255) 50 000=0xC35050\,000=\texttt{0xC350}
12 ms 120 000120\,000 ⌈1,83⌉=2\lceil1{,}83\rceil=2 60 000=0xEA6060\,000=\texttt{0xEA60}
25 s 2,5⋅1082{,}5\cdot10^8 ⌈3814,7⌉=3815=0x0EE7\lceil3814{,}7\rceil=3815=\texttt{0x0EE7} 2,5⋅1083815=65530,8→65531\frac{2{,}5\cdot10^8}{3815}=65530{,}8\to65531 (0xFFFB\texttt{0xFFFB}; la soluzione ufficiale riporta 0xFFFA\texttt{0xFFFA}: troncamento di 1 conteggio)

Con 20 MHz e 15 ms: Ntot=300 000N_{tot}=300\,000, PSC=⌈4,58⌉=5PSC=\lceil4{,}58\rceil=5 e match =3000005=60000=0xEA60=\frac{300000}5=60000=\texttt{0xEA60} (esatto). Risoluzione temporale (distanza tra due incrementi del contatore) =PSCfclk=520 MHz=0,25 μs=\frac{PSC}{f_{clk}}=\frac5{20\text{ MHz}}=\mathbf{0{,}25\ \mu s}.

(iii) Toggle

  • (a) Prescaler 0 (divisione 1): la frequenza di conteggio è quella del clock del timer: 32 MHz.
  • (b) SYNCPER =0x4572=17778=\texttt{0x4572}=17778 è il periodo di conteggio: gli eventi di compare avvengono a 32 MHz17778=1800\frac{32\ \text{MHz}}{17778}=1800 Hz. In modalità toggle a ogni evento l'uscita cambia livello: il periodo dell'onda è il doppio, quindi f=18002=900 Hzf=\frac{1800}2=\mathbf{900\ Hz}.
  • (c) Con il toggle gli intervalli alto e basso sono uguali: duty-cycle 50%.

(iv) PWM a 20 MHz

  • (a) Con 10 bit per il duty-cycle servono 210=10242^{10}=1024 conteggi per periodo: fPWM,max=20 MHz1024=19,53 kHzf_{PWM,max}=\frac{20\ \text{MHz}}{1024}=\mathbf{19{,}53\ kHz}.
  • (b) Per f≃8f\simeq8 kHz con risoluzione ≥10\ge10 bit: conteggi per periodo 20 MHz8 kHz=2500\frac{20\text{ MHz}}{8\text{ kHz}}=2500 (log⁡22500=11,3\log_22500=11{,}3 bit) con PSC=1PSC=1. Per avere esattamente 8 kHz e risoluzione più vicina possibile a 10 bit conviene PSC=2PSC=2 e N=20 MHz2⋅8 kHz=1250N=\frac{20\text{ MHz}}{2\cdot8\text{ kHz}}=1250 (log⁡21250=10,29\log_21250=10{,}29 bit): PSC=0x0002PSC=\mathbf{0x0002}. (Se invece si fissa N=1024N=1024 esatti, 10 bit, e si cerca il prescaler che dà la frequenza più vicina a 8 kHz: PSC=2→9,77PSC=2\to9{,}77 kHz, PSC=3→6,51PSC=3\to6{,}51 kHz; il più vicino a 8 kHz è PSC=3PSC=3: così nella prova del 2004 con valore 0x0003\texttt{0x0003}.)
  • (c) D=0,3D=0{,}3 con N=1250N=1250: 0,3⋅1250=375=0x01770{,}3\cdot1250=375=\mathbf{0x0177}; con N=1024N=1024: 0,3⋅1024=307,2→307=0x01330{,}3\cdot1024=307{,}2\to307=\texttt{0x0133}.

Errori comuni

  • Non prendere il minimo prescaler (si perde risoluzione).
  • Confondere gli eventi (a 1800 Hz) con l'onda in toggle (900 Hz).
  • Dimenticare il vincolo di larghezza del prescaler (8 bit: massimo 255).
  • Usare fclk/PSCf_{clk}/PSC senza dividere ancora per i conteggi NN.
  • Prendere "errore nullo" come "massima risoluzione": sono obiettivi diversi, qui 3 contro 4.

Versione ripasso

Testo. Prescaler e match per 100 Hz da 16 MHz; interrupt a 20 ms, 12 ms, 25 s da 10 MHz, 15 ms da 20 MHz; Timer 1 in toggle a 32 MHz con 0x4572; PWM a 20 MHz (febbraio 2023, 2004, novembre 2020).

Teoria collegata