分类: C/C++
2011-08-16 13:58:06
作者:宋录振 QQ:405867746
感光原理:
利用LED的结电容,对LED进行充电然后检测LED的电压跳到低电平的时间,根据LED受光照强度的不同,检测放电时间。
感光过程:
状态1 正向导通LED发光
状态2 LED方向通电,电路对LED内部电容充电。充电后LED能保持+5V一段时间
状态3 正极地,阴极接端口高阻状态。则LED内部电容和光电流源形成一个放电回路。当LED接受光照越强,放电越快。则越快回复到低电压,我们则检测LED充电后通过放电,LED阴极电压从+5v到低电压(地)的放电时间来计算光照强度。
则2,3步骤循环则为LED检测环境光原理。
实验平台:
AVR单片机(实验时用的为ATMEGA644V),红色发光二极管(经测试红色发光二极管对光照敏感强),其它发光二极管+电阻1K(用于感光指示)
实验程序:
所有程序均在ICC AVR 开发环境下编译:
#include
#include
Light LED: PB7-----(+LED-)-----GND
SensorLED: PA1-----(+LED-)-----PA2
***********************************/
#define int8u unsigned char
#define int16u unsigned int
#define LedPositive() {DDRA|=BIT(PA1)|BIT(PA2); PORTA|=BIT(PA1);PORTA&=~BIT(PA2); }
#define LedReverse() {DDRA|=BIT(PA1)|BIT(PA2); PORTA&=~BIT(PA1);PORTA|=BIT(PA2); }
#define LedRead() {DDRA&=(~BIT(PA2));PORTA&=~(BIT(PA1)|BIT(PA2)); }
void delay_100us(int16u time)
{
int16u i,j;
for(i=0;i
图2:强光照射在感光LED上时
以上程序是观察LED在20mS放电的情况,接下来是让程序自动检测放电过程从高到低的时间(测试发现2V以下时单片机就识别为低电平)
#include
#include
Light LED: PB7-----(+LED-)-----GND
SensorLED: PA1-----(+LED-)-----PA2
***********************************/
#define int8u unsigned char
#define int16u unsigned int
#define LedPositive() {DDRA|=BIT(PA1)|BIT(PA2); PORTA|=BIT(PA1);PORTA&=~BIT(PA2); }
#define LedReverse() {DDRA|=BIT(PA1)|BIT(PA2); PORTA&=~BIT(PA1);PORTA|=BIT(PA2); }
#define LedRead() {DDRA&=(~BIT(PA2));PORTA&=~(BIT(PA1)|BIT(PA2)); }
void LedScan()
{
LedReverse();
LedRead();
while(( PINA&BIT(PA2) ));
}
void main()
{
while(1)
{
LedScan();
}
}
图3: 无强光照射在感光LED上时
图4: 有强光照射在感光LED上时
由图3和图4可看出: LED放电时间大致在 80~240us之间,那么接下来的程序是以10us为基时,判断外界光照使LED的放电时间低于150us时,接在PB7上的LED点亮,外界光照使LED的放电时间超过150us时,接在PB7上的LED熄灭
#include
#include
Light LED: PB7-----(+LED-)-----GND
SensorLED: PA1-----(+LED-)-----PA2
***********************************/
#define int8u unsigned char
#define int16u unsigned int
#define LedOn() {DDRB|=BIT(PB7);PORTB|=BIT(PB7);}
#define LedOff() {DDRB|=BIT(PB7);PORTB&=~BIT(PB7);}
#define LedPositive() {DDRA|=BIT(PA1)|BIT(PA2); PORTA|=BIT(PA1);PORTA&=~BIT(PA2); }
#define LedReverse() {DDRA|=BIT(PA1)|BIT(PA2); PORTA&=~BIT(PA1);PORTA|=BIT(PA2); }
#define LedRead() {DDRA&=(~BIT(PA2));PORTA&=~(BIT(PA1)|BIT(PA2)); }
void delay_10us(int16u time) //10us*time
{
int16u i,j;
for(i=0;i//150us
{
LedOff();
}
LedOn();
}
}
图5 无强光照射在感光LED上时
图6 有强光照射在感光LED上时
实验结论:
可以利用发光二极管这种特性,设计感光的产品,比如感受外界光线亮暗程度自动调节灯的亮度等,由于同种发光二极管也存在着特性的差异,所以可以在感光二极管的阴极适当的串一个小电阻,这样批量生产的时候不会出现产品的不一致性
以上只是本人做的实验结果,可能和其它人的实验存在着很大的出入,我只是想通过本实验让大家认识到发光二极管的这一特性.