Generar señal PWM usando GPIO

1

Quiero generar una señal PWM de software durante 5 milisegundos. utilizando GPIO con un ciclo de trabajo del 50 por ciento y 100 KHz.

While(5ms)
{
 PIN = 1;
 delay_micro(10);
 PIN = 0;
 delay_micro(5);
 PIN = 1;
}

¿Es correcto o quiero hacer otra cosa?

    
pregunta rock_buddy

2 respuestas

1

No soy un gran fanático de las funciones de "retardo" porque retrasan todo tu programa. También hice esto recientemente y para obtener un PWM adecuado, utilicé la interrupción timer0 para alternar el pin de salida cada vez que se produce una interrupción. También puede trabajar con un ciclo de conteo, por ejemplo, la interrupción tiene que ocurrir 10 veces antes de que la salida cambie.

Aquí hay un ejemplo que me funcionó bien con una frecuencia PWM de 1kHz. (timer0 es un temporizador de 8 bits)

 
void interrupt interrupts(void) {
    if (INTCONbits.TMR0IF == 1) {           //interrupt from timer0
        TMR0 = 0x06;                        //reload timer0
        PIN1 = !PIN1;
        if (timer0_tick_count >= speed) {     //count-loop with variable speed
            timer0_tick_count = 0;

    } else {
        timer0_tick_count++;
    }

    INTCONbits.TMR0IF = 0;
}

}

    
respondido por el maikel
1

Su código incluye una cláusula while inválida, una declaración PIN = 1 redundante y el ciclo de trabajo sería 2/3, ya que espera 10us en estado activo y 5us en estado inactivo.

Suponiendo que desea utilizar avr-gcc y tener la salida en PA2, el código se vería así:

#define PRT PORTA
#define PIN PA2

while (1) {
    PRT |= 1 << PIN;
    _delay_us(5);
    PRT &= ~(1 << PIN);
    _delay_us(5);
}

Tenga en cuenta que esto no será exactamente 100 kHz debido al hecho de que la configuración del pin también llevará algún tiempo.

Como se indicó en maike1, siempre es mejor usar interrupciones o, para PWM, comparar unidades para hacer esto, ya que está ocupado esperando y no puede hacer nada más al generar un PWM.

    
respondido por el Simon

Lea otras preguntas en las etiquetas