TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pantera en 17 de Octubre de 2006, 17:31:51

Título: Interrupcion PWM e Intterrupcion del TIMER1 o TIMER2 ?
Publicado por: pantera en 17 de Octubre de 2006, 17:31:51
Hola me gustaria ver si pueden ayudarme con este problema que tengo, o al menos aclarme si lo que digo esta bien o mal ? o algo asi

OBJETIVO:
Necesito programar un PWM en CCP1 y cuando terminer de contar el PWM atender una interrupcion por desvordamiento correspondiente del Timer. 

PREGUNTAS:
¿Primero puede acerse al reves que comience el bajo el PWM y despues lo ponga en alto y cuando baje atienda la interrupcion?

DUDAS:
Se que el  el cambio del pin (Alto a Bajo) lo hace cuando PR2 coincide con la parte alta del TIMER2 y que:

Periodo = [PR2+1]*4*Tosc* Valor_PredivisorTMR2

esto en C seria.

Código: C
  1. setup_ccp1(CCP_PWM);   // Configure CCP1 as a PWM
  2.              setup_timer_2(T2_DIV_BY_16, 1, 1);
  3.  
  4.         while (true){
  5.                 set_pwm1_duty(value);
  6.         }

De la ayuda

Código: C
  1. setup_timer_2 (mode, period, postscale)
  2.  
  3. mode: [PREDIVISOR EN LA FRECUENCIA]
  4. T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
  5.  
  6. period: [NO ENTIENDO BIEN]
  7. Es un valor int 0-255 que determina cuando el reloj del timer es reseteado.  
  8. //El el valor inicial despues del desvordamiento?
  9.  
  10. postscale:[POSTDIVISOR EN LA FRECUENCIA Solo para la intenrrupcion?]
  11. Es un numero de 1-16 que determina cuantos tiempos de reset hay antes de una interrupcion
  12. //[Division en la frecuencia]
  13. //Si pongo 1 la primera ves que se desvorde va y atiende la interrupcion.
  14. //Si pongo 2 la segunda ves que se desvorde va y atiende la interrupcion. y etc hasta 16

Por lo tanto
La temporizacion, perido, que esperaría seria en el PWM seria: ?

Primero ese es el reloj que estoy utilizando, Pero el Crital que tengo es de 12 Mhz. Uso el de 48 Mhz para los calculos ?
(tengo los fuses para USB).

Código: Ada
  1. #use delay(clock=48000000)
  2. Temporizacion = 4 * Tos *  Valor_PredivisorTMR2 * PR2
  3. Temporizacion = 4 * 48M *10^-1 * 16 * PR2
  4. Temporizacion = 4 * 2.083 E-8 * 16 * PR2
  5. Temporizacion = 1.33 E-6 * PR2

Pero donde establesco el PRS en CCS ?

Luego solo tendria que atender la interrupcion TIMER2

De antemano les agradesco, por la leida de todo lo que escribi.

GRACIAS


Título: Re: Interrupcion PWM e Intterrupcion del TIMER1 o TIMER2 ?
Publicado por: Mario en 17 de Octubre de 2006, 20:16:09
No se mucho de C pero, no creo que puedas usar eso que quieres.

La condición (tengo entendido) de la bandera de interrupción se cumple cuando PR2=TMR2 y eso es cuando se termina la frecuencia, no cuando termina el ciclo de trabajo (página 136 y 146 del manual).

No creo recomedable que tomes como muestra ese periodo, tu frecuencia para PWM.

Por lo general se establece un tiempo global para el programa y en base a éste se hacen los cálculos.

Por ejemplo:
Llamar a la rutina cada 10 milisegundos o 100 milisegundos (depende de tu aplicación) y ejecutar el código PID. Si tu rutina arroja valores diferentes, se hará la corrección necesaria; si no hay correcciones, produce la salida anterior.
No pierdes tiempo porque tu PWM es en hardware, solo espera a que termine el periodo y se carga con el nuevo ciclo de trabajo; si tu PWM ya está corriendo, aunque modifiques los CCPRxL y CCPxCON<5,4>, el ciclo de trabajo anterior sigue y después que termina, se inicia con la nueva (en tu caso solo CCPR1L porque usas 8 bits y un solo canal).

Así es como he visto que plantean éste tipo de códigos.

Espero no aguarte la idea.
Título: Re: Interrupcion PWM e Intterrupcion del TIMER1 o TIMER2 ?
Publicado por: Mario en 17 de Octubre de 2006, 20:17:16
Una cosa mas:
Solo puedes usar el Timer 2 con el PWM, el 1 no.