本帖最后由 novakon 于 2014-8-14 00:59 编辑 这次要做一个色度计,其中要求有一个白色LED光源照亮被测物体。系统5V电源是USB供电。
现在要求流经LED的电流是可调且稳定的。
有人可能会马上说,用PWM+三极管开关来给LED调光。这个方法的确简单,但是存在一些问题。
首当其冲是电流不可调。PWM调光,是用固定的电流以不同占空比来调节灯的亮度,这样虽然视觉上的亮度是连续可调的,但其在导通时间内的电流是一个固定的值。而LED灯的色温是与电流有关的,这就意味着无法通过精确控制电流,精确地控制该LED的色温。这在当前项目中是不允许的。三极管导通态压降有误差,系统电源电压有误差,一切都会造成led的色温和亮度在不同的使用环境中无法保持一致。所以,要求设计一个较为精密的的压控恒流电路,由单片机PWM+低通滤波产生控制电压以控制通过LED的电流大小,且不受三极管个体差异、系统电源电压误差影响(USB口供电电压在4.8-5.2V范围内变化)。
根据需要,我设计了如下电路。
上图:单片机的一个脚作为PWM输出,经过R2和C1组成的低通滤波,作为VREF控制电压。
下图:
R7 10欧姆
R1 10千欧姆
下面我来分析这个电路的工作原理。
首先把R1去掉。
当场效应管2N7002的栅极电压升高时,其漏-源电流会增大,所以通过LED的电流也增大。这个电流会在R7上产生压降,R7上的电压会作为LM358运放的反相输入。显然,当R7上的电压小于VREF时,运放输出电压会上升,令通过7002的电流增大,也就使得R7上的电压增大,直到该电压等于VREF为止。也就是说,运放会让R7上的压降始终等于VREF。比如如果VREF为0.2V,R7上的压降就为0.2V,则通过LED的电流就为 0.2伏/10欧=20毫安。由于2N7002是场效应管,栅极电流基本为0,所以通过R7的电流精确地等于通过D1的电流。如此,就实现了利用VREF控制D1上电流的目标。
然而事情远没有那么美好:LM358这款运放之所以允许输入电压到达负电源轨道,是因为它的输入级是PNP三极管结构。358的输入偏置电流大约是50nA,也就是说会有50nA的电流从输入端流出来,流向信号源。
VREF是通过RC网络滤波产生的,为了保证线性度,R2取了一个比较大的值,10千欧。直流上来看,这相当于说VREF是一个输入内阻为10千欧的电压源。假如单片机输出0V接地,那么LM358的同相输入端的实际电压就是10K*50nA=500uV=0.5mV。这时运放努力地让R7上端的电压等于0.5mV。这相当于让50uA的电流通过R7;如果再考虑运放的偏置电压可能高达5mV,则R7可能通过500uA电流。这意味着,很有可能当单片机输出0占空比时,LED灯无法完全熄灭。500uA就是0.5mA,看上去LED正在发亮。
幸好358的输入偏置电压温飘不严重。最终解决办法:在图中添加电阻R1,它会让约0.5毫安的电流流过R7,提供R7上的5mV电压,确保其高于VREF接地时同相输入端的电压,从而确保LED熄灭。
在正常工作时,随系统电压改变,这个R1会带来多少电流误差呢?假设系统电压范围为4.8-5.2,这0.4V的误差在10千欧上将产生40uA的误差。相对于40mA工作的LED来说,这是千分之一的电流误差。
而传统的限流电阻+三极管方式呢?假设工作电流40mA,电压2.5V,则电阻上分到的电压为2.5V(不考虑三极管压降)。可知电阻阻值为2.5/0.04=62.5欧姆。假如电源电压从4.8到5.2变化,则电阻上电流变化为0.4/62.5=0.0064A=6.4毫安,这相当于1/6的电流误差!
200字以内,仅用于支线交流,主线讨论请采用回复功能。