Problemas con PWM y PIC18F4550 (XC8)

Tengo un problema con el pic, no me manda bien la señal de pwm, no la arroja bien mediante el pin que estoy usando, esa señal la mando al integrando L923D.
Código:
#define M1 LATAbits.LATA1
#define M2 LATAbits.LATA2

#define SI1 PORTBbits.RB2
#define SI2 PORTBbits.RB3

//#define minitAllSwitches()  TRISBbites. TRISB4=1; TRSIBbites; TRISB5=1;
void Configurar_PWM (void);
void main (void)

{
  ADCON1 |=0x0F; //es para poner todos los pines a digital oxof para hexadesimal
    PORTA=0x00; //puertos A salidas de los leds
    TRISA=0B00000000; //numero binario para k las patas de A esten apagadas
    TRISB=0xFF;
    TRISC=0x00;
    PORTC=0B00000000;
  //  minitAllSwitches();
    Configurar_PWM();

  

    while (1)

{
    
M1 = PORTCbits.RC2; 
    if (SI1==0 && SI2==0)
        {    
    CCPR1L = 0;    
    
        }

    if (SI1==1 && SI2==0)
        {    
    CCPR1L = 150;    
    
        }





    if (SI1==0 && SI2==1)
        {    
    CCPR1L = 75;    
    
        }

}

}
void Configurar_PWM(void)
{
 TRISCbits.TRISC2 = 0;
 PR2 = 0xFF;
 CCP1CON= 0x0c; 
CCPR1L = 0; 
//CCPR1L= 0x80;
// CCPR1L = 200; 
T2CON = 0x05;
T2CONbits.TMR2ON=1;
}
 
Última edición por un moderador:
Hola.

Hace poco también me estuve peleando con el PWM en XC8. Mi problema fue que usaba valores de "ciclo de trabajo" muy altos para la frecuencia tan rápida que configuré, y siempre se me quedaba todo a nivel alto.

En XC8 me estoy acostumbrando a usar la Peripheral Library (tienes un PDF muy completo aunque algo extraño de leer en C:\Archivos de programa\Microchip\xc8\v1.30\docs\MPLAB_XC8_Peripheral_Libraries.pdf), que para el uso de los periféricos es dispone de unas macros muy cómodas para programar (te olvidas un poco de los registros cuando no hay ganas de comprobar qué bit era el que hacía tal cosa). Aquí va mi código.

Código:
#include <xc.h>         // XC8 General Include File
#include <plib/pwm.h>   // PWM outputs
#include <plib/timers.h>

#define _XTAL_FREQ 4000000 // Default internal oscillator frequency

#include <config.h> // Configuration bits

int iter;
#define per 100
#define maxiter 200
#define MAXPWM 4*per
#define WAIT 50



/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/
void main(void)
{
    // Configuration
    TRISC = 0b11110011; //Coil in RC2 (PWM) and RC3
    LATCbits.LATC3 = 0; // Let it float

    OpenTimer2(T2_PS_1_16);  //prescale 16
    OpenPWM1(per); //Open PWM at 1kHz???

    // Never ending loop
    while(1)
    {   
        iter = maxiter;

        //first coil direction
        while (iter > 0)
        {
            //position
            SetDCPWM1(iter); //Set PWM "duty cycle"
            LATCbits.LATC3 = 0;
            __delay_ms(WAIT);
            iter--;
        }

        //second coil direction
        while (iter < maxiter)
        {
            //position
            SetDCPWM1(MAXPWM-iter);
            LATCbits.LATC3 = 1;
            __delay_ms(WAIT);
            iter++;
        }
    }
}

Lo utilicé para probar el posicionamiento de la una lente de CD, alimentando una bobina para tal efecto (usando el mismo driver para motores que usas tú). A un pin de la bobina le asigno la señal PWM, y a la otra un 1 o un 0 para invertir el sentido del movimiento.

Espero que te sirva.

Saludos.
 
Atrás
Arriba