Aplicaciones de iluminación con LED de bajo consumo: técnica para la gestión de la alimentación
El equilibrio entre la luz generada por los LED y la potencia eléctrica es una especificación fundamental para determinar la calidad de la luz visible al controlar un conjunto de LED en una aplicación de iluminación.
La iluminación de un grupo completo de LED de forma simultánea para lograr la máxima intensidad luminosa podría resultar imposible en aplicaciones de bajo consumo debido a la limitada corriente suministrada. Para producir una luminosidad óptima se debe gestionar eficientemente la disipación de potencia para cada LED desde la fuente de bajo consumo. Esto exige una técnica de gestión de la alimentación en la cual, dentro del grupo de LED, se alimente tan solo un banco de LED durante un tiempo determinado. Los otros bancos de LED no se detectarán visualmente mientras se alcanza la intensidad luminosa requerida.
Se deben fijar la potencia disponible y la intensidad luminosa necesaria para la aplicación con el fin de determinar el número de LED para un intervalo de tiempo dado. Se debe realizar una comparación entre la intensidad luminosa y las características de la corriente directa para seleccionar los LED con el nivel de intensidad exigido. Una vez establecido el número de LED necesarios, este número se puede alimentar con un intervalo de tiempo que viene determinado por la proporción entre la corriente total que necesitan los LED y la corriente disponible, tal como sigue:
Nº de LED en un banco = Corriente total que necesiten los LED / Corriente total disponible en la fuente
La frecuencia a la cual conmuta el banco de LED se debe ajustar de forma que el tiempo en ON sea lo suficientemente largo como para la permitir la total iluminación de un banco, y el tiempo en OFF se ve limitado por el tiempo que tarda antes de que el banco empiece a atenuarse a ojos vista. El tiempo en OFF limita el número de bancos de LED adicionales que se pueden controlar mediante la gestión del intervalo de tiempo.
Esta técnica se puede implementar con un coste bajo con una fuente de reloj, biestables (flip-flops) digitales para controlar bancos de LED y una puerta OR para detectar un estado de puesta en marcha con un sencillo interruptor On/Off. La Figura 1 muestra el diagrama de bloques de una configuración de biestable D para controlar cuatro bancos de LED.
Al inicio, el biestable se encuentra en estado invariable y necesita un pulso de puesta en marcha que debe durar como mínimo un ciclo, por lo que se puede detectar por medio del primer biestable en el flanco de subida del reloj. La duración de la señal de puesta en marcha debe ser momentánea y no puede durar más de un ciclo de reloj, pues de lo contrario las dos primeras salidas del biestable se fijan al mismo tiempo y, dado que la corriente suministrada es limitada, la aplicación de iluminación no funcionará correctamente. Un banco de LED está completamente iluminado en el flanco de subida de cada reloj con esta configuración y para el ojo humano parece como si todos los LED estuvieran totalmente conectados de manera simultánea.
Sin embargo, esta realización es monotónica y no aporta flexibilidad al diseño. Solo tiene un estado on u off. Este circuito puede ser adecuado para aplicaciones como retroiluminación de LCD, pero si necesita atenuar o generar secuencias un circuito basado en microcontrolador ofrece la máxima flexibilidad con un mínimo impacto sobre el coste total de la solución. La construcción del circuito es más sencilla, con menos componentes ya que el microcontrolador controla cada banco de LED y también puede detectar las entradas del usuario para el control de atenuación y para seleccionar secuencias.
Un microcontrolador de 8 bit de bajo coste y con pocas patillas, como la familia PIC10F o PIC12F de Microchip, con un ampliador del puerto de E/S como el MCP23018 de Microchip, ofrecería una solución económica. La expansión de E/S también puede resultar útil para controlar los LED cuando el circuito de iluminación se localiza remotamente respecto al microcontrolador.
Los ampliadores de puertos de E/S amplían los puertos de E/S de un microcontrolador. En esta aplicación, el microcontrolador controla el ampliador de E/S mediante el protocolo I2C™ para controlar los LED on/off y las patillas de E/S del microcontrolador se puede utilizar para detectar las entradas del usuario por medio de un pulsador o de un convertidor A/D incorporado para detectar un nivel del potenciómetro para el control de atenuación.
Los ampliadores de E/S están disponibles en configuraciones de salida con drenador abierto o push-pull. Los microcontroladores pueden trabajar con una tensión de 3,3V o inferior, de manera que un ampliador de E/S con salida de drenador abierto se adapta bien a esta aplicación. La ventaja es que permite que los LED trabajen a una tensión de 5V o superior, siempre que el microcontrolador y el ampliador de E/S se alimentan a una tensión más baja. El MCP23018 es un ampliador de puerto de E/S de 16 bit con una salida de drenador abierto y un interface I2C. La Figura 2 muestra el diagrama del circuito para un ampliador de E/S con salida en drenador abierto elevada hasta una tensión superior a la tensión de alimentación del microcontrolador.
Cuando el puerto de E/S se fija en estado bajo, la tensión en el ampliador de E/S es de 0V y circula la corriente, que polariza en modo directo y conmuta el LED para que conduzca. La resistencia de polarización del LED limita la corriente que llega al LED según la intensidad luminosa necesaria y también funciona como resistencia de arrastre (pull-up) para la salida en drenador abierto.
Cuando se fija el puerto de salida del ampliador de E/S en estado alto, la salida en drenador abierto pasa a corte o a alta impedancia y la tensión en el puerto del ampliador de E/S se eleva hasta 5V por medio de la resistencia de pull-up. El LED se encuentra en corte porque no circulará corriente. Una configuración con drenador abierto también ofrece la ventaja de que, cuando el puerto está configurado en alta impedancia, tarda más en desconectar el LED debido a la capacidad parásita. Esto permite que el siguiente banco de LED entre en conducción durante un tiempo un poco más largo si se compara con otras aplicaciones parecidas con salida push-pull.
Los 16 puertos de E/S del MCP23018 pueden controlar hasta 16 LED. La cantidad de corriente que se puede suministrar al puerto de E/S cuando el LED está conduciendo de lleno se puede limitar mediante el control de la salida del ampliador de E/S. La tensión en nivel bajo del puerto de E/S se especifica hasta un máximo de 0,6V para una corriente de 8,5 mA. Si la corriente es superior a 8,5 mA, la tensión de nivel bajo aumentará de forma exponencial. La máxima corriente absoluta es de 25 mA.
Si la corriente suministrada se limita a 5V/50 mA, por ejemplo, y se asignan 2 mA para el microcontrolador, el ampliador de E/S y las resistencias para detección de entrada del usuario, la corriente restante que hay disponible se puede dedicar a la iluminación de LED. Se pueden controlar cuatro LED por banco si la intensidad luminosa del LED a unos 10 mA es adecuada. En este ejemplo el valor de la resistencia limitadora de corriente será de 440W aproximadamente.
void main (Void){
initialize(); //initialize the PICmicro peripherals including Timer0, and I/O expander peripherals
bank_counter = 0; //Clear the bank counter variable
while(1){} //infinite while loop
}
Void Interrupt int_service(void){
TurnOffAll_LEDs(); //subroutine to turn off all previously lit LEDs
I2C_start(); //I2C protocol – start signal subroutine
I2C_send(Comand_byte); //I2C protocol – send byte subroutine
If(bank_counter == bank1){ // bank1 is a constant defined as 0
I2C_send(Address_pionter_bank1n2); //Send peripheral register address pointer
I2C_send(‘0000 1111’); //I2C protocol – send bank status (bank 1 on and bank 2 off)
bank_counter = bank_counter + 1;
}
If(bank_counter == bank2){ // bank1 is a constant defined as 1
I2C_send(Address_pionter_bank1n2); //Send peripheral register address pointer
I2C_send(‘1111 0000’); //I2C protocol – send bank status (bank 2 on and bank 1 off)
bank_counter = bank_counter + 1;
}
If(bank_counter == bank3){ // bank1 is a constant defined as 2
I2C_send(Address_pionter_bank3n4); //Send peripheral register address pointer
I2C_send(‘0000 1111’); //I2C protocol – send bank status (bank 3 on and bank 4 off)
bank_counter = bank_counter + 1;
}
If(bank_counter == bank4){ // bank1 is a constant defined as 3
I2C_send(Address_pionter_bank3n4); //Send peripheral register address pointer
I2C_send(‘1111 0000’); //I2C protocol – send bank status (bank 4 on and bank 3 off)
bank_counter = 0;
}
I2C_stop(); //I2C protocol – stop signal subroutine
}
Pseudocódigo 1: Código de la rutina del servicio de interrupciones del microcontrolador
*
*
*
If(bank_counter == bank1){ // bank1 is a constant defined as 0
I2C_send(Address_pionter_bank1n2); //Send peripheral register address pointer
Bank1n2_pattern = ~Bank1n2_pattern; //complement the variable using ‘~’
I2C_send((Bank1n2_pattern | ‘0000 1111’)); //I2C protocol – send bank status
//(use OR ‘|’ to set bank 1 on and bank 2 off)
bank_counter = bank_counter + 1;
}
*
*
*
Pseudocódigo 2: Generación de secuencias.
*
*
*
Void Interrupt int_service(void){
TurnOffAll_LEDs(); //subroutine to turn off all previously lit LEDs
If (Delay_ON == ON){ // ON is a constant defined as 1
Update_Timer0_Counter(Timer0delay_interval); //subroutine to update Timer0
// Timer0delay_interval is a constant to set the minimum delay
Delay_Counter = Delay_Counter – 1; //count down the number of interrupts for delay
If(Delay_Counter == 0){
Delay_ON = OFF; // Clear the delay flag for the next interrupt
Delay_Counter = Get_Delay_Counter(); //subroutine to detect user input
//and set the delay counter variable
}else{
Delay_ON = ON; // leave delay flag ON
Return; //exit the interrupt service routine
}
}
I2C_start(); //I2C protocol start signal subroutine
I2C_send(Comand_byte); //I2C protocol – send byte subroutine
If(bank_counter == bank1){ // bank1 is a constant defined as 0
I2C_send(Address_pionter_bank1n2); //Send peripheral register address pointer
Bank1n2_pattern = ~Bank1n2_pattern; //complement the variable using ‘~’
I2C_send((Bank1n2_pattern | ‘0000 1111’)); //I2C protocol – send bank status
//(use OR ‘|’ to set bank 1 on and bank 2 off)
bank_counter = bank_counter + 1;
Delay_ON = ON; // turn on the delay flag
}
*
*
*
Pseudocódigo 3: Implementación del código de retardo para visualizar una secuencia de iluminación.
El cronograma mostrado en la Figura 1 se puede reproducir si se utiliza un código corto de instrucción del microcontrolador. Por ejemplo, para el Pseudocódigo 1, la subrutina principal puede ser un bucle ‘while’ infinito. Para cada intervalo de tiempo del microcontrolador (Timer0) una rutina de servicio de interrupción envía una instrucción I2C al ampliador de E/S para conducir solo un banco de LED. La rutina de servicio de interrupción cuenta o realiza el seguimiento del estado del banco de LED, como por ejemplo si el banco conduce actualmente, y la configuración del puerto de ampliación de E/S correspondiente como estado alto o bajo. Inicialmente, o bien tras reiniciar el microcontrolador, en la primera interrupción de Timer0 el banco bank 1 pasa a conducir. En la segunda interrupción, el banco 1 está desconectado y el banco 2 está activo. Luego, en la tercera interrupción, el banco 2 se desconecta y el banco 3 está activo. Finalmente, en la cuarta interrupción, el banco está desconectado y el banco 4 está en activo, y además la variable del contador de banco se pone a cero. En la siguiente interrupción, el ciclo se repite conectando el banco 1 y desconectando el banco 4. Otras variables, como Command_byte, Address_pointer_bank1n2 y Address_pointer_bank3n4, son constantes definidas en el archivo de inicio. En una implementación de este tipo, el circuito genera la intensidad luminosa necesaria y parece como si todos los LED fueran activados simultáneamente por la fuente de alimentación disponible.
Void get_PWM_ratio(void) {
Double PotScale; //local variable to store ADC output scale
Double PWM_Percentage; //local variable to store PWM change percentage
PotScale = (ADRESH)/16 + 1; //Scale ADC output high byte
PWM_Percentage = 1/16 * PotScale; //Scale the output from from 0 to 1, equivalent to 100%
PWM_High = Frequency_counter * PWM_Percentage; //set PWM high Timer0 value
PWM_Low = Frequency_counter * (1 – PWM_Percentage); //set PWM low Timer0 value
//PWM_High and PWM_Low are global variables,
//and Frequency_counter is a constant Timer0 value to set frequency.
}
Pseudocódigo 4: Subrutina para calcular la proporción de PWM
*
*
*
If(bank_counter == bank1){ // bank1 is a constant defined as 0
If (PWM_High_Low_flag == OFF){ //check PWM status flag
get_PWM_ratio(); //Detect user input for PWM ratio
Timer0_counter = 65535 – PWM_High; //set Timer0 counter variable
Update_Timer0_Counter(Timer0_counter); //subroutine to update Timer0
I2C_send(Address_pionter_bank1n2); //Send peripheral register address pointer
Bank1n2_pattern = ~Bank1n2_pattern; //complement the variable using ‘~’
I2C_send((Bank1n2_pattern | ‘0000 1111’)); //I2C protocol – send bank status
//(use OR ‘|’ to set bank 1 on and bank 2 off)
PWM_High_Low_flag = ON; //Set flag
Delay_ON = OFF;
}else{
Timer0_counter = 65535 – PWM_Low; //set Timer0 counter variable
Update_Timer0_Counter(Timer0_counter); //subroutine to update Timer0
I2C_send(Address_pionter_bank1n2); //Send peripheral register address pointer
I2C_send(‘1111 1111’)); //I2C protocol – turnoff all LEDs
bank_counter = bank_counter + 1;
PWM_High_Low_flag = OFF; //Clear flag
Delay_ON = ON;
}
}
*
*
*
Pseudocódigo 5: Flujo del código para ajustar la proporción de PWM.
Control de atenuación y generación de secuencias con LED
Se pueden generar interesantes secuencias luminosas con una aplicación basada en microcontrolador. Los estados de la salida del ampliador del puerto de E/S se cargan desde
2 bytes de variables en la RAM que se denominan Bank1n2_pattern y Bank3n4_pattern. El medio byte corresponde a cada banco. Una tabla de consulta previamente definida contiene varias secuencias de unos y ceros para cada banco.
Para monitorizar continuamente el estado del pulsador on/off se añade una instrucción IF THEN al código del microcontrolador: el bucle ‘while’ infinito de la subrutina principal. Cuando se presiona momentáneamente el pulsador se carga una secuencia desde la tabla de consulta en los dos bytes de RAM, denominados Bank1n2_pattern y Bank3n4_pattern. Cuando se produce la interrupción de Timer0, se envía la nueva secuencia al ampliador de E/S y los LED se encienden en función de la secuencia. La subrutina principal va recorriendo la tabla de consulta mientras el pulsados siga siendo presionado momentáneamente por el usuario. Para visualizar otra secuencia de iluminación solo hay que enviar el complemento de la secuencia anterior. Por ejemplo, si la secuencia de bank1 es ‘0101’ el complemento es ‘1010’ tal como se indica en el Pseudocódigo 2, que es una sección (snippet) del Pseudocódigo 1.
No obstante, debe añadirse un retardo en la subrutina de interrupción antes de que las instrucciones IF THEN para conexión/desconexión del banco inspeccionen visualmente las secuencias alternativas. Esto se genera mediante un señalizador (flag) Delay_ON, de manera que en la siguiente interrupción solo se resta el contador de retardo para descontar el número de interrupciones para el retardo. El usuario también puede seleccionar el valor del retardo con un potenciómetro cuyo terminal estaría conectado a la entrada del convertidor A/D integrado en el microcontrolador. Los datos digitales del convertidor A/D van escalados de un retardo mínimo hasta un máximo detectando los cuatro bits superiores, que ofrecen 16 niveles. Se puede establecer un ajuste más preciso detectando los cinco bits superiores, es decir, 32 niveles. El retardo máximo es la mayor lentitud a la que pueden parpadear los LED y, con un retardo mínimo, parece como si todos los LED estuvieran en activo. La Figura 3 muestra la posición del retardo, tDELAY.
Para controlar la duración del intervalo del tiempo para cada banco, el control de atenuación emplela modulación de anchura de impulso (pulse width modulation, PWM). La duración de la interrupción Timer0 tiene dos valores, uno de larga duración y otro de baja duración, proporcional al porcentaje de PWM que se ajusta mediante un potenciómetro rotativo cuyo terminal central está conectado a la entrada del convertidor A/D. El nivel de resolución se puede ajustar seleccionando los 4 o 5 bits superiores del convertidor A/D. La posición del contador Timer0 se ajusta proporcionalmente y con una escala de los datos del convertidor A/D, donde un PWM del 100% equivale a la posición máxima del contador, totalmente iluminado, y el 0% es el nivel mínimo o de atenuación más baja. El Pseudocódigo 4 indica la ecuación de la escala de PWM para 16 niveles y la Figura 3 muestra el cronograma durante la PWM, tPWM_LOW y tPWM_HIGH.
La rutina del servicio de interrupción debe actualizar las posiciones del contador Timer0 para la siguiente interrupción. También ha de detectar si PWM tiene una larga o corta duración. Por tanto, se deben añadir unas pocas instrucciones para detector el nivel del potenciómetro para control de atenuación y escalado proporcional de la posición del contador Timer0 con los valores PWM_High y PWM_low mostrados en el Pseudocódigo 4. El Pseudocódigo 5 muestra el código para ajustar la PWM; se emplea una instrucción IF THEN para detectar el estado de PWM.
Esta metodología también se puede implementar en un microcontrolador de 8 bit de gama media con memoria de programa añadida, como la familia PIC16F de Microchip. Una actualización permitiría que la subrutina principal gestionara secuencias avanzadas de iluminación, como luces de movimiento continuo. El módulo Timer1 del microcontrolador se puede emplear para variar la duración y los dos bytes de RAM se actualizan para la secuencia de movimiento continuo.
Los diseñadores siempre buscan nuevas formas de disminuir costes sin comprometer las prestaciones. Existen numerosos métodos para controlar eficientemente los bancos de LED utilizados en retroiluminación de LCD o en aplicaciones de secuencias de iluminación para una iluminación eficiente. En aplicaciones de bajo consumo, los LED se pueden controlar mediante la gestión del intervalo temporal para cada banco de LED. Además, los microcontroladores con pocas patillas y los ampliadores de puerto de E/S ofrecen una alternativa de bajo coste para soluciones de iluminación con una mayor flexibilidad de diseño.
Autor:
Ezana Haile, Ingeniera Jefe de Aplicaciones, División de Productos Analógicos y de Interface Microchip Technology Inc.
Articulos Electrónica Relacionados
- Controlador LED MLX81143 para ... Melexis lanza su próximo miembro de la familia MeLiBu®, el controlador LED MLX81143. Incluye 21 controladores LED y mejora la gestión de la energía del sistema ...
- Led driver KNX con salida PWM ... La serie PWM KN es un led driver CA/CC de 60W. Trabaja en tensión constante con regulación PWM, diseñada para tiras y bombillas led. Su protocolo de control int...
- Matriz de LED Lumileds LUXEON ... Mouser Electronics, Inc. tiene disponibles los módulos LED LUXEON XR-TX de Lumileds. Estos dispositivos LED integran 12 diodos luminosos de alta eficacia...
- LED UVC Vishay VLMU60CL con en... Vishay, representada por RC Microelectrónica, ha presentado el nuevo VLMU60CL..-280-125 LED UVC con encapsulado cerámico (en base de cuarzo) y de ...
- LED OSLON SSL para aplicacione... Osram OptoSemiconductors presenta el LED OSLON SSL desarrollado por OSRAM que hace posible cultivar huertos en ciudades.Los sistemas de iluminado son un reto im...
- LED de lente compactos que eli... ROHM ha anunciado la disponibilidad de LEDs compactos de alto rendimiento y montaje superficial equipados con lente. Esta nueva gama incluye 18 dispositivos, en...
- LED Driver multicorriente con ... Tras el lanzamiento de los primeros LED driver multicorriente con tecnología KNX (serie LCM-40/60 KN), MENA WELL presenta el nuevo modelo LCM-25KN, completando ...
- Nuevo Mapa Luminico Dinamico ARELSA empresa líder en sistemas de telegestión para la ciudad presenta su nuevo “Mapa Lumínico Dinámico” donde pueden integrarse diferentes auditorías realizad...
- Farolas LED modulares El futuro de la iluminación está en el LED. Los beneficios de este tipo de tecnología, desde energéticos hasta medioambientales, pasando por conceptos como el d...
- Nuevos drivers DALI: LCM-40DA ... Electrónica Olfer presenta las nuevas series LCM-40DA y LCM-60DA de fuentes programables para protocolo DALI de 42W y 60W.El protocolo DALI es ampliamente utili...
- LEDs de alta eficacia XLamp XT... Mouser Electronics, Inc. tiene disponibles los LEDs Cree® XLamp® XT-E actualizados recientemente.Esta nueva generación de la plataforma XLamp XT-...
- LED Driver con regulación DALI... La serie XLG fabricada por MEAN WELL y distribuida en España y Portugal por Electrónica OLFER, cumple con las normas de seguridad más recientes y su diseño de r...