TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado 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
-
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?
-
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 :(
-
¿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
-
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:
#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
-
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!
-
hola picmouse
tu idea me parece interesante :) me podrias dar la referencia de ese circuito integrado que mencionas
de antemano muchas gracias
-
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!!!!
-
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
-
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!
-
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. :)