Pagina 1 di 1
Problemi PWM

Inviato:
20 feb 2014, 19:30
da mariot91
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!
Re: Problemi PWM

Inviato:
20 feb 2014, 21:08
da EcoTan
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.
Re: Problemi PWM

Inviato:
21 feb 2014, 0:52
da mariot91
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;
}
Re: Problemi PWM

Inviato:
21 feb 2014, 12:56
da EcoTan
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.
Re: Problemi PWM

Inviato:
21 feb 2014, 14:14
da mariot91
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=)
Re: Problemi PWM

Inviato:
21 feb 2014, 15:48
da EcoTan
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?
Re: Problemi PWM

Inviato:
21 feb 2014, 19:09
da mariot91
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 :/
Re: Problemi PWM

Inviato:
22 feb 2014, 0:55
da c1b8
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)
Re: Problemi PWM

Inviato:
22 feb 2014, 18:47
da mariot91
Grazie mille per l'aiuto!!lunedi' vado all'università a provare con un oscilloscopio =)
Re: Problemi PWM

Inviato:
8 mar 2014, 20:39
da c1b8
Non ho più sentito nulla... sei riuscito a fare qualche prova? Come è andata a finire?