La struttura della periferica PWM del dsPIC30F, le tecniche per la generazione della base dei tempi e tutto quello che si deve sapere per avere il massimo controllo su carichi induttivi ed in particolare il controllo motori.
Il PWM, acronimo di Pulse Width Modulation, è una tecnica per il controllo di dispositivi analogici mediante segnali digitali generati tipicamente da un microcontrollore. La tecnica consiste nel modulare il duty cycle di un’onda quadra in accordo ad un segnale di controllo: il risultato è quindi una sequenza di impulsi aventi tutti la medesima ampiezza ma aventi una durata diversa in funzione di un segnale di controllo e l’effetto è quello di alimentare il carico per intervalli di tempo finiti in modo da controllarne la potenza assorbita. Uno dei vantaggi di questa tecnica è quello che il segnale di controllo che pilota direttamente il carico è digitale, quindi non è necessario operare conversioni DA, l’effetto del rumore è decisamente marginale e la lunghezza del collegamento fisico tra controllore e carico può essere anche significativa senza compromettere l’integrità del segnale. In prossimità del carico è sufficiente un filtro passa-basso passivo per rimuovere le armoniche ad alta frequenza del segnale PWM.
Il modulo PWM del dsPIC30F
Nel dsPIC30F è previsto un timer a 16 bit dedicato esclusivamente alla generazione della base dei tempi per i segnali PWM. Nella figura 1 è riportato lo schema a blocchi della periferica PWM del dsPIC30F.
Si noti che esiste un’unica base dei tempi e quattro diversi blocchi di generazione del duty cycle: questo permette di controllare 4 periferiche indipendenti. La base dei tempi viene generata dal timer PTMR al quale è possibile collegare un prescaler in modo da poter dividere la frequenza base (al massimo pari alla frequenza di un ciclo istruzione) per 1, 4, 16 o 64. Il timer viene automaticamente incrementato o decrementato (a seconda del valore del bit 15 del PTMR) e comparato con il valore impostato per il periodo (scritto nel registro PTPER) quindi viene generata una interruzione quando i due valori coincidono. Il modulo può anche essere configurato per generare interruzioni in corrispondenza di più occorrenze di uguaglianza tra PTMR e PTPER ed in particolare si può arrivare alla generazione di una interruzione in corrispondenza della sedicesima volta che i valori di PTMR e PTPER coincidono. Il controllo e la configurazione del modulo PWM avviene per mezzo del registro PTCON la cui struttura è riportata nella figura 2.
In particolare mediante questo registro è possibile abilitare/disabilitare il modulo (bit 15) impostare il prescaler/postscaler e scegliere uno dei quattro modi di funzionamento della periferica: free running, single event, continuos up/down, continuos up/down with double PWM update.
Modalità free running
Operando in modalità free running è possibile ottenere uscite PWM allineate al fronte di salita (Edge Aligned PWM). Si consideri la figura 3a in cui è riportato l’incremento del PTMR ed i livelli per PTPER, PDC1 e PDC2 relativi alle uscite PWM1 e PWM2. Inizialmente tutte le uscite sono attive (in figura sono riportare per semplicità le sole due uscite attive alte PWM1H e PWM2H) e quando il valore di PTMR coincide con quello di PDC1 (che fissa il duty cycle per l’uscita PWM1) l’uscita PWM1 commuta a livello basso. La stessa cosa avviene in maniera analoga per l’uscita PWM2 quando il PTMR coincide con PDC2. A livello firmware è possibile aggiornare il duty cycle in qualsiasi momento, ma operativamente i registri PDC vengono aggiornati con i nuovi valori solo all’inizio di un nuovo ciclo (ovvero quando PTMR è zero). Se le interruzioni sono abilitate si ha una interruzione all’inizio di ogni ciclo.
Modalità Single Event
La figura 3b mostra il segnale PWM ottenuto utilizzando la modalità single event. Questa modalità prevede un solo ciclo di conteggio per PTMR (il bit PTEN si azzera automaticamente all’azzeramento del PTMR) per cui viene generato un singolo impulso PWM sulle varie uscite. In questo caso, abilitando le interruzioni, viene generata una unica interruzione alla fine del ciclo.
Modalità continuos up/down
In questa modalità è possibile ottenere uscite PWM i cui impulsi sono tutti centrati, come mostrato nella figura 3c. In questo caso il PTMR funziona in modalità up/down per cui il periodo del segnale PWM risulta il doppio del valore impostato in PTMR. A differenza della modalità free running in questo caso si evita la commutazione simultanea di più uscite quindi consente di limitare i picchi di assorbimento inevitabilmente presenti durante le fasi di commutazione. Le interruzioni, se abilitate, vengono generate in corrispondenza di ogni azzeramento del PTMR e nello stesso istante, viene anche aggiornato il contenuto dei registri PDC.
Modalità continuos up/down with double update
Questa modalità, il cui funzionamento è illustrato in figura 3d, è molto simile alla precedente con l’unica differenza che i registri PDC vengono aggiornati sia all’azzeramento di PTMR sia quando lo stesso timer raggiunge il massimo valore (impostato mediante PTPER). Utilizzando questa tecnica è possibile ottenere segnali PWM non simmetrici.
L’unità Dead Time
Utilizzando i due segnali complementari di una stessa uscita PWM (ad esempio PWM1H e PWM1L) entra in gioco l’unità Dead Time. Utilizzando infatti i due segnali complementari per una applicazione tipo quella di figura 4, c’è il rischio che, a causa di asimmetrie sul tempo di salita/discesa dei fronti del segnale, le due uscite si trovino entrambe attive in uno stesso istante provocando un corto-circuito sulla linea di alimentazione. L’unità Dead Time inserisce un piccolo ritardo nella commutazione dei segnali in modo che questi non risultino mai attivi contemporaneamente. Nei dispositivi con 8 uscite PWM sono disponibili due valori per la dead time (A e B): questo consente di compensare anche eventuali differenze nei tempi di commutazione della coppia di transistori di potenza e, allo stesso tempo, poter gestire differenti stadi di pilotaggio con lo stesso chip. I registri coinvolti nella configurazione dell’unità Dead Time sono DTCON1 e DTCON2 la cui struttura è riportata in figura 5.
I ritardi sono calcolati mediante due contatori a 6 bit il cui valore viene confrontato con il limite impostato nel campo DTA e DTB di DTCON1. I bit DTxPSy (bit 6,7 e 14,15) permettono di impostare un prescaler per il timer associato all’unità fornendo all’utente la possibilità di impostare un fattore di divisione pari a 2, 4 o 8 rispetto alla massima frequenza (frequenza dei cicli istruzione). DTCON2 permette invece di associare una delle due unità (A o B) ad ogni uscita e su ciascuno dei due fronti (salita/discesa).
Tecniche di pilotaggio dei carichi
Uscite complementari
In figura 6 è riportata una applicazione in cui viene pilotato un carico trifase in PWM sfruttando tre coppie di uscite complementari del dsPIC30F. Ciascuna fase è pilotata da una coppia di MOS di potenza che vengono gestiti direttamente dalle uscite PWM. In questa applicazione ciascuna uscita di ogni coppia può essere pilotata in maniera indipendente o in maniera complementare. Nel primo caso l’unità Dead Time viene automaticamente disabilitata e l’utente ha il pieno controllo dello stato delle uscite. Nel secondo caso la coppia è pilotata in modo complementare e l’unità Dead Time provvede ad inserire automaticamente i ritardi opportuni affinché i due MOS non si trovino mai contemporaneamente in conduzione.
Uscite indipendenti
La figura 7 mostra il pilotaggio di un motore a quattro fasi a riluttanza variabile in cui ciascuna coppia di uscite pilota una singola fase del motore in modo indipendente. Essendo indipendenti, le singole uscite di una stessa coppia possono essere attivate anche contemporaneamente (condizione necessaria per polarizzare gli avvolgimenti di ciascuna fase).
Gestione PWM in mikroBASIC per dsPIC
Come esempio di applicazione del controllo in PWM in linguaggio ad alto livello verranno illustrate alcune routines scritte in mikroBASIC per dsPIC. Le funzioni della libreria PWM sono cinque ed in particolare:
PWM_Init
PWM_Start
PWM_Set_Duty
PWM_Stop
PWM_Calc_Period
La PWM_Init inizializza il modulo PWM e richiede quattro parametri: la frequenza desiderata (in Hertz) per il segnale PWM, la modalità di funzionamento delle quattro uscite (indipendenti o complementari), l’abilitazione delle uscite e la configurazione del prescaler/postscaler. Per la modalità di funzionamento si devono specificare 4 bit (uno per ciascuna uscita) e il valore 0 corrisponde alla modalità indipendente mentre il valore 1 a quella complementare. Il parametro per l’abilitazione delle uscite consiste in un byte in cui ciascun bit corrisponde ad una singola uscita:
<pwm4h.pwm3h.pwm2h.pwn1h.pwm4l.pwm3l. pwm2l.pwm1l>
Se un bit è a zero la relativa uscita è disabilitata (quindi funziona come I/O generico) altrimenti è una uscita PWM. Il parametro relativo al prescaler/postscaler consta di un byte i cui 4 bit meno significativi sono relativi al postscaler mentre i 4 più significativi al prescaler. La corrispondenza tra il valore del nibble e l’impostazione del prescaler/postscaler è riportata nella tabella di figura 8.
La PWM_Set_Duty permette di aggiornare il duty cycle per l’uscita desiderata. I parametri sono due word in cui la prima specifica il valore e la seconda il canale. PWM_Start avvia la generazione dei segnali PWM e non necessita di alcun parametro. Analogamente la PWM_Stop arresta il modulo PWM. Infine la PWM_Calc_Period permette di calcolare il corretto valore per il registro PTPER passando alla funzione la frequenza (in Hertz) ed il prescaler. Il calcolo del valore da inserire in PTPER viene effettuato secondo la formula
PTPER=-1+FCY(FPWM*Prescaler)
dove FCY è la frequenza del ciclo istruzione e FPWM è la frequenza desiderata per il segnale PWM.
Un esempio pratico
Come esempio pratico di applicazione in PWM si consideri lo schema di figura 9 in cui un dsPIC30F2010 pilota un motore DC monofase mediante un MOSFET di potenza.
La routine di esempio (si veda il listato 1) inizializza il modulo PWM e pilota automaticamente il motore regolandone ciclicamente la velocità da un minimo ad un massimo. La regolazione della velocità viene fatta aumentando il duty cycle il cui valore è contenuto nella variabile duty_cycle.
Program Controllo_PWM dim duty_cycle as word main: duty_cycle=0x1FF ‘attesa di 1 sec prima di avviare il motore Delay_ms(1000) ‘inizializzazione del modulo PWM: ‘ frequenza: 3KHz ‘ modalità: uscite complementari (per tutti i canali) ‘ Abilitazione: tutti i canali abilitati ‘ pre-postscale: prescaler 1:1 postscaler 1:1 PWM_Init(3000, %1111, 0xFF, 0x00) ‘impostazione del duty cycle per l’uscita 1 PWM_Set_Duty(0x000F,1) ‘avvio del modulo PWM: partenza del motore PWM_Start() ‘variazione della velocità del motore (ciclo infinito) while TRUE PWM_Set_Duty(duty_cycle,1) Delay_ms(10) Inc(duty_cycle) if duty_cycle >= 0x4FF then duty_cycle = 0xF end if wend end.
Listato 1 |
Uno dei vantaggi della PWM e’ poter gestire al meglio il consumo energetico e quindi la potenza dissipata, alternando stati di basso consumo a stati con corrente nulla.
Ciao, vorrei un consiglio su come poter simulare il circuito ed applicare il listato per poter operare sui parametri di velocità
Grazie mille