¿La interferencia en un panel de separación podría afectar mi entrada de un registro de desplazamiento?

1

He construido una placa de interfaz para conectar una matriz de LED y un controlador de juegos hecho en casa a una placa Arduino Due. La interfaz y el código para la matriz y el controlador se probaron de forma independiente antes de combinarlos en un solo circuito en un Stripboard.

Los datos de los interruptores del controlador son incorrectos a veces cuando la pantalla se está ejecutando, lo que me hace preguntarme si algún tipo de interferencia / señales inducidas podrían estar afectando los datos que estoy recuperando del controlador. Estoy pensando en la interferencia ya que el problema solo ocurre cuando se muestran ciertas imágenes en la matriz. He revisado dos veces en busca de cortocircuitos y estoy bastante seguro de que el código en sí no es la causa del problema.

El controlador está leyendo 8 interruptores (que se bajan cuando se abren con resistencias) en paralelo a través de un registro de desplazamiento y envían sus datos al Arduino en serie a través de 3 cables. Leo el nuevo valor de los interruptores cada 8 segundos. He configurado un código de prueba que muestra el estado actual de todos los interruptores en tiempo real en la matriz de LED y, dependiendo de lo que se muestra en la pantalla, muestra como se esperaba o mostrará errores en la forma de los interruptores incorrectos que aparecen como al presionarlo, incluso cuando los interruptores múltiples se muestran como presionados aunque solo esté presionando uno.

La matriz de LED está controlada por 13 líneas, algunas de las cuales pueden estar pulsando hasta aproximadamente 40MHz. Las líneas solo están activas en ráfagas muy cortas. Al comienzo de un cuadro de pantalla, el reloj pulsa 32 veces con 6 líneas de datos que posiblemente cambian en paralelo con cada pulso. Esto se repite 7 veces con un retraso (que se duplica cada vez) entre ellas. El proceso anterior se repite 15 veces para otras líneas en la pantalla (con las líneas de selección de 4 filas establecidas entre cada línea) y todo el proceso se repite 60 veces por segundo.

He logrado "solucionar" el problema optimizando el código que se lee en el registro de desplazamiento. El ajuste de los retrasos entre los latch y los pulsos de reloj en el registro de desplazamiento también ayudó, pero también puede hacer que el problema vuelva a aparecer dependiendo de lo que se muestra en la pantalla. No considero esto una solución. Sospecho que en algún momento el problema aparecerá nuevamente cuando implemente juegos nuevos que muestren diferentes imágenes en la matriz.

Aquí hay una foto de mi circuito:

Loscírculosrojosmuestranlospinesa/desdeelArduinoparalainterfazdelcontrolador,losverdesmuestranlospinesparalainterfazdematrizdeLED.Hedibujadoencianparadarunaideadeloqueconectaconqué.Loscuatropinesverdesmáscercanosalospinesdelcontroladorsonlaslíneasdeseleccióndefilaque"solo" cambian ~ 1000 veces por segundo.

¿Es probable que alguna falla en mi diseño / circuito esté causando falsos máximos en el reloj o las líneas de retención del registro de desplazamiento del controlador que están dañando la salida? No he roto las pistas del stripboard que se usan y son más largas de lo que deberían ser, ¿es una mala idea? ¿Podría estar contribuyendo al problema?

Gracias por cualquier ayuda / consejo.

    
pregunta Mick Waites

1 respuesta

3

Cuando los bordes rápidos (flancos) se presentan en una línea que no tiene la misma impedancia, se producirá un sonido. En la mayoría de los casos, encontrará que sus cables son tan cortos que este efecto es muy pequeño o (para líneas que no son de reloj) la línea se asentará antes de que se use su valor.

Usas líneas que son un poco largas y a 40 MHz dejan solo una parte de 25 ns para que las líneas se asienten. Además, el timbre en la (s) línea (s) del reloj puede causar relojes falsos (adicionales), y los cambios en una (o un grupo de) líneas pueden estar acoplados a otras líneas.

Un experimento simple podría ser reducir significativamente la frecuencia del reloj (digamos a < < 1 MHz) y ver si los efectos negativos desaparecen.

¿Qué puedes hacer? Lo mejor sería hacer coincidir todas las líneas por impedancia, pero eso puede ser un trabajo difícil. Lo que a menudo ayuda es una resistencia de 47 ohmios entre el lado de conducción y la línea, y / o un capcitor pequeño (piense 22pF) en el extremo receptor.

¿Estás por casualidad usando una cadena de chips HC595? En ese caso usted podría estar sufriendo de sesgo de reloj. El primer intento "estándar" consiste en alimentar el reloj desde el último chip de la cadena hasta el primer.

    
respondido por el Wouter van Ooijen

Lea otras preguntas en las etiquetas