¿Cómo puedo manejar efectivamente múltiples LED con multiplexación?

7

Estoy conectando mi microcontrolador (AVRmega32U4) a una matriz de 4x4 LED. Hay 2 líneas de control para operar columnas (pasadas a un demultiplexor de 2 a 4) y 4 líneas de control para operar filas. Traigo una columna alta y una fila baja para iluminar un LED específico. Tire de la columna hacia abajo o la fila hacia arriba para apagar un LED.

Este diseño funciona bien para aproximadamente 4 LED a la vez. Sin embargo, cuando trato de encender los 16 a la vez con esta estrategia, los LED son notablemente menos brillantes (¡están en un ciclo de trabajo de 1/16 después de todo!).

¿Cuáles son algunas formas de iluminar de manera más efectiva una mayor cantidad de LED en esta matriz? Di, 10+?

Estoy considerando escribir un montón de código para manejar las diferentes situaciones, pero eso consumirá más espacio en mi microcontrolador del que me siento cómodo. Estaba considerando agregar otro micro con 16 líneas de control para administrar estos LED, uno a la vez, pero parece una gran cantidad de gastos generales para presentar.

    
pregunta samoz

4 respuestas

12

Usé información valiosa de la respuesta de Telaclavo para ajustar la mía. Si te gusta el suyo, no olvides promocionarlo.

Si su ciclo de trabajo es de 1/16, entonces tendría que dar a cada LED 16x su corriente nominal para obtener el mismo brillo promedio. Esto disminuirá la vida de tus LEDs. Los LED de alto brillo pueden controlarse con PWM a su corriente nominal en un ciclo de trabajo de 1/16 y seguir siendo tan brillantes como un indicador LED común.
La solución más fácil es mantener ese ciclo de trabajo fijo, de modo que también pueda tener el actual fijo. Cada controlador de columna tendrá que conducir 4 LED simultáneamente, por lo que es 4 veces la corriente nominal.

El 7404 que tienes en tu esquema no es adecuado para esto. El primer TTL puede generar muy poca corriente: 0.4mA. Pero incluso el hundimiento no sirve, eso es solo 16 mA, la mayoría de los LED y el alto brillo están especificados para 20 mA. Usted necesita un controlador que puede fuente de eso. En sus 4 columnas x 4 filas, cada una de las 4 columnas debe suministrar 4 LED con 20 mA cada una, es decir, 80 mA. Existen controladores de lado alto, pero es posible que tenga que trabajar con componentes discretos (BJT o MOSFET). La corriente no dará como resultado una alta disipación, ya que su promedio por transistor del lado alto es solo 1/4 de eso: 20 mA, y ese es el peor de los casos, si todos los LED están encendidos.

editar
Una BC807 es una buena opción para esto, y tiene una \ $ H_ {FE} \ $ de 100 Mínimo, para que unos pocos mA de corriente base lo conduzcan en saturación. Ya no necesita el 7404 para invertir la salida baja activa del 74S139, ya que el BC807 es impulsado por un bajo voltaje. El 74S139 (¿por qué no LS?) Puede hundir la corriente requerida, también lo hará un 74HC139. Si bien la mayoría de los microcontroladores pueden hundir 20 mA, este no parece ser el caso para ATMega32U4 . La hoja de datos no proporciona la corriente máxima como parámetro (una lacune), pero el voltaje de salida mínimo y máximo se especifican a 10 mA. Así que para el lado bajo tendrás un driver extra. El 74LVC07A se especifica para las corrientes de hundimiento a 32mA.

En cantidades, las resistencias 74HC139 + 74LVC07A + 4 \ $ \ times \ $ BC807 + 8 cuestan menos de 35 centavos en Digikey.

    
respondido por el stevenvh
5

Si se desea que todos los LED parezcan estar encendidos simultáneamente, entonces los controladores para una dimensión (a menudo llamados "filas", independientemente de la disposición física de los LED) deben construirse de manera que cuando un controlador de fila esté energizado, Podrá iluminar todas las columnas a la vez; en la otra dirección, las columnas se diseñarán típicamente para operar con una fila a la vez energizadas. En la mayoría de los casos, esto significará que los controladores de fila tienen que ser más "robustos" que los controladores de columna.

Aunque en ocasiones puede haber ventajas en el diseño de una pantalla con controladores de fila que solo pueden manejar la mitad de los controladores de columna a la vez (por ejemplo, porque uno quiere poder mostrar mensajes brillantes en parte de la pantalla), en la mayoría de los casos logrando un nivel particular de brillo aparente con un número particular de filas requerirá un cierto nivel de corriente de fila. Si solo pudiera manejar la mitad de las columnas a la vez, encender todas las columnas con un brillo determinado requeriría que se manejen con el doble de corriente para compensar.

Por cierto, aún no se ha mencionado un punto: si uno va a intentar algo cercano al brillo máximo al usar LED multiplexados, debe diseñar un circuito que impida que una fila se energice durante un período de tiempo excesivo. Como mínimo, uno debe diseñar cosas para que si la CPU se detiene, la pantalla se apague o realice un ciclo a través de las filas de manera autónoma, y para que la exploración de la pantalla no se pueda reiniciar con demasiada frecuencia sin que la pantalla se quede en blanco (ya sea haciendo que el contador le informe a la CPU). cuando finaliza, en lugar de hacer que la CPU reinicie el contador, o hacer que la señal de "reinicio del contador" desactive los controladores de la fila durante un cierto tiempo mínimo). De lo contrario, un mal funcionamiento de la CPU puede destruir un panel LED.

    
respondido por el supercat
5

El ATmega32 , con Vs = 5 V, puede generar y hundir +/- 20 mA por pin, con una pérdida de voltaje de alrededor de 0.7 V .. 0.8 V

ypuedegeneraryhundir4·(20mA)=80mAentotal(porpaquete),einclusoporpuerto,sinproblemas.

Suponiendo que no quiera superar la clasificación de 20 mA por LED, esta sería una forma diferente de hacerlo:

U1= ADG1636 . Tiene dos interruptores SPDT. Cada conexión de interruptor puede transportar 238 mA (máx.), En cualquier dirección, a 25 ºC. Eso es mucho más alto que 4 · (20 mA) = 80 mA. Entonces, U1 actúa como un búfer de alta corriente. El IC cuesta $ 1.83 en 1 kpcs.

Rs = (5-2-0.7 V) / (20 mA) = 115 \ $ \ Omega \ $, 1/4 W. Solo necesitas cuatro de ellos.

Para que sea seguro conectar pares de LED en antiparalelo, como se muestra, debe ser \ $ V_ {F} < | V_ {Rmax} | \ $, y esa condición generalmente se cumple.

Pasos:

1) Ajuste B = 0 (como se muestra en la Fig.). Eso le dará acceso a los diodos D9 a D16. Los diodos D1 a D8 estarán todos apagados.
2) Ajuste A = 0 (como se muestra en la Fig.). Eso le dará acceso a los diodos D10, D12, D14 y D16.
3) Establezca C = A si desea que D10 esté desactivado. Establezca C =! A (! Significa negado) si desea que D10 esté activado.
4) Simultáneamente con 3), haga lo mismo para {D, D12}, {E, D14}, {F, D16}.
5) Establecer A = 1. Eso le dará acceso a los diodos D9, D11, D13 y D15.
6) Repita 3) y 4), pero para {C, D9}, {D, D11}, {E, D13}, {F, D15}.
7) Conjunto B = 1. Eso le dará acceso a los diodos D1 a D8.
8) Repita 2) a 6), pero para los diodos D1 a D8.
9) Repita 1) a 8), para cada nuevo ciclo completo.

Con eso, cada diodo estará encendido con un ciclo de trabajo de 1/4 (lo que es bueno, teniendo en cuenta que tiene 16 diodos). Y sí, puedes mezclar PWM con esta idea, si quieres controlar gradualmente el brillo.

Como dije, esta solución no excede la clasificación de 20 mA por LED, por lo que el brillo máximo que verá será 1/4 del brillo máximo que cada LED puede producir. Si desea más brillo, use LED que produzcan más mcd / mA. Esto mantendrá intacta su larga vida.

Gracias a la alta capacidad de corriente de U1, la cantidad de luz que producirá cada LED no dependerá del número total de LED que estén encendidos.

Y, solo necesitas seis líneas GPIO de tu MCU. Con solo un IC externo, en lugar de decodificadores + buffers o transistores. Esto es más costoso, pero más compacto (si es crítico), y con un cableado ligeramente más sencillo (seis líneas, en lugar de ocho, van a la matriz de LED). Esta es una respuesta más curiosa y académica, en mi opinión.

Añadido para Federico Russo: lo que dice ya se abordó en mi párrafo "Como dije, esta solución [...]". Forzar 80 mA a través de un LED de 20 mA, incluso durante 1/4 del tiempo, no es una buena idea. Su vida se acortará. Y no debido a la excesiva disipación (que es lo mismo), sino debido a la electromigración (que es proporcional a la corriente). Consulte esta referencia De Cree. Extracto:

  

Pulsación repetitiva

     

El segundo tipo de condición de sobrecorriente, repetitiva de alta corriente   pulsante, puede o no resultar en una falla catastrófica temprana de la   LED. La pulsación repetitiva de alta corriente puede resultar en una vida más corta   expectativa para el LED en comparación con la vida útil esperada habitual, en el   Orden de decenas o cientos de miles de horas. Un dispositivo particular   sometido a transitorios repetidos a una amplitud un porcentaje superior   Los límites de la hoja de datos pero por debajo del umbral requerido para   La falla de un solo pulso todavía eventualmente fallará. El mecanismo de falla   probablemente se deba a la electromigración ya que hay suficientes iones metálicos   finalmente se alejó de sus posiciones originales de celosía.

Si desea la misma vida y la misma luz para menos corriente, use LED que produzcan más mcd a 20 mA.     

respondido por el Telaclavo
0

Para encender una gran cantidad de LED, un controlador IC como TLC 5940 es una excelente opción.

Solo requiere 7 pines de una MCU para 16 LED, y los controladores se pueden cablear en serie para hasta 100 s de LED.

enlace

enlace

    
respondido por el kevinf

Lea otras preguntas en las etiquetas