Controllo Motore in PWM con dsPIC30F

Controllo motori in PWM con DSPIC

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.

Figura 1. La struttura dell’unità Motor Control PWM del dsPIC30F

Figura 1.  La struttura dell’unità Motor Control 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.

Figura 2. La struttura del registro PTCON

Figura 2.  La struttura del registro PTCON

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.

Figura 3. Le varie modalità di funzionamento del modulo PWM

Figura 3. Le varie modalità di funzionamento del modulo PWM

 

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.

Figura 5. Struttura dei registri DTCON1 e DTCON2

Figura 5. Struttura dei registri DTCON1 e DTCON2

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.

Figura 6. Pilotaggio di un carico trifase con uscite complementari

Figura 6. Pilotaggio di un carico trifase con uscite complementari

 

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).

Figura 7. Un esempio di pilotaggio di motore a riluttanza variabile a 4 fasi

Figura 7. Un esempio di pilotaggio di motore a riluttanza variabile a 4 fasi

 

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.

Figura 8. le impostazioni del prescaler/postscaler

Figura 8.  Le impostazioni del prescaler/postscaler

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.

Figura 9. Pilotaggio di un motore in PWM con dsPIC30F2010

Figura 9. Pilotaggio di un motore in PWM con dsPIC30F2010

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

2 Commenti

  1. Maurizio Di Paolo Emilio Maurizio 29 dicembre 2015
  2. eeprom77 eeprom77 23 settembre 2016

Scrivi un commento