Medir la duración y las distancias entre pulsos

2

Quiero saber cómo se hace (o al menos cómo lo harías) para medir la duración y las distancias entre los pulsos de una señal en un microcontrolador (o una mejor manera).

Ejemplo: tengo un par de Arduinos y un par de este transmisor / receptor de RF (http://bit.ly/oT05Qg) y tengo una configuración de protocolo que dice que debo recibir 4 bits (1111) con duración de 0,5 microsegundos y el espacio entre ellos a partir de 1,5 microsegundos. Si es diferente, debería ignorar la información.

¿Cómo puedo / harías esto?

P.S: El mejor ejemplo en la vida real que pude encontrar fue el siguiente: enlace

    
pregunta Cassio

3 respuestas

1

Desde luego, no intentaría hacer esto con un Arduino (recuerda, preguntaste qué haría I ). Medir las características de los pulsos a una velocidad de 500 kHz será complicado. La gran pregunta que dejó abierta es qué tan cerca debe estar, o más exactamente, qué tan cerca debe saber que está de los tiempos perfectos de 500 ns y 1.5 µs. Si necesita saber esto dentro del 1%, por ejemplo, será difícil y costará bastante.

Si es lo suficientemente bueno como para muestrear la señal cada 250 ns y vivir con la incertidumbre resultante en el tiempo, entonces es más fácil pero aún así es complicado. En ese caso, puede muestrear la señal en un registro de desplazamiento a 4 MHz y luego analizar el resultado en el firmware. Generar una salida de reloj de 4 MHz con la mayoría de los micros avanzados es fácil, y muchos tendrán un periférico SPI que se puede reutilizar en un convertidor de serie a paralelo.

En un procesador como un PIC 24H, la velocidad de instrucción puede ir a 40 MHz. Eso solo deja 10 instrucciones en promedio por bit para procesar, lo que suena muy poco para que este método sea viable.

Otro enfoque es activar los contadores para los tiempos altos y bajos, y así obtener un recuento del número de tics del reloj entre los bordes. Aún tiene 1M de bordes por segundo para tratar, o 40 instrucciones por borde. Eso todavía suena ajustado, pero posiblemente se puede hacer dependiendo de lo que necesita hacer y lo que se debe hacer con el resultado. El 24H tiene módulos de "captura de entrada" que hacen la mayor parte de esto en hardware, pero el firmware todavía tiene que dar sentido a las mediciones de duración resultantes.

Tenga en cuenta que su tren de pulsos tiene un nivel promedio de 1/4, lo que podría ser posible explotar con cierta inteligencia y dependiendo de lo que esté sucediendo, qué tan rápido lo necesita y muchas otras cosas que no tiene t dijo.

    
respondido por el Olin Lathrop
0

Muchos esquemas de comunicación en serie asíncronos, como RS232, implican un estado conocido de inactividad / marca de la línea y una señal / bit de inicio, así como bit (s) de parada. El exceso de muestreo de la línea RX permite sincronizar hasta la mitad de los bits de inicio en el medio y finalmente muestrear cada uno de los bits y validar el estado de los bits de parada. enlace

    
respondido por el kenny
0

Hay una función de Arduino específicamente diseñada para medir la longitud del pulso:

pulseIn(pin, value)
pulseIn(pin, value, timeout) 

Sin embargo, no es adecuado para sus propósitos ya que el rango de longitud de pulso detectable es de 10 microsegundos a 3 minutos. Además, una vez que se realiza la medición, tendrá que procesar el resultado (por lo menos almacenarlo en algún lugar), lo que lleva tiempo y puede hacer que se pierda el inicio del siguiente impulso.

Es posible que pueda medir pulsos más cortos al establecer un ISR en el pin con

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); 

y usar la función micros() que tiene una resolución de 4 microsegundos, pero eso es todo lo que puede llegar. Arduino simplemente no es lo suficientemente rápido para medir pulsos más cortos sin hardware especial. Lo más prometedor sería utilizar SPI si sus tableros lo tienen, pero solo funcionará si recibe pulsos en grupos que podrían asignarse a transacciones SPI.

    
respondido por el Dmitry Grigoryev

Lea otras preguntas en las etiquetas