低功率LED照明应用程序:电源管理技术

作者:美国微芯科技有限公司

模拟和接口产品部

Ezana Haile(应用程序总工程师)

当控制照明应用程序中的一组LED,以确定可见光质量时,LED光与电源之间的平衡便是一项基本规范。由于电流源有限,整组LED同时发光时,不可能在低功率应用程序中达到最大发光水平。为产生最大光度,须从低功率电源处有效控制每组LED的功耗。如果在规定时间和设定值范围内,仅对一排LED供电,则要求电源管理技术。当达到所需光度时,交替的几排LED应在视觉上不可见。

为在规定时间间隔内确定LED的数量,须设定应用程序所需的可用功率和光度。须比较光度和正向电流特性,从而选择具有所需亮度级的LED。当设定所需LED的数量后,通过取LED所需总电流和可用电流的比值,便可确定在规定时间间隔内进行供电的LED数量,如下所示:

一排LED的数量=LED所需总电流/可用总源电流

应调整一排LED开启/关闭的频率,确保开启时间足以使一排LED全部照明,且关闭时间由该排LED开始变暗前的时间决定。关闭时间限制其他排LED的数量(可用通过时间间隔管理控制)。

这项技术可以低成本应用,通过时钟脉冲源、数字触发器控制数排LED,同时,通过带有简单开启/关闭开关的OR闸门检测启动条件。图1是数字触发器配置控制四排LED的方块图。

 

 

1采用触发器电路的LED照明时间间隔

开启前,触发器处于无改变状态且要求启动脉冲,其至少须经历一次时钟周期,以便在时钟上升边缘通过第一个触发器检测到该脉冲。启动信号周期须为瞬时,且不超过一个时钟周期,否则前两个触发器输出将设定在同一时间;此外,由于源电流受限,照明应用程序将无法正常运转。采用这种配置,在每个时钟上升边缘时开启一排LED,而肉眼看上去却如同同时打开所有LED一样。

然而,这种应用太单调,缺乏设计灵活性。其仅具备开启或关闭状态。这种电路可能满足LCD背光灯等应用程序,但是,如果需要调暗或显示图案时,电路微控制器(MCU)能够实现最大的灵活性,且对方案总成本的影响最小。该电路易于设计,仅需少量组件便可实现MCU控制每排LED,还能检测调光控制和模式选择的用户输入。

带有I/O端口扩展器(例如微芯科技有限公司的MCP23018)的低成本且低引脚数8位微控制器(例如微芯科技有限公司的PIC10F或PIC12F系列),将实现低成本应用。当照明电路位于距离MCU较远的位置时,I/O扩展器还可用于带动LED。

I/O端口扩展器扩展微控制器的I/O端口。在该应用程序中,MCU通过I2C™协议控制I/O扩展器端口,驱动LED开启或关闭,并且MCU的I/O引脚可通过按钮式开关检测用户输入,或借助内置模拟数字转换器检测调光控制的电位水平。

 

I/O扩展器带开漏或推挽输出配置。微控制器能够在3.3V或更低电压下运行,因此,开漏输出I/O扩展器极其适用于该应用程序。其优点在于允许LED在5V或更高电压下运行,而微控制器和I/O扩展器的在较低电压下运行。MCP23018是一个16位I/O端口扩展器,具有开漏输出和I2C界面。图2显示上拉至高于MCU电源电压的开漏输出I/O扩展器电路图。

 

2采用I/O端口扩展器基于照明方案的低成本微控制器

当I/O端口设定值较低时,I/O扩展器端口的电压是0V,电流正向偏置并开启LED。LED偏置电阻根据所需光度限制LED电流,同时作为开漏输出的上拉电阻。

当I/O扩展器输出端口设定值较高时,开漏输出关闭或I/O扩展器端口高抗阻和电压通过上拉电阻上拉至5V。由于电流不流动,LED将处于关闭状态。开漏输出配置的另一种优点是,当端口配置有高抗阻时,由于寄生电容,将需要更长时间关闭LED。与采用上拉输出的类似应用程序相比,这可能会稍稍延长开启下一排LED的时间。

 

MCP23018的16个I/O端口能够驱动高达16个LED。当开启LED时,电流量可能沉入I/O端口,并能够通过I/O扩展器输出驱动进行限制。对于0.6V最大电压,I/O端口低电平电压规定值为8.5mA电流。如果电流高于8.5mA,低电平电压将成倍增加。最大绝对电流值为25mA。

如果源电流限制值为5V/50mA,例如用户输入检测用微控制器、I/O扩展器及电阻器的预估电流是2mA,剩余可用电流可用于LED照明。如果LED在约10mA电流时具有充分的光度,每排可控制四个LED。在这个实例中,限流电阻器值约为440Ω。

图1所示计时可采用一个短MCU指令代码复制。例如,若伪代码为1,主要子程序可无限循环。在MCU计时器间隔(计时器0)内,中断服务程序向I/O扩展器发送仅开启一排LED的I2C指令。中断服务器计数或保存LED排的状态踪迹,例如当前开启一排,相应的I/O扩展器端口配置较高或较低。MCU重置之前或之后,当第一个计时器0中断,1排开启;接着,第二个中断,1排关闭2排开启;然后,第三个中断,2排关闭3排开启;最后,第四个中断,3排关闭4排开启,并且该排计数器变量清晰可见。在下一个中断时,1排开启4排关闭如此循环。其他变量,例如Command_byte、Address_pointer_bank1n2和Address_pointer_bank3n4为文件开头规定的常量。采用这种安排,电路输出所需光度,看似同时开启所有LED电源。

无效电路(无效){

  初始化();     //初始化PIC微处理外围,包括计时器0和I/O扩展器外围

  bank_counter =0;    //清除该排计数器变量

  当(1){}    //无限循环

}

无效中断,int_service(无效){

  TurnOffAll_LED();        //子程序关闭当前点亮的所有LED

  I2C_ start ();   //I2C协议-启动信号子程序

  I2C_send(Comand_byte);  //I2C协议-发送字节子程序

  如果(bank_counter == bank1){        //1排=0(规定常量)

    I2C_send(Address_pionter_bank1n2);          //发送外围寄存器地址指示器

    I2C_send(‘0000 1111’);   //I2C协议-发送该排状态(1排开启2排关闭)

    bank_counter = bank_counter + 1;

  }

  如果(bank_counter == bank2){     //1排为常量1

    I2C_send(Address_pionter_bank1n2);  //发送外围寄存器地址指示器

    I2C_ send(‘1111 0000’);  //I2C协议-发送该排状态(2排开启1排关闭)

    bank_counter = bank_counter + 1;

  }

  如果(bank_counter == bank3){    //1排为常量2

    I2C_send(Address_pionter_bank3n4);  //发送外围寄存器地址指示器

    I2C_send(‘0000 1111’);  //I2C协议-发送该排状态(3排开启4排关闭)

  }

    bank_counter = bank_counter + 1

  如果(bank_counter == bank4){   //1排为常量3

    I2C_send(Address_pionter_bank3n4);   //发送外围寄存器地址指示器

    I2C_send(‘1111 0000’);  //I2C协议-发送该排状态(4排开启3排关闭)

  }

    bank_counter = 0;

  I2C_stop();   //I2C协议-结束信号子程序

}

 

伪代码1微控制器中断服务程序代码流

调光控制和LED模式生成

使用微控制器应用程序,很容易生成有趣照明模式。I/O端口扩展器输出状态通过2字节RAM变量加载,标题是:Bank1n2_pattern和Bank3n4_pattern。每半个字节对应每一排。预先定义的查询表包括每一排1s和0s的各种模式。

为连续监测按钮开关的开启/关闭状态,在MCU代码-主要子程序的无限循环添加了IF THEN语句。当短暂按下按钮时,来自查询表的一种模式下载至两个字节的RAM中,标标题是:Bank1n2_pattern和Bank3n4_pattern。但计时器0中断时,将向I/O扩展器发送新模式,且LED根据新模式发亮。当用户继续短暂按下按钮开关时,主要子程序将通过查询表循环。为显示交替灯,简单发送上一模式的补充模式即可。例如,如果1排模式是“0101”,则补充模式是“1010”(如伪代码1片段-伪代码2所示)。

*

*

*

如果(bank_counter == bank1){       //1排为常量0

  I2C_send(Address_pionter_bank1n2);   //发送外围寄存器地址指示器

  Bank1n2_pattern = ~Bank1n2_pattern; //使用‘~’补充变量

  I2C_send((Bank1n2_pattern | ‘0000 1111’));  //I2C协议-发送该排状态

                      //(使用OR ‘|’设定1排开启2排关闭)

bank_counter = bank_counter + 1;

 

}

*

*

*

伪代码2:模式生成

 

 

然而,在该排开启/关闭IF THEN语句前,中断子程序须增加延迟,目测检查交替模式。这通过一个Delay_ON标志,以便在出现以下中断时,仅使用延迟计数器倒计时延迟的中断次数。该延迟值还可由用户使用电位计选定,其中中心标签连接至数字转换器(ADC)输入的MCU模拟芯片。该ADC的数字数据通过检测顶部四个字节(其具有16位)将最小延迟值调整至最大延迟值。通过检测顶部五个字节(或32位),可设定更精确的比率。最大延迟值可使LED光线达到最暗,同时,最小延迟值可使所有LED都开启。图3中的计时图显示了延迟位置t延迟。

*

*

*

无效中断int_service(无效){

  TurnOffAll_LEDs();        //子程序关闭之前发亮的所有LEDs

  如果(Delay_ON == ON){    //开启值常量1

    Update_Timer0_Counter(Timer0delay_interval);        //子程序更新计时器0

      // Timer0delay_interval是设定最小延迟的常量

    Delay_Counter = Delay_Counter – 1;           //倒计时延迟的中断次数

    如果(Delay_Counter == 0){

      Delay_ON = OFF;   //清除下一次中断的延迟标志

      Delay_Counter  = Get_Delay_Counter();//子程序检测用户输入

                        //并且设定延迟计数器变量

    }其他{

      Delay_ON = ON; //保持延迟标志开启

      返回;           //退出中断服务程序

    }

  }

 

  I2C_start();//I2C协议启动信号子程序

  I2C_send(Comand_byte);//I2C协议-发送字节子程序

  如果(bank_counter == bank1{     //1排为常量0

    I2C_send(Address_pionter_bank1n2);//发送外围寄存器地址指示器

    Bank1n2_pattern = ~Bank1n2_pattern;//使用‘~’补充变量

    I2C_send((Bank1n2_pattern | ‘0000 1111’));//I2C协议-发送该排状态

                        //(使用OR ‘|’设定1排开启2排关闭)

    bank_counter = bank_counter + 1;

    Delay_ON = ON;//打开延迟标志

    }

*

*

*

 

伪代码3:查看照明模式的延迟代码应用

 

 

为控制每一排的时间间隔,调光控制使用脉动宽度调制(PWM)。计时器0中断间隔两个值,一个用于长间隔,另一个用于短间隔,与PWM比率成正比,通过拇指旋轮电位计设置;中心标签连接至ADC输入。分辨率级别可通过从ADC选择顶部4或5个字节来调节。计时器0计数位置通过比率调节,具有缩放ADC数据,其中100%的PWM等于最大计数位置(全部发亮)和0%的最小或最低调光等级。伪代码4显示16位PWM的比例方程式,且图3显示PWM间隔的计时图tPWM_LOW和tPWM_HIGH。

无效get_PWM_ratio(无效){

  双PotScale;//存储ADC输出比例的局部变量

  双PWM_Percentage;//存储PWM变化百分比的局部变量

  PotScale=(ADRESH)/16+1;测量ADC输出高字节

  PWM_Percentage =1/16*PotScale;//从0至1测量输出,等于100%

  PWM_High = Frequency_counter * PWM_Percentage;//设置PWM高计数器0值

  PWM_Low = Frequency_counter *(1-PWM_Percentage);//设置PWM低计数器0值

            //PWM_High和PWM_Low为全程常量,

            //且Frequency_counter为设置频率的常量计时器0值

}

 

伪代码4子程序计算PWM比率

 

 

3PWM输出和计时延迟计时图

中断服务程序须更新下一次中断的计时器0计数位置。同时,其须检测持续时间是否用于PWM高电平或低电平时间。因此,须补充一些关于调光控制电位水平的检测说明,并使用PWM_High电平和PWM_low电平值,按比例计量计时器0计数位置(如伪代码4所示)。伪代码5显示调节PWM的代码;一个IF THEN语句用于检测PWM状态。

 

 

*

*

*

如果(bank_counter == bank1){//1排为常量0

  如果(PWM_High_Low_flag == OFF){   //检查PWM状态标志

    get_PWM_ratio();//检测用户输入PWM比率

    Timer0_counter =65535-PWM_High://设定计时器0计数器变量

    Update_Timer0_Counter(Timer0_counter);        //子程序更新计时器0

    I2C_send(Address_pionter_bank1n2);  //发送外围寄器地址指示器

    Bank1n2_pattern = ~Bank1n2_pattern; //使用‘~’补充变量

    I2C_send((Bank1n2_pattern | ‘0000 1111’));  //I2C协议-发送该排状态

                        //(使用OR‘|’设定1排开启2排关闭)

    PWM_High_Low_flag = ON;   //设置标志

    Delay_ON = OFF;

 

  }其他{

    Timer0_counter = 65535 – PWM_Low;  //设置计时器0计数变量

    Update_Timer0_Counter(Timer0_counter);        //子程序更新计时器0

    I2C_send(Address_pionter_bank1n2);  //发送外围寄存器地址指示器

    I2C_send(‘1111 1111’));;  //I2C协议-关闭所有LED

    bank_counter = bank_counter + 1;

    PWM_High_Low_flag = OFF;//清除标志

    Delay_ON = ON;

  }

}

*

*

*

伪代码5PWM比率设定代码流

这种方法还可应用于带有额外程序存储器的中等8位微控制器,例如微芯科技有限公司的PIC16F系列。升级便可使主要子程序处理复杂的照明模式,例如追光灯。MCU的计时器1模块能够用于改变间隔时间,其中更新了追光模式的两个RAM字节。

设计师一直在寻求降低成本而缩减性能的新方式。为实现高效照明,许多方法能有效驱动几排用于LCD背光灯或照明模式应用程序的LED。在低功耗应用程序中,能够通过管理每排LED的时间间隔来控制LED。此外,低引脚数微控制器和I/O端口扩展器提供的另一种照明方案,成本较低且设计灵活。