-
Notifications
You must be signed in to change notification settings - Fork 1
02. PulseIn
Vamos a presentar un módulo con el cual vamos a poder medir la duración del ancho de un pulso de entrada que le llega al módulo.
Podemos ver un esquema general del patillaje del módulo en la siguiente figura:
Realmente, hemos creado cuatro módulos basados en el mismo concepto pero con distintos detalles de presentación como la forma de presentar los 32 bits de la salida ( todos juntos en una palabra de 32 bits o en 4 bytes separados) y si la señal que recoje el pulso de entrada a medir incorpora o no circuito de sincronización con el reloj del sistema (sinc), cuando el pulso a medir viene de una señal asíncrona como podría ser un pulsador, esta señal, siempre debería capturarse pasando por un circuito de sincronización con el reloj del sistema para de esa forma, todas las operaciones que se realicen con dicha señal vayan al mismo ritmo que la señal de reloj del sistema y no se produzcan errores por desincronización entre la señal y el reloj del sistema.
Podemos ver los 4 módulos creados son sus pequeñas diferencias:
En la siguiente figura, podemos ver con un poco más de detalle de las partes que se compone el módulo "PulseInXX".
Básicamente el módulo se compone de:
-
Un Contador de 32 bits: Se encarga de contar la duración del pulso de entrada, este empezará a contar cuando reciba el flanco de subida de la señal a medir, al producirse el flanco de subida, se habilitará el contador y empezará a contar a la frecuencia del reloj del sistema (12 Mhz = cada cuenta equivale a 83,33 nano segundos medido ).
-
Registro de 32 bits: Se encarga de almacenar el tiempo que el contador ha medido cuando el pulso de entrada a medir termina ( en su flanco de bajada).
-
Detector del flanco de bajada del pulso a medir: El flanco de subida del pulso a medir dispara al contador y el circuito detector del flanco de bajada nos dará la señal necesaria (un tic de reloj) para saber que el pulso ha terminado e indicar al contador que pare y al registro que almacene el valor del contador.
-
Circuito de sincronización: Este circuito no está en todos los módulos creados y será el encargado de sincronizar el pulse de entrada a medir con el reloj del sistema, en el caso de que ya estuviese sincronizada, seguirá sincronizada y en caso de que la señal de entrada provenga de un circuito asíncrono, esta se sincronizará con el reloj del sistema.
Hasta aquí hemos descrito el funcionamiento del módulo genérico "PulseInXX" y ahora vamos a mostrar algún ejemplo.
En el siguiente ejemplo introducimos un pulso de duración conocida empleando un módulo especial que se encargará de formar el pulso con la duración deseada y tras ser medido por nuestro módulo PulseInA1 se enviará el resultado por el puerto serie al programa terminal Scriptcomunicator que estando bien configurado (ver apartado 02. Transmisión de 32 bits ) nos permite ver en formato decimal el valor del ancho de pulso medido y corraborar el buen funcionamiento del módulo.
Este ejemplo se cargará varias veces con los valores de la tabla:
y se irá comprobando en "Scriptcomunicator" que la recepción del dato medido, corresponde con lo que se esperaba.
Tras cargar sobre la FPGA todas las combinaciones de la tabla anterior, se confirma que los resultados medidos son correctos y que con 32bits a una frecuencia de reloj de 12 Mhz se puede llegar a contar un pulso de gran duración de tiempo (cerca de los 6 minutos ) y un pulso de duración <= 83,33 nano segundos si esta está sincronizada.
Añadimos otro ejemplo igual al anterior pero al que añadimos un pulsador para poder enviar el pulso configurado cada vez que se aprete el pulsador ( el anterior enviaba un único pulso y para poder enviar otro había que volver a cargar el programa a la FPGA ).
podemos ver en el Scriptcomunicator como cada vez que pulsamos nos mide el ancho del pulso.
Ahora introducimos desde un generador de funciones un pulso asíncrono que podemos variar de forma dinámica y ver la respuesta de nuestro "PulseIn" observando unos resultados muy buenos.
Para ver los resultados podemos usar el "Scriptcomunicator" pero como queremos poder convertir los datos a valores de tiempo, hemos realizado un pequeño programa en processing que se encargará de capturar los datos del puerto serie y convertirlos a distintas unidades de tiempo (ns,us,ms y segundos).
El código es el siguiente:
Podemos una captura de un pulso introducido de 100us con unos resultados correctos.
donde podemos ver que se captura una cuenta de 1200 que si multiplicásemos por 83.33333333... equivaldría a los 100us exactos. El error lo tenemos al redondear multiplicando por 83.33 solo.