PIC18F2550 PWM generador de onda cuadrada

0

Estoy intentando generar una onda cuadrada en un ciclo de trabajo del 50% usando mi PIC18F2550. La señal se debe emitir a través de un altavoz. La frecuencia realmente no importa, siempre que esté en el rango de audición (algunos Khz deberían hacerlo).

Este es mi código bastante simplista;

#include "xc.h"

void PWM_init(void);
void Chip_init(void);

void main(void){

Chip_init();
PWM_init();
while(1);
}
void PWM_init(void) {

/****Set All PWM Registers*****/
PR2 = 0b11111111;
T2CON = 0b00000111;
CCPR2L = 0b01111111;
CCP2CON = 0b00111100;  
}

void Chip_init(void){

/** Initialize all outputs ****/
LATCbits.LATC1 = 0;
TRISCbits.TRISC1 = 0;
LATBbits.LATB3 = 0;
TRISBbits.TRISB3 = 0;
}      

Esto debería darme una señal PWM de aproximadamente 3Khz en C1 o B3, al menos a mi entender. Pero no consigo nada, por desgracia. ¿Alguien puede decirme dónde me equivoqué?

    
pregunta TheAlPaca02

1 respuesta

0

Terminé cambiando mi código a esto. Ahora estoy recibiendo una señal PWM de 3 khz de pulsos cuadrados.

El preescalador se aumentó de 4 a 16 y asigné la mayoría de los bits individualmente. Aún no estoy 100% seguro de cuáles fueron los errores en mi código anterior.

#include <xc.h>

/*Function prototypes*/
void initChip(void);
void initPWM(void);

void main(void) {
initChip();
initPWM();
while(1);
}

void initChip(void)
{
PORTB = 0x00; //Initial PORTB
TRISB = 0x00; //Define PORTB as output
PORTC = 0x00; //Initial PORTC
TRISC = 0x00; //Define PORTC as output
INTCONbits.GIE = 0; // Turn Off global interrupt
}

void initPWM(void)
{
PR2 = 0xFF;
CCPR2L = 0x7F; // 
CCP2CONbits.DC2B0 = 0;
CCP2CONbits.DC2B1 = 0;
TRISB = 0x00; // Clear Tris registers
TRISC = 0x00;
T2CONbits.T2CKPS1 = 1; // Timer 2 Prescaler = 16
T2CONbits.T2CKPS0 = 1;
T2CONbits.TMR2ON = 1; // Enable Timer 2
CCP2CONbits.CCP2M3 = 1; // Set CCP as PWM
CCP2CONbits.CCP2M2 = 1;
}
    
respondido por el TheAlPaca02

Lea otras preguntas en las etiquetas