Problema con multiplexacion de display 7 seg. Hecho de leds

Buenas a todos, les comento que estoy realizando una marcador deportivo digital como ayuda comunitaria para un colegio.

Estoy utilizando un atmega328p programado directamente por ISP con un arduino UNO.

Bueno he realizado la software y el hardware.

Los display estan hecho basados en el 7seg. Usando 5 leds rojos en serie por segmento. Cabe destacar, que los leds son de 10mm, altobrillo, con un angulo maximo de 45º de emision. Y los alimento con 12v.

En el programa, hice una matriz con los numeros en binarios tipo BCD y luego esta salen a un 74ls47. Para que me controle el led 7seg.

Así:

const unsigned short DIGITOS[] =
{
B0000,//0
B0001,//1
B0010,//2
B0011,//3
B0100,//4
B0101,//5
B0110,//6
B0111,//7
B1000,//8
B1001,//9
B0000,//10
};

Luego multiplexo los display controlando los anodos comun con salidas digitales, que a su vez van a un uln2003a, luego un transistor, y finalmente al anodo.

Pin de salida digital>>Entrada uln2003a>>|---------|Salida uln2003a<<Resistencia<<base trans PNP

Adjunte como los conecte.

Para multiplexar los 14 displays enciendo uno, doy el numero correspondiente, y lo apago. Eso lo hago sucesivamente con los otros 13.

PORTD = DIGITOS[segundos1]; //

digitalWrite(disp1, HIGH);
delay(1.5);
digitalWrite(disp1, LOW);
PORTD = 0xff;
PORTD = DIGITOS [segundos2];
digitalWrite(disp2, HIGH);
delay(1.5);
digitalWrite(disp2, LOW);
PORTD = 0xff;
PORTD = DIGITOS [minutos1];
digitalWrite(disp3, HIGH);
delay(1.5);
digitalWrite(disp3, LOW);
PORTD = 0xff;
PORTD = DIGITOS[minutos2];
digitalWrite(disp4, HIGH);
delay(1.5);
digitalWrite(disp4, LOW);
PORTD = 0xff;
PORTD = DIGITOS[visitante1];
digitalWrite(disp5, HIGH);
delay(1.5);
digitalWrite(disp5, LOW);
PORTD = DIGITOS[visitante2];
digitalWrite(disp6, HIGH);
delay(1.5);
digitalWrite(disp6, LOW);
PORTD = 0xff;
PORTD = DIGITOS[local1];
digitalWrite(disp7, HIGH);
delay(1.5);
digitalWrite(disp7, LOW);
PORTD = 0xff;
PORTD = DIGITOS[local2];
digitalWrite(disp8, HIGH);
delay(1.5);
digitalWrite(disp8, LOW);
PORTD = 0xff;
PORTD = DIGITOS[faltasvisitante];
digitalWrite(disp9, HIGH);
delay(1.5);
digitalWrite(disp9, LOW);
PORTD = 0xff;
PORTD = DIGITOS[faltaslocal];
digitalWrite(disp10, HIGH);
delay(1.5);
digitalWrite(disp10, LOW);
PORTD = 0xff;
PORTD = DIGITOS[periodo];
digitalWrite(disp11, HIGH);
delay(1.5);
digitalWrite(disp11, LOW);
PORTD = 0xff;
PORTD = DIGITOS[tiempoextra];
digitalWrite(disp12, HIGH);
delay(1.5);
digitalWrite(disp12, LOW);
PORTD = 0xff;

El problema radica en que si les pongo 5 de delay para los 14 display se ve el parpadeo. Si se lo bajo a 1.5 ya no se ve el parpadeo, pero la luminosidad de los led cayo fuertemente.

Creo que es porque entre mas pequeño sea el delay, el voltaje que sale en los pines digitales va disminuyendo, y creo que no alimentan bien la base del uln2003a, y a su vez los transistores pnp (2n3906) no trabajan bien.

Ahora si cambio el voltaje de alimentacion de 12v a 15v (el pic se alimenta por un 7805 que baja los 12-15v a 5v), los leds brillan un poco mas fuerte, pero lo maximo de amperaje que logro que obtengan es de 3-4mA. Cuando lo ideal es que brillen con 10mA que es un brillo fuerte. Si le pongo 18v brillan totalmente fuertes, pero los transistores me dejan de conmutar bien y los displays cuando hacen su función de contar se ven mal (los segmentos que deben apagarse se mantienen encendidos con poco brillo,y los que deben estar encendido sobresalen de brillo un poco. a veces hasta se reinicia), y los transistores empiezan a calentar mas de lo debido.

No se como hacer brillar mas los led, no se si es el transistor en los anodos que no me deja pasar suficiente corriente. No se si sera por el voltaje.

Quisiera su ayuda, si necesitan otra informacion de mi circuito me dicen.

Captura1.JPG

Saludos
Te recomiendo reemplazar el transistor y el uln2003 por mosfet canal N, de esta manera tienes mayor amperaje y puedes usar la salida del arduino.

Otra cosa estas usando PIC's o el Atmega328? porque al final haces referencia a la alimentación de los pics.

Para facilitar el desempeño te recomiendo en dividir las pantallas en grupos de máximo 8 displays, y controlar las multiplexaciones por separado para cada grupo. Puedes usar los 74595 para no usar tantos pines.

Por diosssssssssss se perdio mi respuesta.
Basicamente era MOSFET como dice max pero tambien aumentar la corriente.
Usar una fuente de PC ATX puenteando cable verde y negro, la tienes en marcha.
12VDC varios amperes.

Usar una rutina de timer a 250hz y dentro se multiplexan los digitos.
Todo eso lo hace el MAX7219 sin nada de trabajo.

Ahora no voy a volver a escribir todo lo que puse, pero analizaba las corrientes y la caida de tensión de los diodos.
Hablaba tambien de ver en la hoja de datos del LED cual es la caida de tensión con picos de corriente de 1A por algunos useg y no milisegundos. Ojo que se quema si aumentamos corriente con 1.5mseg (no estoy seguro pero creo que si).
Debo disculparme por la sugerencia de 1A. Lo tenía en la cabeza y acabo de recordar donde se usa y nada tiene que ver con paneles matriciales. Se usan en emisores IR donde se pretende llegar a grandes distancias. La emisión es de algunos useg a corrientes tan altas como 1A. Pero para los led de un panel la corriente maxima es de 120mA

Resumiendo: si usas MAX7219.. todo resuelto en un dos x tres.
Si usas 74LS47 y MOSFET recomiendo un rutina de timer a 250 hz (frecuencia de multiplexado del MAX7219) y dentro se comanda cada digito.

Este post no usa cosas muy complicada y se ven bien los leds
Tal vez hay que registrarse para verlo.

Usa 2n3906 y aca esta el video en youtube

Aca mas ideas, que son básicamente las mismas. Tiene códigos.
Pero veo que no hace falta lo que plantee.

Aca un muy buen esquema, observá el manejo de lineas y columnas

Este esquema tiene un código y acá esta la aproximación a lo que debería hacerse

La única contra que esta hecho para ATMEGA pero hacerlo ARduino compatible no es problema.

Gracias max_saeta y surbyte.

@max_saeta:
Segun la hoja de datos del 2n3906, el transistor soporta hasta 200mA, y como quiero suministrarle a cada segmento 10mA seria 70mA aprox. No llega ni a la mitad de los 200mA que segun el fabricante dice. Ahora un mosfet me da mas corriente, pero valdra la pena el cambio? es que como te dije, al ponerle 18v los led brillan mas, pero no trabaja bien en ese momento las funciones de la pizarra, los numeros se ven mal y cosas asi. Y estoy usando Atmega328p, lo de pic fue un error por malas constumbres.

@surbyte:

No conocia ese IC, me hubiera ahorrado varios problemas, pero primero no se encuentra en mi localidad, y el marcador deportivo ya lo tengo montado, lo que sucede es que trabajando dentro de mi casa se veian bien los led, pero al sacarla al exterior me di cuenta de lo mal que se ven los display por la falta de brillo en los leds y a su vez por la falta de corriente o voltaje, no se cual. Asi que por los gasto que llevo haciendo, se me complica un poco cambiar tan radicalmente mi circuito. Estoy buscando es como mejorar el brillo, o jugando con la programacion o con la configuracion de los transistores, a ver que estoy haciendo mal.

Por otro lado, como seria hacer esa rutina de timer a 250mhz que me dices?

Mejoremos el diseño de tu esquema electrónico. Dices que ahora esta entregando 2 a 5 mA cuando alimentas con 12VDC.
12V es un valor apropiado para este proyecto. El tema es que tienes 5 leds en serie, yo haria esta prueba.
Conectaria los 5 leds en serie a 12VDC con alguna limitación de corriente para no quemarlos.
Queremos 20mA o queremos algo mas todavía, digamos 50mA pero por un corto período de tiempo.
Supongo que son LEDs comunes? o son de alto brillo?
Si son comunes acá según la hoja de datos tenemos una caída tíipica a 20mA de 2.2Volts x 5 = 11Volts
O sea que 12-5xVled = 1V
Si quiero 20mA eso será para 100% de la corriente pero si le doy pulsos debería subir el valor.
Seamos conservadores y veamos con 20mA primero y luego con 50mA

1/20mA = 50 ohms o 47 que es el valor mas proximo.
1ra prueba los 5 leds en serie alimentados con 12VDC y una R de 47ohms

1/50mA = 20 ohms, ve si consigues 18 o 22 ohms.
Segunda prueba lo mismo con R de 18 o 22 ohms. Aca para la prueba no dejes continua la corriente porque lo vas a quemar. Dale toques con el cable o pin de prueba.
Mejoró el brillo!! bien... ahora veamos el circuito.

Del lado superior tienes el ULN2003 que entrega facilmente max 500mA por RAMA y ya que no estarán todas las ramas ON a la vez ese es nuestro primer cambio. Elimina el 2N3906 y las Resistencias de base.
Deja solo el ULN2003 en la parte superior.

En la inferior dejamos como esta el circuito. Por si acaso, usa el resistor de 22/18 en la rama inferior en serie con los 5 LEDs. No queremos quemarlos.

Ahora ejecuta tu sketch tal como esta y veamos si mejoró.

Si mejoró veamos luego de corregirlo para que trabaje mas eficientemente.
ahora el objetivo es sacar la corriente necesesaria.

Surbyte, los LEDs son altobrillo, de 10mm. Estos:

http://www.effled.com/10mm-led-10mm-round-led-p-42.html

Te anexare una foto de los display para que estes un poco mas familiarizado con lo que estoy haciendo.

Acerca de quitar los 2n3906. El uln no suministra ni corriente ni voltaje hasta donde se yo. Si le quito el transistor quien conmutará la corriente y el voltaje al display?

Y por cierto no son 14 displays completos, son 12. Los otros dos son los 1 que encienden con una sola salida. Que de hecho este brilla mas que los otros, pero me imagino que es porque no se esta apagando y encendiendo como los otros si no que cuando el numero es mayor a 99 se enciende y ya, hasta que sea 99 de nuevo. y no lo tengo conectado a otro transistor (el de los catodos al 74ls47) como en los digitos, sino que con una resitencia a tierra.

Captura3.JPG

Bien, entonces tus leds pueden a tener una caida de tensión de supongamos 2V x 5 = 10
Nos quedan 2 a priori... es algo menos por la saturacion del 2n3906 y ya veremos el ULN2003

Apartado para el ULN2003.
Todo lo que se usa en electrónica lo hace con tensión y corriente, será suficiente o no para mi aplicación, pero que eso te quede claro. No esta porque si, porque si de nada sirviera, exita directamente desde el arduino y ya, para que gastar en algo que no hace nada?
Pues no es así.
Primero hoja de datos
Mira en google (mi eterno ayudante) y que leo del ULN2003
Guauu HIGH-VOLTAGE, HIGH-CURRENT DARLINGTON TRANSISTOR ARRAYS
bueno ARREGLO DE TRANSISTORES DARLINGTON DE ALTA TENSION Y CORRIENTE GUAUU x 2.

O sea.

El uln no suministra ni corriente ni voltaje

es un error de tu parte.
Por eso te dije para que usas los transitores, no tienen ningún sentido en ese lado del circuito.

FEATURES ULN2002A, ULN2003A, ULN2003AI, ULN2004A, ULQ2003A, ULQ2004A
• 500-mA-Rated Collector Current (Single Output)
• High-Voltage Outputs: 50 V
• Output Clamp Diodes
• Inputs Compatible With Various Types of Logic
• Relay-Driver Applications

Bueno mas que justificado. Sin embargo si miras la hoja de datos dice que los 500mA es por de a 1, a medida que usas mas salidas cae la corriente disponible por rama.
Si usas todos A LA VEZ no mas de 120 mA aprox.
Pero no vamos a usar todos a la vez asi que seguimos en 500mA

Como el Comun se conectará a 12VDC no me preocupo por la tensión de salida que supongo será un aprox 12VDC

mira este esquema

El único problema que no habia reparado es que el ULN está diseñado como colector abierto y por tal, como esta no va a funcionar pero en el esquema se ve que si lo dispones al revés si.
Entonces el ULN2003 va abajo, o mejor dicho, los catados de los LEDs miran hacia el ULN2003 y será quien maneje el control de los segmentos de los displays.

Y usaremos los 2n2906 para entregar los 12V lo mas próximo posible, seguramente serán 11.8 por la saturación del transistor.

surbyte:
Bueno mas que justificado. Sin embargo si miras la hoja de datos dice que los 500mA es por de a 1, a medida que usas mas salidas cae la corriente disponible por rama.
Si usas todos A LA VEZ no mas de 120 mA aprox.
Pero no vamos a usar todos a la vez asi que seguimos en 500mA

Como el Comun se conectará a 12VDC no me preocupo por la tensión de salida que supongo será un aprox 12VDC

mira este esquema

El único problema que no habia reparado es que el ULN está diseñado como colector abierto y por tal, como esta no va a funcionar pero en el esquema se ve que si lo dispones al revés si.
Entonces el ULN2003 va abajo, o mejor dicho, los catados de los LEDs miran hacia el ULN2003 y será quien maneje el control de los segmentos de los displays.

Y usaremos los 2n2906 para entregar los 12V lo mas próximo posible, seguramente serán 11.8 por la saturación del transistor.

exacto amigo, el uso del uln es recibir la corriente de la carga y llevarla a tierra, y es controlada por su entrada que es la base. Mirando el esquema que pusiste, esa era mi idea principal. pero el arreglo que haces con el pnp y npn en la parte del comun es lo que hago con el uln y los transistores pnp. es lo mismo, solo que el uln ocupa menos espacio por ser un encapsulado. El de los siete seg, no recuerdo bien si lo probe, pero si recuerdo que lo hice con transistores npn y nada, no funcionaba bien. No se cual es mi error que no me deja encontrar bien la ganancia de corriente.

Pero ahora no es capricho de mi parte.. es que tu esquema no entrega corriente apropiada.

Has hecho algo de todo lo que te he pedido probar?
A ver.. probaste los leds como te pedí con el resistor? iluminan bien?
Lo probaste con el de 18/22 ohms e imitaste un pulso corto de corriente?

surbyte:
Pero ahora no es capricho de mi parte.. es que tu esquema no entrega corriente apropiada.

Has hecho algo de todo lo que te he pedido probar?
A ver.. probaste los leds como te pedí con el resistor? iluminan bien?
Lo probaste con el de 18/22 ohms e imitaste un pulso corto de corriente?

Al principio le tenia puesto una resitencia de 82 y brillaban opaco, les puse una de 20 a un segmento y no note el cambio de intensidad del brillo. De verdad que no lo he probado con todos los segmentos. Porque luego le quite la resistencia a todos los segmentos y los puse directamente al colector. Es asi como he podido conseguir al menos 3mA con 12v y 6mA con 15v, medido con un amperimetro.

Pero sabes porque ocurre eso?
Porque toda la linea superior inferior no esta funcionando bien.
Vamos de nuevo porque no entiendes el problema que te señalo.

Los diodos tienen una caida importante.. que aproxima a la fuente de 12V. Si los 5 diodos tienen una caida a 20mA de 10V, debes asegurarte que los dos transistores saturan bien. Si no lo hacen, nunca entregaran 20mA o 100mA.

Si usaste una R de 82 ohms y segun mis cuentas deberias tener
12 - 5x Vled - Vce sup - Vce inf = 0 esta ecuacion define en todo momento que ocurre entre tu fuente tus leds y tus transistores.
Pero esas Vce seran 0.1 o 0.2 volts si solo si reciban la corriente de base necesaria.
Supongamos 20mA con hfe 100 => 20/100 = 200uA. Bien.. parece facil y lo es. Pero veamos si se cumple
En la rama de arriba tienes un 2n2906 conectado a 12VDC en su emisor, colector a los LEDs y base a las resistencias de polarizacion. No se donde esta conectado el comun del ULN2003, supongo que a 12V.
Como conducen x LOW no hay problema alguno.

Sin embargo miremos la parte inferior. con el 74LS47 de un lado intentando entregar dijimos 200uA con una corriente entrante..
Resulta que la hoja de datos dice que la corriente máxima IoL es 4mA con 0.4V como VoL asi que se restringe aun mas la calidad de brillo.
Peroooo esa corriente es saliente y no entrante ya que tenemos un PNP y la corriente fluye hacia el 74LS47 y no del LS47.
Asi que aunque no creo que sea 0, debe ser muy baja... conclusión ese transistor apenas satura.
Pagina 13 de la hoja de datos del 74LS47

Asi que resolver esa parte, a menos que este equivocado.
Alguien que revise!!!

surbyte:
Pero sabes porque ocurre eso?
Porque toda la linea superior inferior no esta funcionando bien.
Vamos de nuevo porque no entiendes el problema que te señalo.

Amigo de antemano gracias por dedicarte a ayudarme, y te pido disculpas por ser un poco lento y no entender. Voy a intentar ordenar tus ideas y entender.

surbyte:
Si usaste una R de 82 ohms y segun mis cuentas deberias tener
12 - 5x Vled - Vce sup - Vce inf = 0 esta ecuacion define en todo momento que ocurre entre tu fuente tus leds y tus transistores.
Pero esas Vce seran 0.1 o 0.2 volts si solo si reciban la corriente de base necesaria.
Supongamos 20mA con hfe 100 => 20/100 = 200uA. Bien.. parece facil y lo es. Pero veamos si se cumple
En la rama de arriba tienes un 2n2906 conectado a 12VDC en su emisor, colector a los LEDs y base a las resistencias de polarizacion. No se donde esta conectado el comun del ULN2003, supongo que a 12V.
Como conducen x LOW no hay problema alguno.

Bueno, entonces usted dice que esta parte esta bien?

surbyte:
Sin embargo miremos la parte inferior. con el 74LS47 de un lado intentando entregar dijimos 200uA con una corriente entrante..

Resulta que la hoja de datos dice que la corriente máxima IoL es 4mA con 0.4V como VoL asi que se restringe aun mas la calidad de brillo.

Aca es parte de lo que no entiendo. Primero que todo en la pagina 13 del datasheet, es referente al 74ls49. En la 11 se trata del 74ls47. Ahora dices que con el calculo para la corriente de base necesaria, te da 200uA. Y que la corriente maxima que puede procesar una salida del 7447 es de 4mA. Pero me dices que eso lo limita, por que? Si 4mA es mucho mas que 200uA. Es por VoL?

surbyte:
Peroooo esa corriente es saliente y no entrante ya que tenemos un PNP y la corriente fluye hacia el 74LS47 y no del LS47.
Asi que aunque no creo que sea 0, debe ser muy baja... conclusión ese transistor apenas satura.
Pagina 13 de la hoja de datos del 74LS47

Asi que resolver esa parte, a menos que este equivocado.
Alguien que revise!!!

Exacto la corriente fluye desde el la base, hacia las salidas del 74ls47. La corriente es saliente si hablamos del transistor, y entrante si hablamos del 74LS47. Por que crees que la corriente de base en esos transistores es muy baja? Por VoL=0.4 cuando esta a nivel bajo? Pero la corriente que sale de la base de un trasistor PNP no es la division de la entrante por emisor?

Vuelvo a pedir disculpas por las molestias.

Porque la Iol en el LS47 tiene que ser entrante y es saliente.
La Iol de 4mA es salientes del LS47, como para exitar un NPN, no para un PNP, los 4mA son desde el LS47 hacia la base del 2n2906 pero no es lo que necesitas. Necesitas a la inversa.

Bueno como hoy no me siento bien y son las 4:47 Am me puse a hacer tu circuito y acá esta lo que te digo.

Y el broche para cerrar esto
Que te dije antes, poner el ULN2003 como driver en la parte inferior y el LS47 arriba con lo que ya tenés.

185 mA teóricos.con una fuente de 15V, cierto veo con 12 y te agrego que corriente obtengo.
Con 12V solo 45mA que es una barbaridad considerando que solo esas en 4 o 5mA por rama de leds no?

Bueno, digamos asi:

Este es mi circuito actual.

El cual podemos decir que es para configuración anodo comun porque el control del comun va al anodo del display.

Lo unico que no entiendo, es que si se fija en mi imagen con el DC ampermeter me dice que la corriente esta fluyendo desde el Transistor al 74ls47.

Una cosa, es obligatorio poner el comun del uln2003 a 12v? en este circuito simulado en proteus se lo puse, pero en el fisico no... Luego en el proteus se lo quite de 12v y no me conmuta bien.

Ese esquema que usted me proporciona es para catodo comun, y realmente viendolo bien, me hubiera restado bastante transistores. Pero eso me haría tener que cambiar la construcción de los display.

Por dios angelrendiles, se puede trabajar en electrónica sin ser electrónico pero se requiere sentido común.
Si no lees las hojas de datos y los esquemas típicos de los componentes tendras problemas todo el tiempo.
EL ULN2003 debe llevar el COMUN a la tensión de trabajo, porque es COLECTOR ABIERTO.

Por otro lado, en lo que muestras e lee 11mA y con 11mA no iluminas nada.

Yo ya te dije como modificar las cosas para obtener corriente. A mi esquema le debes agregar una resistencia para limitarla. No vas a dejar que circulen 45 o 100 mA sin limitación.

Al menos hay que probar con una R y ver como trabaja, en función del ciclo de multiplexado que quede. Esos 1.5mseg que por ahora es lo que hay.

surbyte:
Por dios angelrendiles, se puede trabajar en electrónica sin ser electrónico pero se requiere sentido común.
Si no lees las hojas de datos y los esquemas típicos de los componentes tendras problemas todo el tiempo.
EL ULN2003 debe llevar el COMUN a la tensión de trabajo, porque es COLECTOR ABIERTO.

Por otro lado, en lo que muestras e lee 11mA y con 11mA no iluminas nada.

Yo ya te dije como modificar las cosas para obtener corriente. A mi esquema le debes agregar una resistencia para limitarla. No vas a dejar que circulen 45 o 100 mA sin limitación.

Al menos hay que probar con una R y ver como trabaja, en función del ciclo de multiplexado que quede. Esos 1.5mseg que por ahora es lo que hay.

Cierto amigo, no me concentre en leer esa parte del datasheet, y lo obvie. Cuestiones de ser aun un novato.

Gracias por su recomendaciones y por proveerme ese esquema, voy a trabajar en funcion de el, y de tener resultados los comento por aca.