Chinaunix首页 | 论坛 | 博客
  • 博客访问: 296900
  • 博文数量: 41
  • 博客积分: 857
  • 博客等级: 准尉
  • 技术积分: 614
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-11 12:42
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(2)

2012年(6)

2011年(32)

分类: C/C++

2011-08-16 13:58:06

LED非典型应用感光测试

作者:宋录振              QQ:405867746

感光原理:

利用LED的结电容,对LED进行充电然后检测LED的电压跳到低电平的时间,根据LED受光照强度的不同,检测放电时间。

感光过程:

状态1 正向导通LED发光

状态2 LED方向通电,电路对LED内部电容充电。充电后LED能保持+5V一段时间

状态3 正极地,阴极接端口高阻状态。则LED内部电容和光电流源形成一个放电回路。当LED接受光照越强,放电越快。则越快回复到低电压,我们则检测LED充电后通过放电,LED阴极电压从+5v到低电压(地)的放电时间来计算光照强度。
23步骤循环则为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   for(j=0;j<103;j++);
}
void LedScan()
{
LedReverse();
LedRead();
delay(20);
}

void main()
{
while(1)
    {
   LedScan();
   }
}  

1:无强光照射在感光LED上时

                                       

 

2:强光照射在感光LED上时

 

 

以上程序是观察LED20mS放电的情况,接下来是让程序自动检测放电过程从高到低的时间(测试发现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   for(j=0;j<8;j++);
}

int16u LedScan()
{
int16u count=0;

LedReverse();
LedRead();
while(( PINA&BIT(PA2) ))
    {
   delay_10us(1);
   count++;
   }
return count;  
}

void main()
{
while(1)
    {
   while(LedScan()<15) 
//150us
       {
      LedOff();
      }
   LedOn();
   }
}

 

         

5 无强光照射在感光LED上时 

 

                                                                                                       

    图6 有强光照射在感光LED上时  

 

 

 实验结论:

可以利用发光二极管这种特性,设计感光的产品,比如感受外界光线亮暗程度自动调节灯的亮度等,由于同种发光二极管也存在着特性的差异,所以可以在感光二极管的阴极适当的串一个小电阻,这样批量生产的时候不会出现产品的不一致性

 

以上只是本人做的实验结果,可能和其它人的实验存在着很大的出入,我只是想通过本实验让大家认识到发光二极管的这一特性.

阅读(2039) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

simonszapl2013-05-06 15:06:41

你好,想问一下,你这个LED是普通的LED 吗?还是感光的LED?