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++;
}