PWM, fading di un LED (TIM15, blocking mode)

Il PWM

Si è visto che i timer possono essere usati in più modalità, una delle quali è la modalità PWM (Pulse Width Modulation, ovvero modulazione di larghezza di impulso):
Il funzionamento è il seguente:

  • Un timer sincronizzato ad una sorgente interna di clock conta fino al valore contenuto nel suo "auto reload register" ARR, una volta raggiunto il valore si resetta e riparte il conteggio.
  • Il pin del canale di uscita resta al livello logico alto fino a che il conteggio del timer non arriva al valore contenuto nel "capture compare register" CCR (in figura i registri CCR sono due chiamati CCR1 e CCR2). L'eguaglianza dei valori causa il passaggio del pin del canale di uscita al livello logico basso. Il pin resterà al livello logico basso finchè il timer non conta fino al valore contenuto nel suo registro di auto reload
  • A questo punto il ciclo ricomincia.

Nella figura è evidente che il valore ARR influenza il periodo (frequenza) del segnale PWM mentre il valore CCR influenza il duty cycle del segnale PWM.
La frequenza del PWM è quindi determinata dal clock interno, dal Prescaler e dal registro ARR. Il duty cycle e determinato invece solo dal valore del registro CCR.

Un singolo timer di solito ha più canali (il numero dipende dal timer utilizzato), con un singolo timer è quindi possibile generare più segnali PWM con diversi cicli di lavoro, tutti sincronizzati tra loro. Nella figura che segue è possibile vedere la struttura appena descritta dove OC1 - OC4 sono 4 canali PWM.

Calcolo della frequenza del PWM

La frequenza del segnale PWM ( FPWM ) è determinata dal valore contenuto nel registro ARR, dalla frequenza ( FCLK ) del clock a cui sono sincronizzati i conteggi del timer e dal valore del prescaler (PSC) che abbassa il periodo del clock. La relazione che interrorre tra essi è:

Calcolo del duty cycle del PWM

Il duty cyce è legato al rapporto tra il valore del capture compare register (CCRx) e il valore del registro ARR:

Risoluzione del PWM

Una delle proprietà più importanti per un segnale PWM è la risoluzione (chiamata anche step size). Questa non è altro che il numero di livelli discreti di duty cycle che è possibile impostare per un dato periodo del segnale PWM. In altre parole, la risoluzione indica quanti valori può assumere il duty cycle prima di raggiungere il 100%. Questo può essere importante in applicazioni audio, di controllo della velocità di un motore, di fading di una fonte luminosa.

Lo step size inteso come variazione precentuale minima si calcola come

ResolutionPWM% = 1/(ARR+1) [%]

Lo step size in numero di bit può essere determinato con la seguente formula:


Poichè in genere in fase di progettazione si procede a cercare il valore da inserire nel auto reload register (ARR), la formula da utilizzare per il calcolo della risoluzione è:


Fading del led

L'esperienza proposta mostra come è possibile variare la luminosità del led interno alla board (nell'esempio la NUCLE0-L452RE-P) usando la tecnica PWM.

Per fare questo useremo il timer TIM15. La sorgente del clock può essere sia interna al microcontrollore (il timer TIM15 è collegato alla linea APB2), sia esterna tramite piedini dedicati. Nel nostro caso utilizzaremo il clock interno lasciando a 0 tutti i prescaler (si ricorda che il valore 0 inserito in un prescaler equivale ad avere all'uscita lo stesso clock dell'ingresso). Questo significa che FCLK = 80 MHz. Impostando il valore di ARR al valore massimo di 65535 si ottiene FPWM =  1.22 KHz.

La risoluzione del PWM in numero di bit è quindi ResolutionPWM[Bits] = 16 che è la risoluzione massima con questo timer.

Si proceda a creare un nuovo progetto con l'STM32CubeIDE (vedere la procedura nell'esempio blink). e alla voce TIMER andare a selezionare il timer TIM15

e nel menù che compare a destra selezionare sul Channel 1 la voce "PWM Generation CH1". Si osservi che immediatamente dopo il piedino PB14 diventa verde e la label è "TIM15_CH1".