Control de leds RGB con Pic

Hoy en dia podemos encontrar una infinidad de anuncios luminosos con efectos multicolor la finalidad de esta practica es crear diferentes gamas de colores utilizando un hardware muy sencillo para manejar la corriente que implica utilizar multiples leds al mismo tiempo.

Objetivo:Generar una secuencia con diferentes gamas de colores usando una barra de leds RGB y pulsos PWM.
Material:

Equipo: Software:

Diagrama

Acerca del integrado ULN2803

El ULN2803 es muy práctico para dar corriente de hasta 500 mA por cada salida, en su interior tiene un arreglo de transistores Darlington, es ideal para relevadores, motores, solenoides y displays. Se puede activar con voltaje TTL (5 Volts).

Código del microcontrolador

#include <16F88.h>
#FUSES NOWDT, INTRC, PUT, NOPROTECT, BROWNOUT, NOMCLR, NOLVP, NOCPD                   
#use delay(clock=4000000)
#use fast_io(B) 
int8 redLed;                                                            //Ciclo de trabajo para el led rojo (0-255)
int8 greenLed;                                                          //Ciclo de trabajo para el led verde (0-255)
int8 blueLed;                                                           //Ciclo de trabajo para el led azul (0-255)
int8 counter;                                                           //contador para comparar el ciclo de trabajo con el periodo del pwm
#int_TIMER2                                                             //Interrupcion cada 50us para simular el pwm
void  TIMER2_isr(void) 
{  counter+=4; 
   if(redLed>counter)                                                    //Se suman 4 para reducir la resolucion del pwm y evitar parpadeos en los
  { output_high(PIN_B0);   }                                             //leds ya que la frecuencia actual del microcontrolador no es suficiente 
  else                                                                   //para un pwm con resolucion de 255
  { output_low(PIN_B0);    }
  if(greenLed>counter)
  { output_high(PIN_B1);   }
  else
  { output_low(PIN_B1);    }
  if(blueLed>counter)
  { output_high(PIN_B2);   }
  else
  {  output_low(PIN_B2);   }
} 

void main()
{  int8 i;                                                              //Variable para el ciclo for
    //Configuramos los timers
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1,49,1);                                     //Configuracion para interrupcion cada 50us
   setup_comparator(NC_NC_NC_NC);                                       //Deshabilitamos las entradas analógicas
   setup_vref(FALSE);
   SET_TRIS_B( 0b11110000 );                                            //Configuramos el puerto B 
   enable_interrupts(INT_TIMER2);                                       //Habilitamos las interrupciones del timer 2
   enable_interrupts(GLOBAL);
   counter=0;
   redLed=0;
   greenLed=0;
   blueLed=0;
  while(true)
   {  for(i=0; i<254; i++)                                              //Variamos de verde a rojo
      {  redLed=i;
         greenLed=254-i;
         delay_ms(3);
      }             
      for(i=0; i<254; i++)                                             //Variamos de rojo a azul
      {  blueLed=i;
         redLed=254-i;
         delay_ms(3);
      }            
      for(i=0; i<254; i++)                                            //Variamos azul a verde
      {  greenLed=i;
         blueLed=254-i;
         delay_ms(3);
      }
   }
}


¿Cómo funciona el código?

El código controla el ancho de cada pulso con un entero de 8 bits (0-255), por medio de ciclos va variando la intensidad de cada color, cada salida del Pic va directo al ULN2803 para darle tierra a cada color.