EJ_04_PWM_Timer

EJ_04_PWM_Timer

by Enzo Gabriel TELLO -
Number of replies: 1

Hola pofe, en este ejemplo de generación de una onda senoidal, no entiendo muy bien el cálculo que hace para determinar la frecuencia de la onda seno 50Hz. 

Este es el cálculo que hago yo:

Yo entiendo que por cada ciclo de la onda seno el OCR1A cambia 199 veces.

OCR1A cambia cada  100 x 0.5 useg = 0.00005 seg

Entonces 199x0.00005=0.00995 seg es el tiempo que demora en recorrer los 199 valores de la onda seno.

Frecuencia=1/0.00995=100,5 Hz.

También me da duda, en el proteus porque el frecuencímetro no muestra 16000Hz, ya que esta es la fecuencia de PWM para ICR=1000-1.


In reply to Enzo Gabriel TELLO

Re: EJ_04_PWM_Timer

by Eduardo Iriarte -
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"