Autor Tema: Contar pulsos y mostrar duty lcd  (Leído 3387 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Contar pulsos y mostrar duty lcd
« en: 17 de Junio de 2016, 17:18:36 »
Consulta tengo una señal que viene del Lm2907 un tren de pulsos y quisiera medir la cantidad de pulsos por segundo y el duty de la señal para mostrar ambos valores en un lcd,  hay algún ejemplo ya que probé varios y no logro hacer que funcione.
« Última modificación: 18 de Junio de 2016, 10:04:50 por callecuatro1976 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar pulsos y mostrar duty lcd
« Respuesta #1 en: 18 de Junio de 2016, 16:58:54 »
hay algún ejemplo ya que probé varios y no logro hacer que funcione.

Y si en ves de buscar ejemplos, se piensa como se hacen o como funcionan?

Por ejemplo, con el CCP detectar los flancos, La diferencia de eso te va a dar el ancho del pulso. el tema es que lo toma del Timer1, pero supongmaos que fuera todo de 8 bits. Se produce una interrupcion del CCP, y queda registrado un 40, pasa el tiempo y luego otra interrupcion y queda registrado un 50, Cuanto tiempo paso? 10 ciclos? 10 + 256? 10 + 512?
Asi que hay que tener en cuenta tambien cuantas veces el Timer produce un overflow, es decir tenes que estar antento a la interrupcion tambien del Timer.

Luego que tenes el numero de ciclos y cantidad de veces que se produjo el overflow del timer, procedes a calcular tu tiempo. Esto es de solo una parte del pulso, es decir el Alto o bajo. Luego tenes que hacer lo mismo para la otra parte y con los 2 tiempos ( en ciclos o en segundos ) obtener el duty

Tambien podrias hacer que al entrar el CCP aumente una variable en 1. De esa forma Usando otro Timer, y por ejemplo tomar un tiempo de 0.1s podrias contar cuantos cambios de ciclo hubo en ese tiempo. Los cambios de ciclo dividido 2 te van a dar la cantidad de pulsos en 0.1s, esto lo llevas a 1 segundo multiplicandolo por 10.  Y ahi tenes tu Contador de pulsos por segundo.
Si podes actualizar la lectura con diferencias de segundos, entonces podes esperar 10 interrupciones del timer de 0.1s y no te hace falta multiplicar por 10.

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #2 en: 19 de Junio de 2016, 16:04:16 »
Muy buena explicación voy a probar lo que decir,  pero con un ejemplo se hace más fácil, saludos

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #3 en: 23 de Junio de 2016, 17:41:51 »
hasta aca voy muy bien puedo contar los pulsos lo que no se como hacer es medir el duty de la señal y mostrarlo en porcentaje, como hago ?
« Última modificación: 24 de Junio de 2016, 21:42:34 por callecuatro1976 »

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #4 en: 24 de Junio de 2016, 17:15:22 »
#include <16f883.h>
#device ADC=10
#use delay (internal = 8MHz)
#define use_portb_lcd true
 #fuses NOFCMEN, NOIESO,INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,
#include <lcd.c>

int16 tiempo,tiempo2, tic,f;
int duty;
float T,Periodo;
#int_CCP1
void  CCP1_isr(void)
{
tiempo=ccp_1;
tic=tiempo-tiempo2;
tiempo2=tiempo;

}

void main()
{
 setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
 setup_ccp1(CCP_CAPTURE_RE);
 enable_interrupts(INT_CCP1);
 enable_interrupts(GLOBAL);

 lcd_init();

while (true){
 
 
 T=4.0*8.0/8000000.0;
 
   Periodo=T*tic;
   
   F=1/Periodo;
 
   
     lcd_gotoxy(1,2);
   printf(lcd_putc,"d=%02lu",tic);
   
   
     lcd_gotoxy(9,2);
   printf(lcd_putc,"F=%03lu",F);
 
}
}

este código me resulto bien mide perfecto los pulsos pero cuando deja de haber pulsos no regresa a cero y el problema que tengo que no puede resolver es como transformo el tiempo del periodo en   duty en porcentaje en el lcd si alguien me puede explicar como se hace el calculo o algún ejemplo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar pulsos y mostrar duty lcd
« Respuesta #5 en: 24 de Junio de 2016, 19:10:24 »
Citar
como transformo el tiempo del periodo en   duty en porcentaje

https://en.wikipedia.org/wiki/Duty_cycle

Citar
pero cuando deja de haber pulsos no regresa a cero

Defini un maximo, si lo minimo es de 50hz , entonces tu maximo seria un poco mas de 20ms, ( 22ms ) si supera esa cantidad es por que no hay pulsos.
O si en el segundo que tomaste para la frecuencia no supero la cantidad de cambios entonces no midas el duty.

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #6 en: 24 de Junio de 2016, 19:52:39 »
Y como seria el código del duty?
Duty=(t/periodo)*100

Y como defino máximo para que quede en cero después de contar un pulso?
« Última modificación: 24 de Junio de 2016, 20:06:26 por callecuatro1976 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar pulsos y mostrar duty lcd
« Respuesta #7 en: 24 de Junio de 2016, 20:50:34 »
Duty = Tiempo on * 100 / ( Tiempo on + Tiempo off )

Observa que no necesitas el TIEMPO en segundos, sino que puede ser interupciones o la cuenta que llevas. Ejemplo:

Detecto Flanco ascendente , el CCP guarda el numero 200
Detecto Flanco descendente , el CCP guarda el numero 300
Detecto Flanco ascendente , el CCP guarda el numero 500

Tiempo ON = 300 - 200 = 100
Tiempo OFF = 500 - 300 = 200

Duty = 100 * 100 / ( 100 + 200 ) = 33.333333

Duty = 33%


Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #8 en: 24 de Junio de 2016, 21:23:11 »
Osea usando mi código sería
Duty=tiempo*100/(tiempo+tiempo2)

Sería así?
« Última modificación: 24 de Junio de 2016, 21:41:09 por callecuatro1976 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar pulsos y mostrar duty lcd
« Respuesta #9 en: 25 de Junio de 2016, 01:02:19 »
No, va a ser:

Duty=tic*100/(tic+tic2)

Siendo tic, el valor de cuando se detecte un flanco descendente y tic2 cuando se detecte un flanco ascendente. Usando tu codigo y obviamente el extra de revisar que flanco es cual para saber si es tiempo en 1 o en 0.

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #10 en: 25 de Junio de 2016, 08:10:30 »
me hice una ensalada me falta el ultimo empujón y arranco ya logre poner un poco en su lugar las cosas me falta el duty que mide cualquier cosa
 

#include <16f883.h>
#device ADC=10
#use delay (internal = 8MHz)
#define use_portb_lcd true
 #fuses NOFCMEN, NOIESO,INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,
#include <lcd.c>

int16 tic,tic2,tic3,f;
int1 tiempo,tiempo2;
float T,Periodo;
int duty;
#int_CCP1
void  CCP1_isr(void)
{

  if(!tiempo)                         
   {
      tic2 = CCP_1;                 
      tiempo = 1;                       
   }
   
   else
   {
      tic3 = CCP_1;                   
      tiempo = 0;                       
     
      if(!tiempo2) tiempo2 = 1;               
   }

}

void main()
{
 setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
 setup_ccp1(CCP_CAPTURE_RE);
  setup_ccp1(CCP_CAPTURE_FE);
 enable_interrupts(INT_CCP1);
 enable_interrupts(GLOBAL);

 lcd_init();

while (true){


 if(tiempo2)                       
      {
         disable_interrupts(GLOBAL);
         tic = (tic3 - tic2);
         
            T=4.0*8.0/8000000.0;
 
   Periodo=T*tic;
   
   F=1/Periodo;
 
  duty=tic3*100/(tic3+tic2);       
           
         tiempo2 = 0;                   
         enable_interrupts(GLOBAL);
      }




     lcd_gotoxy(1,2);
   printf(lcd_putc,"d=%02u",duty);
   
   
     lcd_gotoxy(9,2);
   printf(lcd_putc,"F=%03lu",F);

}
}
« Última modificación: 25 de Junio de 2016, 10:23:28 por callecuatro1976 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar pulsos y mostrar duty lcd
« Respuesta #11 en: 25 de Junio de 2016, 11:26:58 »
Te lo hago mas facil.

Cuando entras a la interrupcion del CCP, pregunta por la entrada,

Si la entrada esta en 0. Entonces lo que habia antes era un 1 es decir que el tiempo medido es ( Ton = tic )
Si la entrada esta en 1. Entonces lo que habia antes era un 0 por lo tanto el tiempo obtenido esta vez es ( Toff = tic2 )

Esto para no estar cambiando cuando es que se dispara el CCP, la otra opcion es:

Configurar el CCP para que detecte flanco descendente, cuando entra a la interrupcion guardar el tiempo ( Ton ) y cambiarlo a flanco ascendente.
Entra a la interrupcion nuevamente, guardo el tiempo ( Toff ) y cambio a flanco descendente.

Luego de obtener el Toff, ya tengo en mi poder el Ton y Toff que paso, recien alli puede realizar el calculo de duty.

------------

Tenes que tener mucho cuidado cuando tenes variables en la interrupcion y en el programa principal. Veo que desactivaste las interrupciones, Pero eso puede llegar a ser un error, por que implica que por momentos el CCP puede detectar algo y no entrar a la interrupcion, con el resulatado de darte valores erroneos

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #12 en: 25 de Junio de 2016, 11:59:04 »
le hice las modificaciones y no me funciona te dejo el archivo si lo podes ver con la simulación

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar pulsos y mostrar duty lcd
« Respuesta #13 en: 25 de Junio de 2016, 12:04:58 »
No tengo para simularlo, pero dejo algo aca:

Código: C
  1. #int_CCP1
  2. void  CCP1_isr(void)
  3. {
  4.         tiempo=ccp_1;
  5.         if(input(PIN_B0) == 0)
  6.         {
  7.                 ton=tiempo-tiempo2;
  8.         }
  9.         else
  10.         {
  11.                 toff=tiempo-tiempo2;
  12.         }
  13.         tiempo2=tiempo;
  14. }

Desconectado callecuatro1976

  • PIC12
  • **
  • Mensajes: 85
Re:Contar pulsos y mostrar duty lcd
« Respuesta #14 en: 25 de Junio de 2016, 12:22:37 »
Pin b0 que señal va?