Aplicaţii de iluminare de joasă putere cu LED-uri

by donpedro

Tehnică de management energetic.

Echilibrul între strălucirea LED-ului şi puterea electrică este o specificaţie

esenţială atunci când se determină calitatea luminii vizibile şi atunci când un set de LED-uri este controlat într-o aplicaţie de iluminare. Iluminarea simultană a unui întreg set de LED-uri pentru obţinerea unui nivel maxim de strălucire poate să nu fie posibilă într-o aplicaţie de joasă putere, datorită sursei limitate de curent. Pentru producerea unei luminozităţi optime, disiparea puterii pe LED trebuie să fie gestionată eficient de la sursa de joasă putere.

de Ezana Haile, Principal Applications Engineer, Divizia de Produse Analogice şi de Interfaţare, Microchip Technology Inc.

Acest lucru necesită o tehnică de management energetic, din set, numai un banc de LED-uri să fie alimentat pentru un timp dat. Bancurile alternative de LED-uri rămân nedetectate vizual atâta vreme cât intensitatea luminoasă necesară este atinsă.
Puterea disponibilă şi intensitatea luminoasă necesară pentru aplicaţie trebuie să fie stabilită pentru a determina numărul de LED-uri pentru un interval de timp dat. Trebuie făcută o comparaţie între intensitatea luminoasă şi caracteristicile curentului direct pentru a selecta LED-urile cu nivelul de intensitate necesar. Odată ce numărul de LED-uri necesare a fost stabilit, numărul de LED-uri ce poate fi alimentat la un interval de timp dat este determinat din raportul dintre curentul total necesar pentru LED-uri şi curentul disponibil, după cum urmează:

Frecvenţa la care bancul de LED-uri este aprins/stins (ON/OFF) trebuie reglat astfel încât timpul de stat aprins (ON) să fie suficient de lung pentru iluminarea completă a bancului, iar timpul de stins (OFF) să fie limitat de timpul scurs până când bancul devine vizibil mai diminuat luminos. Acest timp de OFF limitează numărul de bancuri de LED-uri adiţionale ce pot fi controlate prin managementul intervalului de timp.
Această tehnică poate fi implementată cu un cost redus cu o sursă de ceas, un circuit basculant bistabil digital pentru controlul bancurilor de LED-uri, şi o poartă SAU pentru a detecta condiţia de start cu o simplă comutaţie On/Off. Figura 1 prezintă diagrama bloc a unei configuraţii de circuit basculant bistabil D pentru controlul a patru bancuri de LED-uri.

Figura 1: Intervale de timp pentru iluminare cu LED-uri cu utilizarea unui circuit basculant

Pentru start, circuitul basculant se află într-o stare stabilă şi necesită un puls de start, care trebuie să fie de cel puţin un ciclu de ceas, astfel ca el să fie detectat de prima intrare de stare pe frontul crescător al ceasului. Durata semnalului de ceas trebuie să fie trecătoare şi nu poate fi mai lungă decât o perioadă de ceas, altfel primele două ieşiri de stare vor fi stabilite în acelaşi timp, şi deoarece curentul sursă este limitat, aplicaţia de iluminare nu va funcţiona corespunzător. Cu ajutorul acestei configuraţii câte un banc de LED-uri este complet aprins pe frontul crescător al fiecărui puls de ceas, iar pentru ochiul uman apare ca şi cum toate LED-urile ar fi aprinse simultan.
Totuşi, această implementare este monotonă şi nu oferă o flexibilitate de proiectare. Ea are numai o stare de pornit sau de oprit. Acest circuit poate fi adecvat pentru aplicaţii precum iluminare de fond pentru ecrane LCD, dar dacă este nevoie de reglarea intensităţii luminoase sau de generarea de modele, un circuit bazat pe microcontroler oferă cea mai mare flexibilitate cu un impact minim asupra costului total al soluţiei. Circuitul este simplu de construit, cu puţine componente deoarece MCU controlează fiecare banc de LED-uri şi poate de asemenea detecta intrările utilizatorului pentru controlul reglajului intensităţii luminoase şi selectarea modelului.
O implementare eficientă poate fi oferită de un microcontroler pe 8 biţi cu număr redus de pini, precum familia PIC10F sau PIC12F de la Microchip, cu dispozitiv de extensie de porturi I/O, Microchip MCP23018. Extinderea de I/O poate fi de asemenea utilă pentru comanda LED-urilor atunci circuitul de iluminare este localizat de la distanţă faţă de MCU.
Dispozitivul de extensie de porturi I/O extinde porturile de intrare/ieşire ale unui microcontroler. În această aplicaţie, MCU controlează porturile dispozitivului de extensie I/O prin protocol I2C™ pentru a comanda LED-urile aprins sau stins, iar pinii de intrare/ieşire ai microcontrolerului pot fi utilizaţi pentru detectarea intrărilor de la utilizator prin comutator tip buton cu apăsare sau pentru detectarea unui potenţiometru de reglare a iluminării cu ajutorul convertorului analog / digital integrat.

Figura 2: Soluţie de iluminare economică bazată pe microcontroler, ce utilizează un dispozitiv de extensie de port I/O

Dispozitivele de extensie I/O sunt disponibile cu configuraţii de ieşire colector deschis sau push-pull. Microcontrolerele pot opera la 3,3 V sau mai jos, astfel încât o ieşire colector deschis a dispozitivului de extensie I/O se pretează bine la această aplicaţie. Avantajul este acela că dispozitivul permite LED-urilor să opereze la 5V sau mai mult, în vreme ce microcontrolerul şi dispozitivul de extensie I/O sunt alimentate la o tensiune mai joasă. MCP23018 este un dispozitiv de extensie I/O pe 16 biţi cu ieşire colector deschis şi interfaţă I2C. Figura 2 prezintă schema unui circuit pentru un dispozitiv de extensie I/O cu ieşire colector deschis cu o tensiune mai ridicată decât tensiunea de alimentare a MCU.
Când portul de I/O este setat la nivel energetic inferior (low), atunci tensiunea la nivelul portului de extensie I/O este 0, iar curentul trece în sens direct aprinzând LED-urile. Rezistenţa de polarizare a LED-ului limitează curentul la nivelul LED-ului pentru intensitatea luminoasă necesară şi funcţionează de asemenea ca rezistenţă de ridicare a nivelului logic (pull-up) pentru ieşirea de tip colector deschis.
Atunci când portul de I/O este setat pe nivel ener­getic superior (high), ieşirea colector deschis este oprită sau de mare impedanţă, iar tensiunea la nivelul portului de extensie I/O este ridicată la 5V de către rezistenţa de ridicare a nivelului logic. LED-ul se află în stare oprit, deoarece curentul nu circulă. Configuraţia cu ieşire colector deschis oferă de asemenea avantajul că, atunci când portul este configurat ca impedanţă ridicată, îi ia mai mult LED-ului să se stingă datorită capacităţilor parazite. Acest lucru permite ca bancul de LED-uri să fie aprins pe o durată puţin mai mare decât în cazul comparativ al ieşirilor de tip push-pull.
Cele 16 porturi de intrare/ieşire ale MCP23018 pot comanda până la 16 LED-uri. Cantitatea de curent ce poate fi trasă spre portul de I/O atunci când LED-urile sunt complet aprinse poate fi limitată de driverul de ieşire al dispozitivului de extensie I/O.
Tensiunea de nivel jos a portului de intrare/ieşire este specificată pentru maxim 0,6V la un curent de 8,5 mA. Dacă avem un curent mai mare de 8,5 mA, tensiunea de nivel jos va creşte exponenţial. Curentul maxim absolut este de 25 mA.
Dacă sursa de curent este limitată de exemplu la 5V/50 mA, iar pentru microcontroler, dispozitivul de extensie I/O şi pentru rezistenţele de detecţie a comenzilor de la utilizator este alocat un curent de 2 mA, restul curentului disponibil poate fi dedicat pentru iluminarea cu LED. Dacă intensitatea lumi­noasă a LED-ului la aproximativ 10 mA este adecvată, pe fiecare banc pot fi controlate 4 LED-uri.
În acest exemplu rezistenţa limitatoare de curent este de aproximativ 440Ω.
Temporizarea prezentată în Figura 1 poate fi replicată utilizând un scurt cod de instrucţiuni pe MCU. De exemplu, referitor la Pseudo Codul 1, subprogramul principal poate fi o buclă while infinită. Pentru a aprinde numai un banc de LED-uri, temporizatorul MCU (Timer0) porneşte un program de întrerupere ce trimite o comandă I2C pe dispozitivul de extensie I/O. Programul de întrerupere numără sau păstrează starea bancului de LED-uri, precum bancul care este curent aprins şi configuraţia portului de extensie corespunzător ca nivel logic superior sau inferior. La început, sau după reiniţializarea MCU, la prima întrerupere a temporizatorului Timer0, bancul 1 se aprinde. La a doua întrerupere, bancul 1 se stinge şi se aprinde bancul 2. Apoi, la a treia întrerupere, bancul 2 se stinge, bancul 3 se aprinde. Şi în sfârşit, la a patra întrerupere, bancul 3 se stinge şi bancul 4 se aprinde, iar variabila de ordine a bancurilor este ştearsă. La următoarea întrerupere ciclul se repetă, începând cu aprinderea bancului 1 şi stingerea bancului 4. Alte variabile, precum Command_byte, Address_pointer_bank1n2 şi Address_pointer_bank3n4 sunt constante şi definite în fişierul de definire. Cu o asemenea implementare, ieşirile cir­cu­itului oferă intensitatea lumi­noasă necesară şi dă impresia că toate LED-urile sunt aprinse simultan de la sursa de putere disponibilă.

Controlul intensităţii luminoase şi generarea de modele cu LED-uri

Cu ajutorul unei aplicaţii bazate pe microcontroler pot fi realizate cu uşurinţă modele de iluminare interesante. Stările de ieşire ale portului dispozitivului de extensie sunt încărcate din variabile RAM pe 2 byte, etichetate ca Bank1n2_pattern şi Bank3n4_pattern. Diferitele modele de 1s şi 0s pentru fiecare banc sunt conţinute într-un tabel de căutare predefinit.
Pentru monitorizarea continuă a stării ON/OFF a comutatorului buton cu apăsare este adăugată în programul principal de formă de buclă while infinită o instrucţiune IF THEN. Atunci când butonul cu apăsare este apăsat temporar, în cei 2 byte de RAM este încărcat un model din tabelul de căutare, etichetat Bank1n2_pattern şi Bank3n4_pattern.
Când apare întreruperea de la temporizatorul Timer0, noul model este trimis către extensia I/O, iar LED-urile sunt aprinse în acord cu acest model.
Ciclurile din subprogramul principal ce utilizează tabelul de căutare, continuă dacă utilizatorul continuă să apese butonul. Pentru a afişa o lumină alternativă, trebuie doar trimis complementul modelului anterior. De exemplu, dacă modelul pentru bancul 1 este ‘0101’, atunci complementul este ‘1010,’ după cum se poate observa în Pseudo Codul 2, care este un fragment din Pseudo Codul 1.

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
}
Pseudo Cod 1: Programul de întreruperi implementat pe microcontroler

Pentru a inspecta vizual modelele alternative, în subrutina de întrerupere, trebuie adăugată totuşi o întârziere, înainte de instrucţiunea IF THEN. Aceasta este creată

Figura 3: Diagrama de temporizare pentru ieşirea PWM şi întârzierea de temporizare

cu funcţia Delay_ON, astfel încât la întreruperea următoare numărătorul de întârziere decrementează numărul de întreruperi ale întârzierii. Valoarea acesteia poate fi de asemenea selectată prin utilizarea unui potenţiometru, pentru care terminalul central este conectat la intrarea convertorului analog/digital integrat pe MCU (ADC). Datele digitale de la ieşirea din convertor sunt scalate de la o întârziere minimă la una maximă prin detectarea a 4 biţi ce oferă 16 nivele. O reglare mai fină poate fi stabilită prin utilizarea a 5 biţi, adică 32 de nivele. Întârzierea maximă furnizează cea mai lentă sclipire a LED-urilor, iar întârzierea minimă dă impresia că LED-urile sunt mereu aprinse. Diagrama de temporizare din Figura 3 prezintă întârzierea tDELAY.

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;
}

Pseudo Cod 2: Generare model

Pentru a controla durata intervalului de timp pentru fiecare banc, controlul intensităţii luminoase utilizează semnal cu modularea lăţimii pulsului (PWM). Durata întreruperii temporizatorului Timer0 are două valori, una pentru durata nivelului superior şi una pentru durata nivelului inferior, proporţional cu factorul de umplere al semnalului PWM, reglat prin utilizarea unui potenţiometru; terminalul central al potenţiometrului este conectat la intrarea convertorului ADC. Nivelul rezoluţiei poate fi reglat prin selectarea a 4 sau 5 biţi din ADC. Poziţia numărătorului Timer0 este reglată cu ajutorul datelor scalate ADC, unde 100% PWM este egal cu poziţia maximă a numărătorului şi strălucire maximă, iar 0% înseamnă nivelul minim de strălucire. Pseudo Cod 4 prezintă ecuaţia de scalare pentru 16 nivele, iar Figura 3 prezintă diagrama de temporizare pentru durata PWM, tPWM_LOW şi tPWM_HIGH.

*
*
*
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
}
*
*
*

Pseudo Cod 3: Implementarea întârzierii pentru a vedea modelul de iluminare

Programul de întrerupere trebuie să actualizeze poziţia numărătorului Timer0 pentru următoarea întrerupere. El trebuie de asemenea să detecteze când durata este pentru nivelul superior al PWM şi când este pentru nivelul inferior.

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.
}

Pseudo Cod 4: Subrutină de calcul pentru raportul PWM

Pentru aceasta trebuie adăugate câteva instrucţiuni pentru a detecta nivelul potenţiometrului pentru controlul strălucirii şi scalarea raţiometrică a poziţiei numărătorului Timer0 cu valorile PWM_High şi PWM_low prezentate în Pseudo Cod 4. Pseudo Cod 5 prezintă programul pentru reglarea PWM; pentru detectarea stării PWM este utilizată o instrucţiune IF THEN.

*
*
*
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;
}
}
*
*
*

Pseudo Cod 5: Fragment program pentru stabilirea raportului PWM

Această metodologie poate fi de asemenea implementată pe microcontrolere de 8 biţi de clasă medie cu memorie program suplimentară, precum familia Microchip PIC16F. Un upgrade va permite programului principal să gestioneze modele sofisticate de iluminare, precum urmărire luminoasă (chasing light). Modulul temporizatorului Timer1 al MCU poate fi implicat pentru a varia durata în care cei doi byte de RAM sunt actualizaţi pentru modelul de urmărire.
Proiectanţii caută mereu noi căi de a reduce costurile fără a compromite performanţele. Există numeroase metode pentru a comanda eficient bancurile de LED-uri utilizate în iluminarea de fond a LCD sau în aplicaţii de modele de iluminare pentru o iluminare eficientă. În aplicaţiile de joasă putere, LED-urile pot fi controlate prin gestionarea intervalelor de timp pentru fiecare banc de LED-uri. Suplimentar, microcontrolerele cu număr redus de pini şi extensiile de porturi I/O oferă o alternativă economică pentru soluţii de iluminare cu flexibili­tate adiţională a proiectării ■

Microchip Technology
www.microchip.com

S-ar putea să vă placă și