¿Cómo cuento los pulsos con un microcontrolador?

Hola!!
Debo contar los pulsos de esta señal:


4048295pulso-90.jpg


Pero cuando el programa en lenguaje C que uso con el micro QG8 de Freescale pregunta si la señal presente en el puerto es '0' o si es '1', para contar los pulsos, el resultado es mayor al esperado. Para que el resultado sea correto, desde el segundo 40 al 45, el programa en código C me debería contar 9 pulsos, pero mi programa cuenta entre 100 y 200 pulsos en 5 segundos.
SIN AGREGAR HARDWARE: ¿Cómo puedo hacer que el programa me cuente bien los pulsos que hay en 5 segundos?
Saludos
Gracias
adolcor
 
Con un filtro RC lo resolves.

La otra, si no queres recurrir a ningun circuito, seria hacer un anti-rebote, sabiendo cuento es la separacion minima entre pulso y pulso, una vez que cuente un pulso, hasta no pasar un cierto tiempo que no cuente otro.

Por ej. yo haria esto:

1- Configurar interrupcion externa para contar los pulsos.
2- Al saltar la interrupcion externa (llego un pulso), desactivo la interrupcion externa, habilito una interrupcion por timer que dure un tiempo adecuado (tal que no sea ni poco para no tomar un conteo falso, ni mucho para no dejar de contar un pulso).
3- Al saltar la interrupcion del timer, lo deshabilito y habilito nuevamente la externa.

En la interrupcion externa deberias tener un contador que vaya contando la cantidad de pulsos.
 
Simplemente seria hacer esto:

Código:
V(in) ----- Resistencia-----|--------- V(out)
                            C
Masa -----------------------|---------

Este circuito seria un filtro pasa bajos.

El calculo seria el siguiente:

Ton: tiempo en que dura una seguidilla de esos pulsos cortos que graficaste.

Toff: tiempo de separacion entre seguidilla y seguidilla de pulsos cortos.

Ttotal: Ton+Toff el periodo de la señal.

1/(R*C)=2*pi*1/(Ton+toff/2)

De esta forma tomarias como un solo pulso una seguidilla que dure hasta Ton+Toff/2 (un poco menos en realidad). Y recien tomas como otro pulso una seguidilla que empieza a partir de Ttotal.

Ej:

Ton: 1mSeg Toff: 10 mSeg Ttotal: 11 mSeg

Ton+Toff/2=6mSeg

fcorte= 166,6 Hz => wcorte= 2*pi*fcorte=1047 radianes/seg

1/RC=1047 radianes/seg

Si impones C=1uf => R=1/(1uf*1047 radianes/seg)= 1kohm (aproximadamente)

Entonces hasta 6 mSeg tomarias una seguidilla de pulsos como si fuera un solo pulso y a partir de los 11 mSeg podes tomar otra.

Este seria el circuito mas sencillo y lo podrias emplear segun sean tus tiempos de separacion y la conveniencia de tus niveles de tension. Si por ejemplo la separacion entre pulsos es corta y el tamaño de los mismos son largos, ahi necesitarias filtros de mayores ordenes y tal vez te conviene trabajar mas la programacion, en cambio si tus niveles de tensiones se ven afectados, podrias usar un filtro RC activo usando un operacional.
 
Atrás
Arriba