Utilizo una resolución en el PWM de 8 bits (256 niveles de tensión). Lo que intento hacer es que estos niveles (salida PWM) varíen en el tiempo para describir una señal seno.
Primero elijo que resolución en frecuencia deseo darle a la "salida seno", es decir cuantos niveles de tensión deseas tener en un ciclo de la senoide, esto lo hago cada 5,625 grados eléctricos (el ciclo completo es 2pi=360 grados) por lo cual tendre 64 niveles distintos.
Para realizar lo anterior debo tener una salida PWM (obvio) y un timer que es el que te actualizará el valor del duty cycle de la salida.
Entonces calculo el tiempo en el que el timer debe recalcular el duty cycle de la salida.
Lla frecuencia de la seno es 60Hz por lo tanto:
el período es ------>60 Hz = (1/60)seg = 16,67 ms
esto es lo que dura un período de la seno, como lo actualizamos cada 5,625 grados tendremos 64 niveles y cada uno durará:
Tiempo del timer ----> Tt = período / 64 = 16,67 / 64 = 260,468 Useg
Estos 260 Useg es cada cuanto debes recalcular el duty cycle del PWM.
Ahora bien, para calcular este duty cycle habría que calcular el seno de 5,625 grados, el de 11,25... hasta el de 360 grados y nuevamente el seno de 5,625.....y asi eternamente, esto es muy complejo de realizar con un microcontrolador de 8 bits. Lo que se hace es colocar los 64 resultados en una tabla, e irlos leyendo con la frecuencia que te da el timer que acabamos de calcular.
Luego los valores de la tabla serán:
para 0o = ((seno 0o)*127)+127 = 127
para 5,625o = ((seno 5,625o)*127)+127 = 139,44
para 11,25o = ((seno 11,25o)*127)+127 = 151,77
.
.
para 90o = ((seno 90o)*127)+127 = 254
.
.
para 180o = ((seno 270o)*127)+127 = 127
.
.
para 270o = ((seno 270o)*127)+127 = 0
.
.
para 360o = ((seno 360o)*127)+127 = 127
...
Bien, pues mi duda es de donde sale la fórmula:
0° = ((seno 0°)*127)+127 = 127
Me explicó mejor; ¿por que al sen0° lo multiplica por 127 y le suma 127?. Y esto es en todos los cálculos.
...
En el array tengo 64 valores con una separación de 5.625 esto es: 360/5.625=64. El autor de esta teoría del inicio del post como comentario dice que habría que poner el timer0 con un retardo de 260 microsegundos para que ahí se vallan los datos del array. Así es como lo intento...
No tiene sentido hacer una tabla tan grande porque la función seno es simétrica. Puedes quitar tres cuartos de esa tabla porque son valores que se repiten, como he comentado antes.