EJ_04_PWM_Timer

Re: EJ_04_PWM_Timer

de Eduardo Iriarte -
Número de respuestas: 0
Hola Enzo
Ambas observaciones son muy atinadas. Hay dos causas distintas:
1-La construcción de la tabla y la función seno(). No están bien ajustadas.
Para hacer un ajuste fino de la generación de función seno hice una prueba de escritorio "a escala" con una función seno con un período discretizado en 20 elementos en vez de 200.
  • En vez de una tabla de 50 elementos, utilicé 5.
  • Defino Npi2 = 5, Npi = 10, N2pi=20, donde Npi es el N para pi/2, y Npi es N para pi, y N2pi es N para 2*pi
  • Construí la tabla de 5 elementos para el 1er cuadrante, con índice 0 para 0 grados y 5 para 90 grados
t(0) t(1) t(2) t(3) t(4) t(5)

La función completa tendrá 20 elementos, que irán desde s(0) a s(19). En las siguientes líneas se representa la función s(x),y abajo los valores de la tabla que le corresponden por conversión de cuadrantes.
s(0) s(1) s(2) s(3) s(4) s(5) s(6) s(7) s(8) s(9) s(10) s(11) s(12) s(13) s(14) s(15) s(16) s(17) s(18) s(19) s(20) s(21)...
t(0) t(1) t(2) t(3) t(4) t(5) t(4) t(3) t(2) t(1) t(0) -t(1) -t(2) -t(3) -t(4) -t(5) -t(4) -t(3) -t(2) -t(1)  t(0)  t(1) ...
En esta nomenclatura abreviada, t(0) es senoOFFSET+tabla[0], y -t(4) es senoOFFSET-tabla[4]
Observar que s(5) es el máximo, s(6)=s(4), s(10)=s(0), s(15) es el mínimo, s(16)=s(14) y llega a s(19),luego se repite el ciclo
Como se observa en la correspondencia entre s( ) y t( ):
Si i>=20 i=i-20 Este ajuste es para argumentos mayores o iguales que 20, pues s(20)=s(0). (No es necesario iterar porque el rango de "i" nunca llega a 4pi.)
Si i entre 0 y 5 (0 : seno(i)=t(i)
Si i entre 6 y 10: seno(i)=t(10-i)
Si i entre 11 y 15: seno(i)=-t(i-10)
Si i entre 16 y 19: seno(i)=t(20-i)

Comprendido el procedimiento, llevo esto a 51 elementos. Con Npi2=50 la tabla irá de t(0) a t(50), la función seno tendrá 200 elementos, de s(0) a s(199)
Con ese ajuste se cumple exactamente que con OCR0A=199, prescaler x8, modo 2 de TMR0 (CTC OCRA), la interrupción  ocurre cada 100 us
Es decir 200 elementos x 100 us = 20 ms -> 50 Hz exactos.
2- La segunda observación, que la Frecuencia que mide el frecuencímetro es menor que la esperada, tiene que ver con que la función seno(x) del ejemplo llega a superar el valor de ICR1. Esto hace que el duty cycle llegue al 100%, y deja de haber onda rectangular en los máximos de la función seno.
Como senoOFSET = 500 y senoAMPLITUD=500, la función llega a valer 1000, superando a ICR1 que es 999
Se soluciona haciendo senoAMPLITUD menor, por ejemplo senoAMPLITUD=498
Siempre debe ser: 0 < (senoOFFSET+senoAMPLITUD) < ICR1
Les dejo el ejemplo 04 "afinado"