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. (i) Clock 16 MHz, contatore e prescaler a 16 bit, segnale a 100 Hz: match e prescaler per massima risoluzione e per errore nullo. (ii) Clock 10 MHz: interrupt ogni 20 ms (contatore 16 bit, prescaler 8 bit), 12 ms e 25 s (prescaler 16 bit); a 20 MHz ogni 15 ms con risoluzione. (iii) Timer 1 dello STM32F334R8 in toggle con clock 32 MHz e SYNCPER . (iv) PWM a 16 bit con clock 20 MHz, duty a 10 bit, 8 kHz (febbraio 2023, 2004, novembre 2020).
- (i) Massima risoluzione: ; , match , frequenza Hz.
- (i) Errore nullo: non è multiplo di 3; con il match è e la frequenza è esatta (a spese della risoluzione).
- (ii) Interrupt a 10 MHz: 20 ms: , , match (con prescaler a 8 bit il massimo è 255, quindi il valore è ammesso). 12 ms: , match . 25 s: , , match (
0xFFFB); la soluzione ufficiale riporta0xFFFA, troncando di un conteggio. - (ii) 15 ms a 20 MHz: , , match ; risoluzione µs.
- (iii) Toggle: prescaler 0, quindi conteggio a 32 MHz; eventi a Hz; in toggle l'onda ha frequenza 900 Hz e duty 50%.
- (iv) PWM: con 10 bit servono 1024 conteggi, quindi kHz. Per 8 kHz con risoluzione di almeno 10 bit: e ( bit), frequenza esatta; in alternativa, con il prescaler più vicino a 8 kHz è 3 (6,51 kHz contro 9,77 kHz con 2).