Frecuencia de onda sinusoidal frente a frecuencia PWM (AVR)

5

Estoy usando un AVR Mega 168 para generar una onda sinusoidal a través de la modulación de ancho de pulso. Mi objetivo es generar una onda sinusoidal con una frecuencia de aproximadamente 50 Hz. Entiendo que la frecuencia PWM debe ser lo más rápida posible para que sea más fácil de atenuar en el filtro.

Hasta ahora, mi µC se está ejecutando a 8 MHz usando el oscilador RC interno (planeo moverme a un cristal más adelante, dando un paso cada vez). Esto me proporciona una frecuencia base de PWM máxima de 8x10 6 / 256 (modo PWM rápido) = 31.25 kHz.

Mi programa actualiza el ciclo de trabajo cada vez que el temporizador0 se desborda, es decir, cada 32 µS (creo ... desde 1/31250 = 32 µS).

Mi pregunta ahora es, ¿cómo puedo "controlar" la frecuencia de la onda sinusoidal real? Puedo disminuir la velocidad fácilmente al realizar la preescala pero eso obviamente hace que la frecuencia base sea bastante baja.

He incluido mi código a continuación:

uint8_t i=0;


int main(void)
{
     int ipwm;

     DDRD = 0xFF;

     TCCR0A = 0b10000011;
     TCCR0B = (1 << WGM12);

     TIMSK0 |= (1 << TOIE0);
     TIFR1 |= (1 << OCF0A);
     TCCR0B = (1 << CS10);
     TCNT0 = 0;

     OCR0A = 128;

     sei();

     for(;;)
     {

     }

     return 1;
}

 ISR(TIMER0_OVF_vect)
 {
    OCR0A=pgm_read_byte(&sinewave[i]); // update duty cycle
    i++;
 }
    
pregunta Saad

1 respuesta

11

El 31.25kHz es 625x tu 50Hz. Así que todo lo que tiene que hacer es crear una tabla de búsqueda de seno de 625 entradas y, en cada interrupción, establezca el valor de comparación de su salida en la siguiente entrada de la tabla. Si tiene una interrupción de 32 \ $ \ mu \ $ s, habrá corrido sobre la tabla completa (= ciclo sinusoidal completa) cada 625 x 32 \ $ \ mu \ $ s = 20 ms, por lo que serán sus 50 Hz.

    
respondido por el stevenvh

Lea otras preguntas en las etiquetas