Cómo detectar el flanco ascendente de un pulso que no está sincronizado con el reloj

1

Esta puede ser una pregunta trivial.

Tengo un microcontrolador que intentará reconocer los flancos ascendentes y descendentes de un pulso. Este pulso no está sincronizado con el reloj del microcontrolador ni con ningún reloj. Para mis propósitos y propósitos, los voltajes se ajustan a los voltajes que requiere el microcontrolador. ¿Cómo debo esperar que el microcontrolador se comporte si intenta detectar el flanco ascendente cuando ...

  1. ... ¿el pulso comienza cerca del comienzo del ciclo del reloj?

  2. ... ¿el pulso comienza en la mitad del ciclo del reloj?

  3. ... ¿cerca del final del ciclo del reloj?

También, ¿qué debo esperar si intento detectar el flanco descendente con los mismos tiempos? (1. cerca del principio, 2. en el medio, 3. cerca del final)

No sé si esta pregunta depende de los detalles de la MCU o del pulso. Si es así, puedo proporcionar especificaciones. Gracias!

EDITAR: Creo que redacté mi pregunta mal. Entiendo que la MCU solo tomará muestras de cada ciclo de reloj. Principalmente preguntaba qué pasaría si el pulso cambiara la polaridad en el 1. principio, 2. medio, 3. final de un ciclo de reloj. ¿Esto afectará lo que muestrea el MCU?

Especificaciones: ARM9 MCU enlace

Pulso: los pulsos son generados por un fotodiodo de avalancha. Cada pulso representa la llegada de un fotón. El pulso alto dura 30 ns, el tiempo muerto de pulso es mínimo de 50 ns. El objetivo actual de mi proyecto es usar el temporizador interno para cronometrar estas llegadas de pulsos.

    
pregunta Paul Terwilliger

4 respuestas

3

Esta es la forma en que funciona. Si tiene un pulso, suponiendo que los voltajes son correctos, se detectará en el reloj N si cumple con el tiempo de configuración y retención del reloj N. Si es demasiado tarde para ser detectado en el reloj N, se detectará en el reloj N + 1. Si el tiempo es marginal, puede detectarse en el reloj N o en el reloj N + 1, no hay forma de saberlo con anticipación.

Tenga en cuenta que hay un ancho de pulso detectable mínimo. Si el pulso es demasiado estrecho, es posible que no se detecte en absoluto. En general, "demasiado estrecho" significa menos de un período de reloj de muestra (pero debe trabajar con las especificaciones de tiempo de configuración y retención para comprender completamente el ancho de pulso mínimo). Entonces, si el pulso mínimo es menor que un ciclo de reloj, existe la posibilidad de perder un pulso. Bienvenido a las alegrías del diseño asíncrono.

Dependiendo de lo que le interese, hay todo tipo de cosas que podría hacer. Podría hacer que el pulso habilite un integrador analógico para que los pulsos se puedan contar de forma analógica, y luego muestre y reinicie el integrador para evitar el desbordamiento.

Si lo que más te interesa es la temporización del pulso, puedes iniciar un integrador en el flanco ascendente del pulso, luego muestrea la salida de voltaje analógica del integrador con un ADC síncrono al muestreo digital. Luego conviertes el voltaje ADC al tiempo transcurrido. Esto le permitirá calcular la hora del pulso con precisión y precisión sub reloj.

¡Diviértete!

    
respondido por el mkeith
1

El teorema de muestreo indica que al menos debe muestrear con el doble de frecuencia de la señal . (muy básicamente hablando)

No hay tal cosa como el comienzo, la mitad o el final de la muestra, porque la muestra es la unidad atómica del tiempo, por así decirlo. No tienes más resolución.

Si aparece el siguiente flanco ascendente antes de que pueda finalizar el actual, se interrumpe la cola y se pueden perder datos. El teorema no es todo lo que importa aquí, porque también necesita algunos ciclos para ejecutar su código.

µC a menudo vienen con periféricos dedicados para tales tareas. las unidades de captura / comparación, por ejemplo, pueden ejecutar un temporizador hasta que se detecte un flanco ascendente y escribir el valor del temporizador en un registro. Esto es muy rápido porque se hace en hardware. Luego, el registro se puede copiar en algún bloque / matriz de memoria, para evitar que se sobrescriba con el siguiente valor del temporizador de entrada.

    
respondido por el Magic Smoke
1

La relación entre los datos de entrada y el reloj de entrada para una puerta se especifica por su configuración y tiempo de espera. Para un flip-flop individual, esto proporciona una ventana cuando el cambio se registrará correctamente y un tiempo pequeño en el que no podrá hacerlo (lo que posiblemente resulte en un estado "metaestable"). Dado que en realidad no existe tal cosa como un borde, solo una pendiente de tiempo finito, la ventana de riesgo no puede tener un tamaño cero.

Por lo tanto, la solución normal es conectar varios flops uno tras otro, con una resistencia especial a la metastabilidad. Habrá un retraso fijo de varios ciclos entre la señal que llega al pin y se registra internamente. También habrá una latencia de interrupción si está activando una interrupción.

Por razones prácticas, si lee dos pulsos de un pin de entrada, los tiempos pueden estar desactivados en cada dirección hasta en un ciclo de reloj completo. Su señal puede ser de hasta 20MHz; tratar de leer esto en un microcontrolador con algo que no sea un periférico de entrada de serie dedicado probablemente tenga problemas. Sin embargo, es probable que pueda medir un par de tiempos de señal con un periférico de captura / comparación.

Editar: esto está relacionado con tu publicación anterior, ¿no es así? Esto sería mucho más fácil si describieras de dónde provienen los pulsos y qué protocolo significan.

    
respondido por el pjc50
1

El uso directo de interrupciones o valores de sondeo hará que dependa de la frecuencia de muestreo digital. En su lugar, utilice un búfer flip-flop. Después de sondear los datos, restablézcalos. ¿Puede haber numerosas señales que se pierdan hasta que encuestes? Luego de usar un IC de contador rápido, sondee el valor en un período estadísticamente significativo (es decir, considerando cierta tolerancia para el conteo que se puede perder en la secuencia de sondeo y reinicio) y reinicie.

    
respondido por el Ayhan

Lea otras preguntas en las etiquetas