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ápido posible, para su más fácil para atenuar en el filtro.
Hasta ahora, mi uC se está ejecutando en 8MHz usando el oscilador RC interno (planeo mudarme a un cristal más tarde en tomar este paso una vez). Esto me proporciona un máx. PWM de frecuencia de base de 8M/256 (modo PWM rápido) = 31.25 kHz.
A mi las actualizaciones del programa el ciclo de trabajo siempre que timer0 se desborda es decir, cada 32uS (creo que... desde 1/31250 = 32uS). Mi pregunta ahora es, ¿cómo puedo 'control' de la frecuencia real de la onda sinusoidal? Fácilmente se puede frenar por prescaling pero que, obviamente, sería hacer la base freq. bastante baja.
He incluido mi código de abajo: 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++;
}