Esercizio 23timer, calcolo di prescaler e registro di match, modalità toggle (temi d'esame febbraio 2023, 2004 e novembre 2020)
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 : (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 .
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 . Il contatore è a 16 bit ().
- (a) Massima risoluzione = massimo numero di conteggi per periodo = minimo prescaler: e match (). Frequenza ottenuta Hz (errore relativo ).
- (b) Errore nullo: serve esatto. : con no (160000 non è multiplo di 3), sì: (): Hz esatti (a spese della risoluzione: 40000 conteggi invece di 53333).
(ii) Interrupt periodici a 10 MHz
| Intervallo | minimo | match | |
|---|---|---|---|
| 20 ms (8 bit) | (; con 8 bit al massimo 255) | ||
| 12 ms | |||
| 25 s | (; la soluzione ufficiale riporta : troncamento di 1 conteggio) |
Con 20 MHz e 15 ms: , e match (esatto). Risoluzione temporale (distanza tra due incrementi del contatore) .
(iii) Toggle
- (a) Prescaler 0 (divisione 1): la frequenza di conteggio è quella del clock del timer: 32 MHz.
- (b)
SYNCPERè il periodo di conteggio: gli eventi di compare avvengono a Hz. In modalità toggle a ogni evento l'uscita cambia livello: il periodo dell'onda è il doppio, quindi . - (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 conteggi per periodo: .
- (b) Per kHz con risoluzione bit: conteggi per periodo ( bit) con . Per avere esattamente 8 kHz e risoluzione più vicina possibile a 10 bit conviene e ( bit): . (Se invece si fissa esatti, 10 bit, e si cerca il prescaler che dà la frequenza più vicina a 8 kHz: kHz, kHz; il più vicino a 8 kHz è : così nella prova del 2004 con valore .)
- (c) con : ; con : .
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 senza dividere ancora per i conteggi .
- 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).
- (i) max risoluzione: , match 53333 (
0xD055); errore nullo: , match 40000. - (ii) 20 ms: ,
0xC350; 12 ms: ,0xEA60; 25 s: ,0xFFFB(ufficiale0xFFFA); 15 ms a 20 MHz: ,0xEA60, 0,25 µs. - (iii) 32 MHz; eventi 1800 Hz → onda 900 Hz; duty 50%.
- (iv) kHz; 8 kHz: , , compare .
- Errori: prescaler non minimo; eventi/toggle; larghezza del prescaler; dimenticato (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 →).