Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: callecuatro1976 en 17 de Junio de 2016, 17:18:36
Título: Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 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.
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC 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.
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 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
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 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 ?
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 en 24 de Junio de 2016, 17:15:22
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
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC 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.
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 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?
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC 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%
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 en 24 de Junio de 2016, 21:23:11
Osea usando mi código sería Duty=tiempo*100/(tiempo+tiempo2)
Sería así?
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC 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.
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 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
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC 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
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 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
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC en 25 de Junio de 2016, 12:04:58
No tengo para simularlo, pero dejo algo aca:
Código: C
#int_CCP1
void CCP1_isr(void)
{
tiempo=ccp_1;
if(input(PIN_B0)==0)
{
ton=tiempo-tiempo2;
}
else
{
toff=tiempo-tiempo2;
}
tiempo2=tiempo;
}
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 en 25 de Junio de 2016, 12:22:37
Pin b0 que señal va?
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC en 25 de Junio de 2016, 12:28:17
Pone el pin del CCP, el que detecta los flancos. Tu entrada de señal
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 en 25 de Junio de 2016, 13:43:23
Se hizo un lio ahora se me mezcló todo tendría que usar otro pin c7 y como modificó el código?
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: KILLERJC en 25 de Junio de 2016, 14:08:56
En serio me estas preguntando eso ?, RC2 es el pin CCP1 el cual estas haciendo ingresar la señal y que deberias leer, Bueno por las dudas aca tenes la otra forma:
Este es el caso que simplemente cambias la condicion de los flancos, tal ves te sea mas facil ya que no tenes que leer ningun puerto.
Código: C
bool Flanco =0;
// En el setup comenzar seteado con flanco DESCENDENTE! es decir: setup_ccp1(CCP_CAPTURE_FE);
#int_CCP1
void CCP1_isr(void)
{
tiempo=ccp_1;
if(Flanco ==0)
{
setup_ccp1(CCP_CAPTURE_RE);
Flanco =1;
ton=tiempo-tiempo2;
}
else
{
setup_ccp1(CCP_CAPTURE_FE);
Flanco =0;
toff=tiempo-tiempo2;
}
tiempo2=tiempo;
}
Ya mas seria hacerte el programa por completo, no se si los setups son correctos, no uso CCS. en XC8 simplemente cambiaria 1 o 2 bit.
Título: Re:Contar pulsos y mostrar duty lcd
Publicado por: callecuatro1976 en 25 de Junio de 2016, 14:44:50
gracias killerjc!!!
funciona después de tantos idas y venidas solo tengo dos problemas que no puedo solucionar 1) cuando enciendo lcd no me aparecen los ceros, recién cuando recibe un pulso empieza a contar 2) cuando corto los pulsos queda el valor no vuelve a cero como lo cambio es el if (pulsonuevo) pero no se modificarlo de otra manera, gracias