¿Cuál es la forma “aceptada” de conducir MUCHOS monitores de cátodos comunes de 2 dígitos y 16 segmentos?

2

Tengo un proyecto que tiene 18 de estas pantallas de cátodo común, 36 dígitos en total, organizadas en tres filas de 12 dígitos. Mi primera versión del proyecto usaba un Arduino y cambia los registros para conducirlos. Desplegaría la 0ª columna de dígitos, los encajaría para proporcionar energía a las pantallas y luego conectaría a tierra la 0ª columna. Esto mostraría el primer carácter. Luego, cambiaría la siguiente columna de datos, deshabilitaría el terreno en la 0ª columna, bloquearía la 1ª columna y proporcionaría terreno a la 1ª columna para mostrársela al usuario.

Funciona, pero tiene un par de problemas. Es muy, muy, muy tenue. Puedo hacer que sea más brillante manteniendo cada pantalla un tiempo más largo, pero no llega muy lejos, y puedes sentir la baja frecuencia de actualización cuando la miras. Además, si tengo una columna que tiene muy pocos segmentos activos, dibujan toda la corriente que estoy suministrando y esa columna termina siendo mucho más brillante que el resto.

Tengo una tonelada (¿diría que tengo "una plétora?") de controladores LED MAX-7219, pero hay un obstáculo: el controlador LED asume un máximo de 8 segmentos por cátodo. Consideré usar un controlador LED para conducir la mitad de los segmentos en 8 dígitos, y otro controlador para la otra mitad. Esto funcionaría (probablemente): simplemente desactivaría la pantalla en la mitad superior y activaría la inferior, y luego revertiría el proceso unos milisegundos más tarde.

Realmente quiero que el dibujo sea fuego y olvido. Tengo que generar los datos que estoy mostrando, y esto lleva tiempo. Durante este tiempo, realmente no puedo estar quemando la CPU, cambiando las pantallas. (Técnicamente, podría hacer el flopping en un temporizador, pero tendría que detener el temporizador mientras cambiaba los datos nuevos, y ese temporizador podría interferir con la biblioteca de LedController, así como con las comunicaciones en serie que estoy usando para obtener los datos de un módulo GPS, de todos modos.)

Entonces, ¿hay alguna manera de cambiar 36 dígitos de datos y olvidarme por completo por 100-1000 ms, dejando el trabajo de llevar la pantalla al hardware de otra persona? Incluso he considerado tener un arduino para procesar los datos y luego transferirlos, de alguna manera, a tres, o incluso a otros seis arduinos para mostrar.

    
pregunta user30997

2 respuestas

1

El brillo y la luminosidad variable pueden tener dos causas:

  • Estás MUXingando demasiados (36?).

  • Su (s) resistor (es) limitador (es) de LED están en la pata COMÚN, no en cada una de las patas del LED.

Muxear más de aproximadamente 8 requiere que el interruptor desplegable de cátodo común extraiga demasiada corriente, especialmente cuando todos sus dígitos son "8". Un MOSfet de canal N discreto podría manejar la corriente requerida del controlador de cátodo común. Podría considerar la posibilidad de encadenar cuatro registros de turnos y empujarlos a nueve MUX (matriz 4 x 9).

Para los ánodos, puede salirse con los registros de desplazamiento HCMOS (HC164, HC595). Aun así, es útil comenzar con segmentos de LED eficientes que brindan un brillo decente a 1mA DC. Los cambios se pueden hacer bastante rápido, por lo que el tiempo para cambiar cinco HC164 encadenados no afecta al período MUX (que debería hacer un bucle más rápido que 30 por segundo, de lo contrario, se vuelve ópticamente molesto). Aún debe optimizar el código de desplazamiento para la velocidad. La celda de desplazamiento básica podría tener este aspecto (haz 9 filas más de esto):

simular este circuito : esquema creado usando CircuitLab

Esos nueve MOSfets necesitan una forma de conducir sus puertas. Se podría usar un HC595 para conducir los MOSfets, simplemente cambiando un solo "1" en un anillo. Es posible que necesite dos HC595 para obtener el bit adicional (para obtener un registro de desplazamiento de 9 bits). Es posible que se use la salida de tres estados para apagar todos los LED mientras está cambiando si las rutinas de interrupción llevan demasiado tiempo o si el parpadeo de fondo distrae: la resistencia de la puerta desplegable de 5k asegurará que todos los MOSfets se apaguen.
Eso es mucho cableado, y muchas resistencias. Es probable que cause algo de RFI: intente conectarlo todo de forma muy compacta.
Todo el cambio podría hacerse como un proceso en segundo plano: no necesita un temporizador y puede ser interrumpido fácilmente por sus otros periféricos, siempre y cuando sus manejadores terminen en un tiempo razonable. Considere usar el temporizador de vigilancia (watch-dog) como el temporizador MUX (si no tiene temporizadores), si puede configurarlo de forma aproximada en aproximadamente 3 ms.

    
respondido por el glen_geek
1

Como es probable que pueda decir ahora, no existe un método "aceptado". Es un conjunto de concesiones que solo usted está en la mejor posición para hacer ejercicio. Solo necesitas usar tu imaginación.

No entiendo completamente tu situación. Pero ya has escrito lo suficiente sobre eso que puedo ofrecerte un pensamiento o dos. Supongo que le gustaría usar sus dispositivos MAX7219. Y ya tienes las pantallas que mencionaste, también.

Así que algo como esto:

simular este circuito : esquema creado usando CircuitLab

Se utiliza un MAX7219 para la "mitad superior" de sus pantallas. El otro se usa para la "mitad inferior". Esto obtiene cobertura completa para todos sus segmentos. El único otro problema es la unidad de dígitos. Para esta situación, activa ambos dispositivos MAX7219. Sin embargo, si imagina que cada pantalla de 2 dígitos tiene cuatro cuadrantes, entonces el MAX7219 superior está dirigiendo el cuadrante superior izquierdo mientras que el MAX7219 inferior está impulsando el cuadrante inferior derecho. Y luego, en el siguiente período, el MAX7219 superior está impulsando el cuadrante superior derecho, mientras que el MAX7219 inferior está impulsando el cuadrante inferior izquierdo. Esto mantiene las corrientes de retorno del cátodo separadas. Se requieren dos períodos para completar un dispositivo de visualización de 2 dígitos. Ocho períodos cubren cuatro pantallas de 2 dígitos, u 8 dígitos en total, y lo hace con solo dos MAX7219 controladores que usan \ $ \ frac {1} {8} \ $ ciclos de servicio.

Sin embargo, tendrás que resolver los problemas de disipación. No me he molestado en pensar en esa parte. Tampoco he pensado más en la intensidad promedio que podrías obtener de esto, más allá de lo que ya mencioné en los comentarios.

Si desea que esto sea "dispare y olvide", entonces necesitará otro microcontrolador para operar esta pantalla por usted. Esa no es una tarea difícil. Pero agrega otro MCU y su cadena de herramientas de hardware y software asociado. Y eso puede ser un problema. Pero también una ventaja. Simplemente "descargabas" los datos de la pantalla, permitiéndole almacenar eso en su propia RAM, y luego te alejarías hasta la próxima vez que necesites actualizar los datos de la pantalla.

Por otro lado, no es difícil configurar un evento de temporizador en su sistema actual que funcione completamente "en segundo plano". Puede usar su propio software para "preparar previamente" todos los 8 estados de datos para transmitirlos en 8 búferes simples (dados los datos de visualización que deben mostrarse primero), que el evento del temporizador simplemente alterna entre y luego vuelve hacia atrás. terminado. El software de preparación previa puede ejecutarse en código regular en cualquier momento, completamente independiente de los eventos del temporizador de visualización. Todo lo que hace es configurar un "mensaje de cambio" que el evento del temporizador busca para cambiar al siguiente conjunto de 8 búferes, una vez que complete un ciclo de visualización anterior, liberando la memoria para los últimos datos de visualización que utilizará su código la próxima vez. ("Doble buffering.")

Depende de usted.

    
respondido por el jonk

Lea otras preguntas en las etiquetas