Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

26/11/2014 #1


Problema con marcador electronico y Displays 7seg hechos de led
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 están hechos basados en el de 7 segmentos, usando 5 leds rojos en serie por segmento.
Cabe destacar, que los leds son de 10mm, alto brillo, con un angulo máximo de 45º de emisión, y los alimento con 12v.

En el programa, hice una matriz con los números en binario tipo BCD y luego de esta salen a un 74ls47 para que me controle el led 7seg.

Así:
Código:
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 ánodos comunes con salidas digitales, que a su vez van a un uln2003a, luego un transistor, y finalmente al ánodo.

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

Adjunto cómo los conecté.

Para multiplexar los 14 displays enciendo uno, doy el número correspondiente, y lo apago.
Eso lo hago sucesivamente con los otros 13.
Código:
            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 cayó fuertemente.

Creo que es porque entre más 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 alimentación de 12v a 15v (el micro se alimenta por un 7805 que baja los 12-15v a 5v), los leds brillan un poco mas fuerte, pero lo máximo 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 más de lo debido.

En sí, no está de más decir, que yo ya monté todo esto en placa y armé todo.
Pero como estaba trabajando dentro de mi casa, no me percaté que en el exterior a luz de sol, los leds no se ven bien.
Primero por la falta de brillo, y otro por el angulo de visión del led. (Cosa que resolví lijando el led)
Ahora no sé cómo hacer brillar más los led, no sé si es el transistor en los ánodos que no me deja pasar suficiente corriente. No sé si será por el voltaje.

En las imágenes les demuestro con un ejemplo, como va conectado un segmento de mi display, puesto que todos los demás tienen la misma estructura.

Quisiera su ayuda, si necesitan otra información de mi circuito, me dicen.
27/11/2014 #2


D@rkbyte ha revivido un muerto...

cuando los digitos son mas de ocho ya no se hace el “barrido” digito por digito, sino por segmento. de esta manera solo hay ocho conmutaciones aunque los digitos sean mas de ocho.

en el video que dejo con 3000uSeg. se dejaban ver bien.

27/11/2014 #3

Avatar de lagg070988

Hola, creo que deberías usar transistores npn, cual es el voltaje que cae en cada led????
Si Valimentacion - 5(vled) >0.7V entonces transistor conduce ( el pequeño brillo de los led.)
27/11/2014 #4

Avatar de JoaquinFerrero

Perdón, pero, ¿para qué sirven las instrucciones PORTD = 0xff;?

Y... me parece que te sobra completamente el arreglo DIGITOS. Es decir, en lugar de usar

PORTD = DIGITOS[minutos2];

ponerlo así:

PORTD = minutos2;
27/11/2014 #5


Hola, gracia por sus respuestas a todos.

@alesergi

No comprendi muy bien como realizar eso del barrido por segmento.


@lagg070988

Intente primeramente usar un NPN, pero nunca me dio resultado, te explico: Si te fijas en mi circuito, los 12v son controlados por el primer transistor (foto superior), entran al emisor y van al colector donde esta el anodo comun de los display de led. Los catodos van a otro transistor (foto inferior) que es controlado por el 74ls47, y este lleva el segmento a tierra desde el emisor al colector. Por alli una vez lei que decian que jamas se pone la carga en el emisor, sino en el colector, en un NPN. Por eso use un PNP en la parte superior, usando como driver un uln para la base de este PNP. En el transistor inferior, yo use un npn colocando el catodo al colector y el emisor a tierra. Pero no funciono, y no se por que. Asi que use un PNP colocando el catodo al emisor y el colector a tierra, y funciono. Pero sigo teniendo estos problemas de corriente. Y que los leds no brillan bien.

@JoaquinFerrero

PORTD = 0xff; Esa sentencia la uso al final de cada display encendido y apagado para limpiarlo(apagar todos los segmentos), antes de encender un nuevo display y dar un nuevo digito. Esto porque sin eso se notaban pequeños brillos en segmentos de un display, que pertenecian al display anterior. No se si me explico, es decir, si en el tiempo hay un dos display mostrando un 21 por ejemplo. en el display del uno se veian a bajo brillo los segmentos del 2. Y daba mal gusto eso.

Y lo que pasa es que en ese arreglo yo tengo en BCD los numero del 0 al 9. Uso un for para realizar un contador para el tiempo, que me va sumando ++ la variables minuto1,minuto2, y asi sucesivamente, entonces al hacer PORTD = DIGITOS[minutos2]; estoy diciendo:

El puerto D sera igual (en BCD y uso 4 pines de salida) a = el numero BCD en el arreglo DIGITOS[Y la variable minuto2 me dira la posicion del numero BCD en la matriz]

Ordenando bien el arreglo[0,1,2,3...] me muestra en el display el numero que quiero.
27/11/2014 #6

Avatar de JoaquinFerrero

Angel Rendiles dijo: Ver Mensaje
PORTD = 0xff; Esa sentencia la uso al final de cada display encendido y apagado para limpiarlo (apagar todos los segmentos), antes de encender un nuevo display y dar un nuevo digito.
Un momento... si mandas un 0xFF estás activando todas las salidas.

Edito: vale, ya veo que el ULN2003A funciona con lógica inversa.

Angel Rendiles dijo: Ver Mensaje
Esto porque sin eso se notaban pequeños brillos en segmentos de un display, que pertenecian al display anterior. No se si me explico, es decir, si en el tiempo hay un dos display mostrando un 21 por ejemplo. en el display del uno se veian a bajo brillo los segmentos del 2. Y daba mal gusto eso.
Seguramente porque hay un tiempo de conmutación entre los dos transistores que gobiernan los dos display. Quizás hay que poner un retraso entre el momento en que apagas un transistor y enciendes el otro.

Angel Rendiles dijo: Ver Mensaje
Y lo que pasa es que en ese arreglo yo tengo en BCD los numero del 0 al 9.
... que, curiosamente, es lo mismo que en binario, así que sí que te sobra ese arreglo

Edito:salvo que tengamos que enviar los datos de forma inversa, en el cual sale mejor hacer un "not" binario del dato a enviar que no localizarle en un arreglo.
27/11/2014 #7


JoaquinFerrero dijo: Ver Mensaje
Un momento... si mandas un 0xFF estás activando todas las salidas.

Edito: vale, ya veo que el ULN2003A funciona con lógica inversa.

Seguramente porque hay un tiempo de conmutación entre los dos transistores que gobiernan los dos display. Quizás hay que poner un retraso entre el momento en que apagas un transistor y enciendes el otro.

... que, curiosamente, es lo mismo que en binario, así que sí que te sobra ese arreglo

Edito:salvo que tengamos que enviar los datos de forma inversa, en el cual sale mejor hacer un "not" binario del dato a enviar que no localizarle en un arreglo.

Ciertamente amigo, toteria de mi, es que principalmente yo enviaba por 7 pines el arreglo de los 7seg para los digitos, y tontamente luego puse en BCD, siendo estos ya binarios. Pero una duda, cuando uso por ejempo un 9 en decimal, en la variable. estoy dando un 00001001, o un 1001. Es decir, los 4 bit mas significativos tambien son afectados por el uso del PORTD? porque si es asi, en esos otros cuatros bit yo tengo otras salidas para otras funciones.
27/11/2014 #8

Avatar de lagg070988

Mira Q13, a la salida del 7447 tienes 5v ó 0v si en el emisor de Q13 hay más de 5.7v, conducirá independiente de sí activas o no por software.

Si usas npn, emisor a gnd, colector a leds, no tienes ese problema.

En el uln2003 si pones 1 ala entrada, queda 0 a la salida, si? Entonces circula corriente por las resistencias de Q12, haciendo que Q12 conduzca. Es como poner 2 not seguidas....

Lo de barrido por segmentos se refiere a que en vez de juntar cátodos o ánodos de cada dígito, juntas cátodos o ánodos de segmentos, todos los A, todos los B.....
Saludos.
27/11/2014 #9


lagg070988 dijo: Ver Mensaje
Mira Q13, a la salida del 7447 tienes 5v ó 0v si en el emisor de Q13 hay más de 5.7v, conducirá independiente de sí activas o no por software.
eso calcule yo cuando le aplico a la etapa de potencia en vez de 12v, le pongo 18v. Me imagino que habría mas de 5v y el transistor no conmuta bien.

lagg070988 dijo: Ver Mensaje
Si usas npn, emisor a gnd, colector a leds, no tienes ese problema.


lagg070988 dijo: Ver Mensaje
En el uln2003 si pones 1 ala entrada, queda 0 a la salida, si? Entonces circula corriente por las resistencias de Q12, haciendo que Q12 conduzca. Es como poner 2 not seguidas....
el uln2003 y el pnp lo uso para lo que se ve en la imagen. De las dos forma creo que es igual. Solo que el uln ocupa menos espacio. Estoy mal?, cabe destacar que no son los valores de las resistencias que uso, esos estan en las primeras imagenes.
Imágenes Adjuntas
Tipo de Archivo: jpg Captura4.JPG (69,2 KB (Kilobytes), 3 visitas)
27/11/2014 #10

Avatar de JoaquinFerrero

Pero es que en las instrucciones

PORTD = DIGITOS[minutos2];

también estás haciendo lo mismo. Aunque estás definiendo DIGITOS con grupos de 4 bits, realmente, el arreglo de DIGITOS contiene unsigned short, así que tus Bxxx son promocionados a enteros cortos (posiblemente bytes o enteros de 16 bit), que luego son reducidos a bytes al ser asignados a PORTD. Así que sí: estás poniendo los 8 bits de golpe.

Edito: Como dices que estás usando las líneas superiores para otras cosas, lo que hay que hacer es una operación lógica de bits para asignar el nuevo valor respetando el estado actual del nibble superior de PORTD:

PORTD = (PORTD & 0xF0) | minutos2;
27/11/2014 #11


Gracias por ese consejo de programacion Joaquien lo implementare a ver que tal me resulta.

Ahora en la intesidad del brillo y la poca corriente que les llega a los segmentos, que me recomiendas?
27/11/2014 #12

Avatar de lagg070988

Estimado, mirando el datasheet de 7447, a modo de sugerencia podrías ahorrarte R23 y Q13, mencionas que necesitas 10mA, la mitad de lo que el 7447 te puede entregar.

Ok con lo del uln2003.

Saludos
27/11/2014 #13


lagg070988 dijo: Ver Mensaje
Estimado, mirando el datasheet de 7447, a modo de sugerencia podrías ahorrarte R23 y Q13, mencionas que necesitas 10mA, la mitad de lo que el 7447 te puede entregar.

Ok con lo del uln2003.

Saludos
Estimado, de hecho ya lo hice. Pero con 12v no consegui mas de 3,8mA. Con 15v consegui aprox como 6mA. y con 18v casi los 10mA pero los transistores que van a los comunes se calentaban mas de lo que deberian creo, ademas de que no conmutaban bien.

(puse los leds a las salidas del 74LS47 directamente, pues supuse que este ya limitaba la corriente de los leds)
28/11/2014 #14

Avatar de lagg070988

Todo lo que queda es calcular los tiempos de encendido de cada segmento

Te interesará esto Controlar 132 Led independiente

Saludos
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.