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!
Problemi PWM
Moderatore:
Paolino
10 messaggi
• Pagina 1 di 1
0
voti
[2] Re: Problemi PWM
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.
0
voti
[3] Re: Problemi PWM
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;
}
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;
}
0
voti
[4] Re: Problemi PWM
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.
0
voti
[5] Re: Problemi PWM
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=)
Grazie per l'aiuto=)
0
voti
[7] Re: Problemi PWM
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 :/
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 :/
1
voti
[8] Re: Problemi PWM
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)
- 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
0
voti
[9] Re: Problemi PWM
Grazie mille per l'aiuto!!lunedi' vado all'università a provare con un oscilloscopio =)
10 messaggi
• Pagina 1 di 1
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 7 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



