Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problemi PWM

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Problemi PWM

Messaggioda Foto Utentemariot91 » 20 feb 2014, 19:30

Ciao a tutti,
Ho un problema,probabilmente banale,con il modulo PWM su dsPIC 30f4011.Sto cercando di eseguire una modulazione SPWM ed ho quindi creato il mio array con i vari valori di duty cycle per modulare la sinusoide.Il mio problema è che quando tramite il PWM interrupt vado a modificare il registro PDC del duty cycle non so come attivare il livello basso del PWM.In altre parole la mia sinusoide è una semi-sinusoide.L'unico modo che mi è venuto in mente è tramite il settaggio manuale del PWM ma cosi' risulterebbe manuale anche il duty e quindi non potrei più utilizzare il mio array come da prassi.Qualcuno puo' aiutarmi o magari postarmi un esempio di una modulazione spwm da cui possa capire come gestire la cosa?
Grazie!
Avatar utente
Foto Utentemariot91
15 2
 
Messaggi: 11
Iscritto il: 24 gen 2014, 21:04

0
voti

[2] Re: Problemi PWM

Messaggioda Foto UtenteEcoTan » 20 feb 2014, 21:08

La sinusoide ha valori metà positivi e metà negativi mentre il registro PDC è inteso positivo. Ne hai tenuto conto? Forse dovresti sommare una stessa quantità fissa a tutti i valori, per renderli positivi.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[3] Re: Problemi PWM

Messaggioda Foto Utentemariot91 » 21 feb 2014, 0:52

Io avevo pensato di fare un array con soli valore positivi,per la semi onda positiva, e poi invertire l'output cambiando il PWM da H a L ma è questo passaggio che non riesco a comprendere.
Per essere più chiaro allego qui le parti principali del codice ( relativo a sinusoide da 50 Hz con 64 valori di duty cycle,ogni valore viene riassegnato al PDC1 per 5 volte e quindi in totale ho 320 assegnazioni di duty cycle in una sinusoide.Oscillatore a 7,3728 MHz,PLL=8------> frequenza PWM= 16KHz.Il valore di PTPER è quindi pari a 921 con prescaler 1:1)

int sin_table[32]={0, 183, 364, 541, 713, 879, 1036, 1183, 1318, 1441, 1550, 1644, 1722, 1784, 1828, 1855, 1864, 1855, 1828, 1784, 1722, 1644, 1550, 1441, 1318, 1183, 1036, 879, 713, 541, 364, 183};

int main(void) {
SET_FREQ = 410;
TBL_POINTER_SHIFT = 0;
TBL_POINTER_NEW = 0;
TBL_POINTER_OLD = 0;
DUTY_CYCLE = 0;


SetupPorts(); //inizializzo porte
SetupADC(); //initialize ADC
SetupParm(); //inizializzo PWM e attivo PWM interrupt

void __attribute__((__interrupt__)) _PWMInterrupt(void)
{

TBL_POINTER_NEW = TBL_POINTER_OLD + SET_FREQ;
TBL_POINTER_SHIFT = TBL_POINTER_NEW >> 11;
DUTY_CYCLE = TBL_POINTER_SHIFT;


if(DUTY_CYCLE == 32){ //ok è qui che dovrei invertire l'uscita del PWM da H a L ma per ora ho soltanto riazzerato non sapendo come fare ma ho notato che comunque anche la semisinusoide presenta qualche problema


TBL_POINTER_SHIFT = 0;
TBL_POINTER_NEW = 0;
TBL_POINTER_OLD = 0;
DUTY_CYCLE = 0;
}

PDC1 = sin_table[DUTY_CYCLE];
TBL_POINTER_OLD = TBL_POINTER_NEW;
PTMR=0;
PTCONbits.PTEN=1;
IFS2bits.PWMIF = 0; //Clear PWM Interrupt Flag


}


while (1)
{

}
return 0;
}
Avatar utente
Foto Utentemariot91
15 2
 
Messaggi: 11
Iscritto il: 24 gen 2014, 21:04

0
voti

[4] Re: Problemi PWM

Messaggioda Foto UtenteEcoTan » 21 feb 2014, 12:56

mariot91 ha scritto:un array con soli valore positivi,per la semi onda positiva, e poi invertire l'output cambiando il PWM da H a L

I valori non debbono partire da zero, bensì da PTPER/2 e non devono superare PTPER.
Il pin di Digital Output non è che può dare tensioni negative, alla fine quella che si vuole ottenere non è propriamente una sinusoide bensì una sinusoide traslata nel campo positivo.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[5] Re: Problemi PWM

Messaggioda Foto Utentemariot91 » 21 feb 2014, 14:14

Grazie mille per la dritta.Ho capito il discorso dell'array che non parte da 0 ma non ho capito perché non deve superare PTPER.Io avevo considerato che non doveva superare il valore di PDC corrispondente al 100% di duty cycle e lo avevo calcolato come: PDC= [duty% (2^risoluzione - 1)]/100. perché invece è il registro PTPER a non dover essere superato?Non capisco il nesso tra un valore temporale per il match del periodo PWM qual è PTPER e il valore dell'array.
Grazie per l'aiuto=)
Avatar utente
Foto Utentemariot91
15 2
 
Messaggi: 11
Iscritto il: 24 gen 2014, 21:04

0
voti

[6] Re: Problemi PWM

Messaggioda Foto UtenteEcoTan » 21 feb 2014, 15:48

Non conosco il dspic30, forse il timer conta "up and down" quindi il periodo raddoppia. A parte il fattore 2, risoluzione e periodo non sono la stessa cosa?
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[7] Re: Problemi PWM

Messaggioda Foto Utentemariot91 » 21 feb 2014, 19:09

Nel mio caso PTPER=921 con prescaler 1:1 per avere una frequenza PWM di 16KHz.Da qui la risoluzione è quindi pari a [ log(2Tpwm/Tcy)]/log2 e il valore di PDC a cui corrisponde il 100% di duty è quindi pari a 1864.Dato che i valori dell'array vanno ad aggiornare il PDC e cioè il valore del duty cycle io ho impostato l'array in modo da non superare 1864 nel PDC, cioè il 100% di duty.
Sicuramente c'è qualcosa che mi sfugge perché non riesco a capire il nesso tra il valore del PTPER e i valori dell'array che vanno ad aggiornare il duty cycle :/
Avatar utente
Foto Utentemariot91
15 2
 
Messaggi: 11
Iscritto il: 24 gen 2014, 21:04

1
voti

[8] Re: Problemi PWM

Messaggioda Foto Utentec1b8 » 22 feb 2014, 0:55

Per quanto posso capire dal datasheets del PIC farei in questo modo:
- i valori possibili per il registro PDC vanno da 0 (duty cycle=0%) a PTPER*2 (duty cycle=100%)
- la semioda positiva ha valori di duty cycle che variano dal 50% (PDC=PTPER) al 100% (PDC=PTPER*2)
- per generare la semionda negativa devi: leggere l'array al contrario ed impostare il PDC con il valore pari a PTPER*2-valore_array

Supponendo quindi un array di 32 elementi e PTPER pari a 921 avrai:

int sin_table[32]={921, 1011, 1101, 1188, 1273, 1355, 1433, 1505, 1572, 1633, 1687, 1733, 1772, 1802, 1824, 1838, 1842, 1838, 1824, 1802, 1772, 1733, 1687, 1633, 1572, 1505, 1433, 1355, 1273, 1188, 1101, 1011}

La semionda positiva la ottieni leggendo l'array dall'elemento 0 al 31 e assegnado il valore dell'array al PDC.
La semionda negativa la ottieni leggendo l'array dall'elemento 32 allo 0 e assegnado a PDC il valore 1842-(valore_array)
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[9] Re: Problemi PWM

Messaggioda Foto Utentemariot91 » 22 feb 2014, 18:47

Grazie mille per l'aiuto!!lunedi' vado all'università a provare con un oscilloscopio =)
Avatar utente
Foto Utentemariot91
15 2
 
Messaggi: 11
Iscritto il: 24 gen 2014, 21:04

0
voti

[10] Re: Problemi PWM

Messaggioda Foto Utentec1b8 » 8 mar 2014, 20:39

Non ho più sentito nulla... sei riuscito a fare qualche prova? Come è andata a finire?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti