¿Muestreando (leyendo) una señal de datos digital?

0

Actualmente estoy trabajando en un proyecto, donde tengo un dispositivo externo (POCSAG pager - protocolo POCSAG) que está emitiendo una señal de onda cuadrada digital (5V - 0V). Tengo un microcontrolador ATmega2560 (Arduino) y quiero leer la señal para poder decodificarla en texto.

Ya terminé este proyecto donde el dispositivo externo funciona en "condiciones de laboratorio" perfectas, lo que significa que un bit se transmite en exactamente 833 microsegundos (1200 Hz). Leí todos los bits correctamente con un simple temporizador y luego los decodifiqué.

El problema es que, cuando lo intento en un buscapersonas del mundo real, ¡la velocidad de bits varía mucho! De 750 microsegundos a 870 microsegundos, y cada bit está en algún punto intermedio, lo que significa que recibo muchos errores al leer la señal, ya que un mensaje tiene una longitud de hasta 5000 bits. No olvidemos que siempre hay ruido en la línea de datos cuando la señal real no está presente, cuando no hay mensajes transmitidos.

Logré que funcionara en "condiciones de laboratorio" al medir 3 bits, y si todos los bits coinciden con 833 microsegundos, conecté una interrupción que activaría un temporizador con un período de 833 microsegundos que muestrea la señal y la guarda en un array de caracteres (sí, lo sé, mala solución). Como dije, esto funciona perfectamente siempre que la frecuencia sea estable.

Intenté medir de 10 a 20 bits, que estaban entre 750 y 860 microsegundos, calculando la velocidad de bits promedio y muestreando la señal con esa velocidad después ... Tampoco funcionó.

La señal digital siempre tiene un preámbulo de 576 bits alternos (0101010101 ...) para que pueda detectar cuándo se está transmitiendo un mensaje real.

¿Alguna idea sobre cómo debo abordar esto?

Lo siento si no lo expliqué lo suficiente ... Si tienes más preguntas, ¡avísame!

EDITAR: Esta es la forma en que se codifica la señal. En resumen, un bit se transmite en 833 microsegundos (supuestamente) y el mensaje inicia los bits alternos de los bits 576, denominado preámbulo (010101010101 ...). Después de eso, se transmite una palabra de código Frame Sync de 32 bits (la palabra de código FS es siempre la misma) que señala el comienzo del primer lote de datos. Hay 8 cuadros (cada cuadro contiene 2 palabras de código, 2 x 32 bits) que contienen 16 palabras de código de datos. Después de esos 8 cuadros, si el mensaje continúa, se transmite otra palabra de código FS y así sucesivamente ...

    
pregunta 0xd4v3

2 respuestas

1

El preámbulo en POCSAG está diseñado exactamente para que el receptor se sincronice con la velocidad de transmisión de datos. En este punto, puede utilizar las conocidas técnicas DPLL para sincronizar su reloj interno con los datos transmitidos.

Los siguientes bloques siempre comienzan con una palabra de código de sincronización estándar, lo que significa que puedes ajustar el reloj al comienzo de cada carga útil.

A pesar de que la velocidad de datos puede variar entre los bloques, es altamente improbable que cambie dentro de el bloque. Debería poder sincronizarse corrigiendo el reloj usando la palabra en clave de sincronización, para eso está.

Después de recibir cada bloque, puedes usar la distancia de Hamming y los bits de paridad para detectar errores y usar códigos de corrección de errores si es necesario.

Como nota al margen, el sobremuestreo con suficiente frecuencia es demasiado pesado para esta MCU, considerando el procesamiento adicional requerido. Las tareas como DPLL se hacen mejor usando IRQ en la línea de datos. Esto también separaría la sincronización del procesamiento de errores, haciendo que el código sea más eficiente.

    
respondido por el Maple
-1

Problema:

  • Diseño de separador de datos básico, 1200 baudios NRZ síncrono pero ruidoso de la radio FM.
  • los datos tienen una frecuencia de transición baja en relación con la velocidad de datos (1/32 = 3%).
  • Error de frecuencia de reloj de Tx = TBD, suponga 100 ppm por ahora.
  • Asimetría de datos de Rx = TBD vs contenido de datos y potencia de señal RSSI, = TBD
  • fluctuación de datos Rx desde inter-símbolo-interferencia (ISI) = TBD
  • fluctuación de datos Rx desde RSSI = TBD bajo (interferencia de canales adyacentes y aleatorios (((ACI)
  • Rango de reloj Rx > Tx clock error (VCXO) = TBD
  • diseño de PLL en modo de ancho de banda dual sugerido para capturar el error de frecuencia y bloquear el error de fase a 0 +/- TBD%
  • tasa de error de mensaje deseada = 1e-6 o TBD en el peor de los casos, pero nivel de señal aceptable = TBD Rf Nivel RSSI o Rx nivel de potencia, lo que resulta en el peor caso aleatorio de preámbulo de TBD o 33% objetivo.
  • almacenar mensajes en una base de datos con direcciones de identificación y datos que la policía de Baltimore tuvo hace mucho tiempo Así que ahora vemos muchos TBD que, una vez que aprendas cuáles son y cometemos un error de presupuesto, puedes hacer un presupuesto objetivo de diseño y luego ver qué factores afectan esto.

He hecho esto con éxito usando una línea de entrelazado de video de repuesto para recibir 256 bits a 4MBps NRZ en un canal NTSC de luma de video de 4.5MHz que incluye 8 bits para sincronización de reloj y el resto para ID de dirección, datos y CRC. Podría tolerar un estiramiento de 200 bits con transiciones aleatorias o sin transiciones con facilidad y un jitter aleatorio de +/- 40%.

  

La forma en que lo haga depende de su TBD.

Creé un PLL de 4MHz que se sincroniza 'para preámbulo muy rápido y luego usando un interruptor CMOS cambió el ancho de banda del bucle para corregir el error VCXO mucho más lento. No tendrá que hacerlo, pero usé un diente de sierra para muestrear y mantener el error de fase de cualquier transición de datos. Debido a que la fluctuación de fase ISI es común, los errores de fase provocan un ruido de error de fase alternativo que puede atenuarse mediante el diseño del filtro de realimentación. El sesgo de Rx debido al error de umbral del discriminador también se puede medir principalmente a una velocidad de 1/2 bit y se puede atenuar. La compensación de avance / retardo del filtro de bucle es simplemente elegir las relaciones RC en torno al 10: 1 cerca del punto de interrupción de ganancia del bucle de la unidad para que sea estable y el jitter del reloj no debe aportar más del 5% de error, pero en diseños deficientes como este, su ventana de tiempo tiene demasiados ToBeDetermined's.

Al final, el resultado del diseño podría ser un código de seguimiento de error de fase en un SDR que integra y vuelca el resultado después de cada intervalo para simular un PLL de tipo 4046 para recuperar los datos o un IC de PLL con el eliminador de datos I & D para use todo el intervalo de bits para el rendimiento del "receptor óptimo".

El desafío es identificar todas las incógnitas en una especificación, luego los resultados esperados, resolver el diseño es mucho más fácil con la lectura de ejemplos similares.

    
respondido por el Tony EE rocketscientist

Lea otras preguntas en las etiquetas