aiuto PWM

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #1 da Guido
aiuto PWM è stato creato da Guido
Come sempre ho bisogno del vostro aiuto e competenza, sto lavorando sul segnale PWM, ho capito come settatre (trovare) la frequenza, non riesco a far uscire il segnale alla pressione di RB4.
Da subito sono partito col codice trovato in STEP by STEP(funziona bravo Laurenti), il problema è che funziona sempre.
Vi scrivo il codice:

Code:
# include <p18f4550.h> //# include <pwm.h> //# include <timers.h> #include <portb.h> #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF //OSC = HS Impostato per lavorare ad alta frequenza //WDT = OFF Disabilitato il Watchdog Timer //LVT = OFF Disabilitato programmazione LVT //PBADEN = OFF Disabilitato gli ingrassi analogici void High_Int_Event (void); //Prototipo di funzione basa priorità #pragma code high_vector = 0x08 void high_interrupt (void) { _asm GOTO High_Int_Event _endasm } #pragma code #pragma interrupt High_Int_Event void High_Int_Event (void) { //Funzione x la gestione dell'interrupt bassa priorità int i; // Indice x il ciclo di pausa if ( INTCONbits.RBIF == 1 ) //Controllo che l'interrupt sia stato generato da PORTB if ( PIR1bits.TMR2IF ==1) { for (i=0; i<10000; i++) { //Pausa filtraggio spike } if (PORTBbits.RB4 == 0) { //Controllo la pressione di RB4 LATCbits.LATC1 = ~ LATCbits.LATC1 ; //Accendo il Led 1 } INTCONbits.RBIF == 0; //Resetto il flag PIR1bits.TMR2IF = 0; // Resetto il flag } } void main (void) { int i; //Variabile usata per creare un conteggio fittizio di pausa // unsigned char period; //Periodo del segnale pwm int duty_cycle = 0; //Duty Cycle //Imposto PORTA tutti ingrrssi LATA = 0x00; TRISA = 0xFF; //Imposto PORTB tutti ingrrssi LATB = 0x00; TRISB = 0xFF; //Imposto PORTC tutti ingressi ad RC1 come uscita LATC = 0x00; TRISC = 0b11111101; //Imposto PORTD tutte uscite LATD = 0x00; TRISD = 0x00; //Imposto PORTE tutti ingrrssi LATE = 0x00; TRISE = 0xFF; //T2CON | = 56;// bits 6-3 Post scaler 1:1 thru 1:16 //T2CONbits.TOUTPS3 = 0; //T2CONbits.TOUTPS2 = 1; //T2CONbits.TOUTPS1 = 1; //T2CONbits.TOUTPS0 = 1; //T2CONbits.TMR2ON = 1;// Timer2 on bit: 1=Timer2 is on; //T2CONbits.T2CKPS1 = 0;// bits 1-0 Prescaler Rate Select bits //T2CONbits.T2CKPS0 = 1; T2CON = 0b00111101; PR2 = 252; // PR2 (Timer2 Match value) // OpenTimer2 (TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_8 ); //Apro il timer2 per il pwm //period = 252; //249Imposto una frequenza di 20KHz //OpenPWM2 (period); //Apro il modulo pwm PIE1bits.TMR2IE = 1; //Abilito le interruzioni del timer2 IPR1bits.TMR2IP = 1; //Abilito le interruzioni del Timer come alta priorità //Abilito le interruzioni RCONbits.IPEN = 0; //1Abilito interruzioni alta e bassa priorità INTCONbits.GIE = 1; //Abilito gli interrupt ad alta priorità INTCONbits.PEIE = 1; //1Abilito gli interrupt delle periferiche while (1) { //Ciclo infinito SetDCPWM2 (500); //Aggiorno il duty cycle } }

Grazie
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Ricky85
  • Anziano Utente
  • Anziano Utente
Di più
14 Anni 1 Mese fa #2 da Ricky85
Risposta da Ricky85 al topic Re: aiuto PWM
Ciao Guido,

Non ho capito quale effetto vorresti avere... se ti spieghi iù precisamente posso provare a darti una mano...

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
14 Anni 1 Mese fa #3 da Guido
Risposta da Guido al topic Re: aiuto PWM
Si e ti ringrazio, voglio semplicemente che alla pressione del pulsante esca la frequenza settata col segnale PWM. Ho bisogno che mi modifichi il codice che ho scritto (copiato ) e trasformato.
Grazie

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
14 Anni 1 Mese fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: aiuto PWM
Ciao Guido,

Il programma sopra riportato non è molto chiaro.
Stai usando troppe cose assieme, Timer e PWM.
Tutte le istruzioni del PWM sono commentate quindi il PWM non è attivo.
Non ho controllato cosa accade al timer e se effettivamente genera le interruzioni.

In ogni modo quando hai il PWM abilitato l'uscita non la devi controllare (invertendola manualmente) , il modulo PWM la controllerà automaticamente. Questo è il vantaggio di avere il modulo PWM, ovvero imposti tutto e non devi fare altro.

Devi chiarire l'esempio. Lasciando cosi tanti commenti non è più chiaro.
Non modificare troppo gli esempi, cerca di fare sempre tutto in maniera progressiva. Un salto troppo grande porta solo confusione. In questi giorni hai imparato molto, ma non forzare l'arrivo all'obbiettivo.

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Guido
  • Autore della discussione
  • Platino Utente
  • Platino Utente
Di più
14 Anni 1 Mese fa - 14 Anni 1 Mese fa #5 da Guido
Risposta da Guido al topic Re: aiuto PWM
Salve, mi spiace deluderti ma non ci arrivo, continua a lampeggiarmi il led. Voglio che lampeggi solo alla pressione del pulsante. Dove sbaglio?

Code:
# include <p18f4550.h> # include <pwm.h> # include <timers.h> #include <portb.h> #pragma config FOSC = HS #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PBADEN = OFF #pragma config CCP2MX = ON //OSC = HS Impostato per lavorare ad alta frequenza //WDT = OFF Disabilitato il Watchdog Timer //LVT = OFF Disabilitato programmazione LVT //PBADEN = OFF Disabilitato gli ingrassi analogici //CCP2MX = ON il modulo CCP è posto su RC1 void High_Int_Event (void); //Prototipo di funzione basa priorità #pragma code high_vector = 0x08 void high_interrupt (void) { _asm GOTO High_Int_Event _endasm } #pragma code #pragma interrupt High_Int_Event void High_Int_Event (void) { //Funzione x la gestione dell'interrupt alta priorità int i; // Indice x il ciclo di pausa unsigned char period; //Periodo del segnale pwm if (( INTCONbits.RBIF == 1 ) & (PIR1bits.TMR2IF ==1)) { //Controllo che l'interrupt sia stato generato da PORTB for (i=0; i<10000; i++) { //Pausa filtraggio spike } if (PORTBbits.RB4 == 0) { //Controllo la pressione di RB4 LATCbits.LATC1 = 1 ; //Accendo il Led 1 } INTCONbits.RBIF = 0; //Resetto il flag PIR1bits.TMR2IF = 0; // Resetto il flag } } void main (void) { int i; //Variabile usata per creare un conteggio fittizio di pausa unsigned char period; //Periodo del segnale pwm int duty_cycle = 0; //Duty Cycle //Imposto PORTA tutti ingrrssi LATA = 0x00; TRISA = 0xFF; //Imposto PORTB tutti ingrrssi LATB = 0x00; TRISB = 0xFF; //Imposto PORTC tutti ingressi ad RC1 come uscita LATC = 0x00; TRISC = 0b11111101; //Imposto PORTD tutte uscite LATD = 0x00; TRISD = 0x00; //Imposto PORTE tutti ingrrssi LATE = 0x00; TRISE = 0xFF; EnablePullups (); //Abilito resistori di pullups INTCONbits.RBIE = 1; //Abilito le interruzioni su PORTB INTCON2bits.RBIP = 1; //Abilito le interruzioni su PORTB come alta priorità OpenTimer2 (TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_8 ); //Apro il timer2 per il pwm period = 252; //249Imposto una frequenza di 20KHz OpenPWM2 (period); //Apro il modulo pwm PIE1bits.TMR2IE = 1; //Abilito le interruzioni del timer2 IPR1bits.TMR2IP = 1; //Abilito le interruzioni del Timer come alta priorità //Abilito le interruzioni RCONbits.IPEN = 0; //Abilito interruzioni alta priorità INTCONbits.GIE = 1; //Abilito gli interrupt ad alta priorità INTCONbits.PEIE = 1; //1Abilito gli interrupt delle periferiche while (1) { //Ciclo infinito SetDCPWM2 (500); //Aggiorno il duty cycle } }
Ultima Modifica 14 Anni 1 Mese fa da Mauro Laurenti.

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi