TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: piccar56 en 14 de Julio de 2008, 14:46:13

Título: controlar 50 leds RGB
Publicado por: piccar56 en 14 de Julio de 2008, 14:46:13
hola
soy nuevo en el foro,  pero conosco algo de  microcontroladores pic, lo quiero hacer es controlar 50 leds rgb con un pic 16f877A (25 leds deben poder mostrar un color diferente a los otros 25 leds).

Por el momento pude  controlar 8 leds rgb usan un codigo que encontre en este foro; estos 8 leds los controlo mediante  un pic16f877a y tres demultiplexor 74ls137(demultiplexor de 1 a 8) de tal forma  que  a cada demultiplexor le envio un color del led rgb, es decir le conecto el pin del PIC(correspondiente  a ese color),  luego mediante  tres lineas   rd0;rd1:rd2 manejo los demultiplexores para conmutar la salida de la señal entre las 8 posibles salidas de esta forma  poder  controlar 8 led rgb conn solo 3 señales de pwm;
probe el circuito  a 4 mhz y se podia apreciar como se seleccionaba cada uno de los 8 leds; pero al probar con un crystal  de 20 mhz parecia que todos los leds estaban encendidos todo el tiempo.
quiero que me ayuden con ideas de como puedo controlar 50 leds rgb
de  antemano muchas gracias
pdt: les adjunto el archivo en proteus como el codigo del pic
Título: Re: controlar 50 leds RGB
Publicado por: Leon Pic en 14 de Julio de 2008, 18:17:00
Hola piccar56, no entiendo bien tu problema. ¿qué es lo que no puedes lograr, controlar 5o led rgb, o que  se vea la sección?
Título: Re: controlar 50 leds RGB
Publicado por: piccar56 en 15 de Julio de 2008, 12:07:38

gracias Leon Pic por prestarme atención.
como mencione anteriormente  ya puedo controlar 8 leds rgb ( con solo 3 pwm ); mi problema ahora es ¿Como controlar 50 led RGB ? no se me ocurre ninguna  idiea :(
Título: Re: controlar 50 leds RGB
Publicado por: jfh900 en 15 de Julio de 2008, 15:02:08
¿Todos se encienden al mismo tiempo?, me refiero cada color se enciende al mismo tiempo o lo que es lo mismo ¿cada pwm controla el color de los 8 leds?

Un saludo
Título: Re: controlar 50 leds RGB
Publicado por: piccar56 en 15 de Julio de 2008, 16:10:49
hola
no entiendo bien tu pregunta; yo controlo 8 led rgb mediante  3 pwm gracias al demultiplexor de 1 a 8; es como si solo controlara un led rgb ( solo mando tres señales  pwm las cuales demultiplexo para los 8 led rgb); por lo consiguiente solo puedo ver  un color en los 8 leds rgb.
el codigo es el siguiente:
Código: [Seleccionar]
#include "F:\CCS_C\led_RGB\prueba7.h"
// prueba  de tre pwm para un led
#byte portb=6
#byte portd=8
#define PWM1_OUT   PIN_B0
#define PWM2_OUT   PIN_B1
#define PWM3_OUT   PIN_B2
char   Keypress=' ';
int temp_duty_cycle1;
int temp_periodo1;
int duty_cycle1;
int periodo1;
int temp_duty_cycle2;
int temp_periodo2;
int duty_cycle2;
int periodo2;
int temp_duty_cycle3;
int temp_periodo3;
int duty_cycle3;
int periodo3;
int contador=0;
int control=0;
void conmutar() //comuntar los 8 leds rgb
{
if (control==9)
{
control=0;
}
switch (control)
{
case 1:
portd=0;
break;
case 2:
portd=1;
break;
case 3:
portd=2;
break;
case 4:
portd=3;
break;
case 5:
portd=4;
break;
case 6:
portd=5;
break;
case 7:
portd=6;
break;
case 8:
portd=7;
break;
}
control++;

}
#int_RTCC
void  RTCC_isr(void)
{
set_timer0(156);
////////////////////////////////////////////////////
   if(duty_cycle1==0)
   {
      OUTPUT_BIT(PWM1_OUT,0);
      goto aqui;
   }
   else{
      OUTPUT_BIT(PWM1_OUT,1);
      --duty_cycle1;
   }
aqui:
   if(periodo1==0){
      duty_cycle1=temp_duty_cycle1;
      periodo1=temp_periodo1;
      conmutar();
   }
   else{
      --periodo1;
   }
////////////////////////////////////////////////////
if(duty_cycle2==0){
      OUTPUT_BIT(PWM2_OUT,0);
      goto aqui2;
   }
   else{
      OUTPUT_BIT(PWM2_OUT,1);
      --duty_cycle2;
   }
aqui2:
   if(periodo2==0){
      duty_cycle2=temp_duty_cycle2;
      periodo2=temp_periodo2;
   }
   else{
      --periodo2;
   }
//////////////////////////////////////////
   if(duty_cycle3==0){
      OUTPUT_BIT(PWM3_OUT,0);
      goto aqui3;
   }
   else{
      OUTPUT_BIT(PWM3_OUT,1);
      --duty_cycle3;
   }
aqui3:
   if(periodo3==0){
      duty_cycle3=temp_duty_cycle3;
      periodo3=temp_periodo3;
   }
   else{
      --periodo3;
   }
////////////////////////////
}
void main()
{  temp_periodo1=80;
   temp_periodo2=80;
   temp_periodo3=80;
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   enable_interrupts(int_rda);
   set_timer0(156);
   set_tris_b(0b00000000);
   set_tris_d(0b00000000);
   portd=0;
   
   while(1)
   {
   ///ROJO
   temp_duty_cycle1=110;//50;//0;
   temp_duty_cycle2=0;//50;//110;
   temp_duty_cycle3=0;//50;//110;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// NARANJA
   temp_duty_cycle1=110;
   temp_duty_cycle2=50;
   temp_duty_cycle3=0;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// AMARILLO
   temp_duty_cycle1=110;
   temp_duty_cycle2=110;
   temp_duty_cycle3=0;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// VERDE AGUA
   temp_duty_cycle1=50;
   temp_duty_cycle2=110;
   temp_duty_cycle3=0;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// VERDE
   temp_duty_cycle1=0;
   temp_duty_cycle2=50;
   temp_duty_cycle3=0;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// CELESTE
   temp_duty_cycle1=0;
   temp_duty_cycle2=110;
   temp_duty_cycle3=110;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// AZUL CLARO
   temp_duty_cycle1=0;
   temp_duty_cycle2=50;
   temp_duty_cycle3=110;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// AZUL OSCURO
   temp_duty_cycle1=0;
   temp_duty_cycle2=0;
   temp_duty_cycle3=110;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// VIOLERA OSCURO
   temp_duty_cycle1=50;
   temp_duty_cycle2=0;
   temp_duty_cycle3=110;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// VIOLETA CLARO
   temp_duty_cycle1=110;
   temp_duty_cycle2=0;
   temp_duty_cycle3=110;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   /// BLANCO
   temp_duty_cycle1=110;
   temp_duty_cycle2=110;
   temp_duty_cycle3=110;
   for(contador=0;contador<30;contador++)
   {
   delay_ms(100);
   contador++;
   }
   }
}



mi nueva pregunta es:
¿COMO PUEDO MANEJAR  MAS LED RGB SIN NECESIDAD DE INCREMENTAR MIS PWM?
de ante mano graicas por la respues
Título: Re: controlar 50 leds RGB
Publicado por: LABmouse en 15 de Julio de 2008, 16:20:37
Usa in circuito integrado dedicado a controlar leds RGB. si te sirve asi, me avisas y te busco la referencia de uno marca Texas y del que tengo unas muestras aca pero por falta de tiempo no los tengo trabajando.

Saludos!
Título: Re: controlar 50 leds RGB
Publicado por: piccar56 en 15 de Julio de 2008, 19:00:00
hola picmouse
tu idea me parece interesante   :) me podrias dar la  referencia de ese circuito integrado que mencionas
de  antemano muchas gracias
Título: Re: controlar 50 leds RGB
Publicado por: LABmouse en 15 de Julio de 2008, 19:57:43
The TLC5941 is a 16-channel, constant-current sink, LED driver. Each channel has an individually adjustable 4096-step grayscale PWM brightness control and a 64-step constant-current sink (dot correction). The dot correction adjusts the brightness variations between LED channels and other LED drivers. Both grayscale control and dot correction are accessible via a serial interface. A single external resistor sets the maximum current value of all 16 channels.

The TLC5941 features two error information circuits. The LED open detection (LOD) indicates a broken or disconnected LED at an output terminal. The thermal error flag (TEF) indicates an overtemperature condition.

Hasta detecta si el LED esta dañado...   Cool

Son 4096 pasos por cada color!!!!
Título: Re: controlar 50 leds RGB
Publicado por: piccar56 en 17 de Julio de 2008, 18:33:56
Gracias  Picmouse por la información.
a parte del  TLC5941 existe  otro circuito que  me pueda ayudar a controlar 50 leds  RGB?¿

si alguien lo conoce comparta esa informaciñon
de  ante mano gracias
 
Título: Re: controlar 50 leds RGB
Publicado por: LABmouse en 18 de Julio de 2008, 10:21:50
Pero si el TLC5941 lo puede hacer. Solo debes conectarlos en cascada tal cual como esta en el datasheet y asi podras con los 50.

Revisa bien y veras. Ya si quieres un solo dispositivo que controle los 50 al tiempo...Lo unico que puede con eso es una FPGA. Averiguate de eso.

SALUDOS!
Título: Re: controlar 50 leds RGB
Publicado por: splasma2 en 03 de Agosto de 2008, 16:19:53
Hola piccar56, si puedes esperar, en unas semanas (estoy de vacaciones) dejaré en este foro un proyectito que he hecho, similiar al PIC-tengu pero con 16x16 leds bicolor rojo-verde ( 4 matrices de 8x8 compradas en  eBay) , en total 512 LEDs controlados por PWM con lo que en teoria consigo 8 niveles de color, todo controlado con un pic 18F2550 a 40 Mhz y 4 amigos llamados STP16DP05  :lol: :lol:. Me ha costado un poco pero al final he conseguido que funcione, aunque aún faltan depurar algunas cosillas.
Seguro que puedes sacar algunas ideas para tus 50 leds RGB. :)