LED照明闭环控制系统.docx
《LED照明闭环控制系统.docx》由会员分享,可在线阅读,更多相关《LED照明闭环控制系统.docx(14页珍藏版)》请在冰豆网上搜索。
![LED照明闭环控制系统.docx](https://file1.bdocx.com/fileroot1/2023-6/27/28d96277-137d-4f01-9480-ede5faf4905b/28d96277-137d-4f01-9480-ede5faf4905b1.gif)
LED照明闭环控制系统
基于TLC1543的LED照明闭环控制设计
摘要:
设计了一个光强采集系统,能实时采集环境光线强度;根据环境光线强度,自动调调节亮度,光强采集采用光敏电阻,采用12个3mm白光LED,组成LED闭环控制照明系统。
LED采用电流驱动,电流步距可调。
通过AD采集光线强度,通过单片机I/O实现PWM功率控制.
关键字:
光敏电阻、LED、AD、PWM
1、引言
随着社会科学技术的发展,尤其电子技术的发展,给人们生活带来了方便和经济.现在从单片机控制技术发展到ARM控制技术,但是生活中好多领域仍然有选用单片机技术来开发产品,因为它的技术成熟,而且开发成本比较廉价,这使开发部门对单片机的向往。
本文所设计的是用单片机来控制LED灯的亮度的变化.
1、LED照明闭环控制系统的原理和原理图
LED照明闭环控制系统是通过光敏电阻来采集光线强度,来改变自身的电压,从而改变AD输入电压的值,AD输出信号来控制单片机,单片机根据AD输出信号进行处理,输出PWM信号来控制三极管的基级电压,从而三级管被导通,这个时候电流流经12个LED,把全部点亮,但是亮度强度,由光线强度决定,流经的电流通过PWM信号输出决定。
系统电源为+5V.
下图为LED照明闭环控制系统的原理图:
LED照明闭环控制系统的原理图
2、硬件部分的设计
2.1硬件的组成
LED照明闭环控制系统的硬件主要由A/D转换控制器、三极管、12个LED、单片机、光敏电阻、MAX232等组成。
2。
2元器件的选择
⑴光敏电阻
光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大。
光敏电阻器一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)。
常用的光敏电阻器硫化镉光敏电阻器,它是由半导体材料制成的。
光敏电阻器的阻值随入射光线(可见光)的强弱变化而变化,在黑暗条件下,它的阻值(暗阻)可达1~10M欧,在强光条件(100LX)下,它阻值(亮阻)仅有几百至数千欧姆。
光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(0。
4~0.76)μm的响应很接近,只要人眼可感受的光,都会引起它的阻值变化。
设计光控电路时,都用白炽灯泡(小电珠)光线或自然光线作控制光源,使设计大为简化.为了设计方便,光敏电阻统一为5506型号。
⑵三极管
三极管是一种控制元件,主要用来控制电流的大小,以共发射极接法为例(信号从基极输入,从集电极输出,发射极接地),当基极电压UB有一个微小的变化时,基极电流IB也会随之有一小的变化,受基极电流IB的控制,集电极电流IC会有一个很大的变化,基极电流IB越大,集电极电流IC也越大,反之,基极电流越小,集电极电流也越小,即基极电流控制集电极电流的变化。
但是集电极电流的变化比基极电流的变化大得多,这就是三极管的放大作用.IC的变化量与IB变化量之比叫做三极管的放大倍数β(β=ΔIC/ΔIB,Δ表示变化量。
),三极管的放大倍数β一般在几十到几百倍.三极管在放大信号时,首先要进入导通状态,即要先建立合适的静态工作点,也叫建立偏置,否则会放大失真.在三极管的集电极与电源之间接一个电阻,可将电流放大转换成电压放大:
当基极电压UB升高时,IB变大,IC也变大,IC在集电极电阻RC的压降也越大,所以三极管集电极电压UC会降低,且UB越高,UC就越低,ΔUC=ΔUB.本文设计要求,LED被电流驱动根据设计原理,本文采用三极管来驱动12个LED,型号统一为8550PNP管。
⑶A/D转换
A/D转化电路.亦称“模拟数字转换器”,简称“模数转换器"。
将模拟量或连续变化的量进行量化(离散化),转换为相应的数字量的电路。
A/D变换包含三个部分:
抽样、量化和编码.一般情况下,量化和编码是同时完成的。
抽样是将模拟信号在时间上离散化的过程;量化是将模拟信号在幅度上离散化的过程;编码是指将每个量化后的样值用一定的二进制代码来表示。
d/a转换器是把数字量转换成模拟量的线性电路器件,已做成集成芯片。
由于实现这种转换的原理和电路结构及工艺技术有所不同,因而出现各种各样的d/a转换器.目前,国外市场已有上百种产品出售,他们在转换速度。
转换精度.分辨率以及使用价值上都各具特色。
d/a转换器的主要参数:
衡量一个d/a转换器的性能的主要参数有:
(1)分辨率
是指d/a转换器能够转换的二进制数的位数,位数多分辨率也就越高。
(2)转换时间
指数字量输入到完成转换,输出达到最终值并稳定为止所需的时间。
电流型d/a转换较快,一般在几ns到几百ns之间。
电压型d/a转换较慢,取决于运算放大器的响应时间。
(3)精度
指d/a转换器实际输出电压与理论值之间的误差,一般采用数字量的最低有效位作为衡量单位.
(4)线性度
当数字量变化时,d/a转换器输出的模拟量按比例关系变化的程度。
理想的d/a转换器是线性的,但是实际上是有误差的,模拟输出偏离理想输出的最大值称为线性误差。
a/d转换器的功能是把模拟量变换成数字量。
由于实现这种转换的工作原理和采用工艺技术不同,因此生产出种类繁多的a/d转换芯片。
a/d转换器按分辨率分为4位。
6位。
8位.10位。
14位.16位和bcd码的31/2位.51/2位等。
按照转换速度可分为超高速(转换时间≤330ns),次超高速(330~3。
3μs),高速(转换时间3。
3~333μs),低速(转换时间>330μs)等.a/d转换器按照转换原理可分为直接a/d转换器和间接a/d转换器。
所谓直接a/d转换器,是把模拟信号直接转换成数字信号,如逐次逼近型,并联比较型等.其中逐次逼近型a/d转换器,易于用集成工艺实现,且能达到较高的分辨率和速度,故目前集成化a/d芯片采用逐次逼近型者多;间接a/d转换器是先把模拟量转换成中间量,然后再转换成数字量,如电压/时间转换型(积分型),电压/频率转换型,电压/脉宽转换型等.其中积分型a/d转换器电路简单,抗干扰能力强,切能作到高分辨率,但转换速度较慢。
有些转换器还将多路开关.基准电压源.时钟电路。
译码器和转换电路集成在一个芯片内,已超出了单纯a/d转换功能,使用十分方便。
由于本文设计需要,采用TLC1543作为A/D转换。
⑷串口芯片MAX232
MAX232产品是由德州仪器公司(TI)推出的一款兼容RS232标准的芯片.该器件包含2驱动器、2接收器和一个电压发生器电路提供TIA/EIA—232-F电平.该器件符合TIA/EIA—232—F标准,每一个接收器将TIA/EIA—232—F电平转换成5—VTTL/CMOS电平.每一个发送器将TTL/CMOS电平转换成TIA/EIA-232—F电平。
根据需要本设计选用MAX232作为串口芯片,使之来通信。
⑸单片机SST89E516RD
单片机到底是什么呢?
就是一个电脑,只不过是微型的,麻雀虽小,五脏俱全:
它内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可.。
。
.。
。
用它来做一些控制电器一类不是很复杂的工作足矣了。
我们现在用的全自动滚筒洗衣机,排烟罩VCD等等的家电里面都可以看到它的身影!
..。
。
..它主要是作为控制部分的核心部件。
它是一种在线式实时控制计算机,在线式就是现场控制,需要的是有较强的抗干扰能力,较低的成本,这也是和离线式计算机的(比如家用PC)的主要区别.
单片机是靠程序的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的.一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!
但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!
只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!
由于单片机对成本是敏感的,所以目前占统治地位的软件还是最低级汇编语言(近几年,C语言也开始广泛被应用),它是除了二进制机器码以上最低级的语言了,既然这么低级为什么还要用呢?
很多高级的语言已经达到了可视化编程的水平为什么不用呢?
原因很简单,就是单片机没有家用计算机那样的CPU,也没有像硬盘那样的海量存储设备。
一个可视化高级语言编写的小程序里面即使只有一个按钮,也会达到几十K的尺寸!
对于家用PC的硬盘来讲没什么,可是对于单片机来讲是不能接受的。
单片机在硬件资源方面的利用率必须很高才行,所以汇编虽然原始却还是在大量使用.一样的道理,如果把巨型计算机上的操作系统和应用软件拿到家用PC上来运行,家用PC的也是承受不了的。
目前最常用的单片机为MCS-51,是由美国INTEL公司(生产CPU的英特尔)生产的,89C51是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生产的,其内核兼容MCS—51单片机。
本文采用型号为SST89E516RD单片机输出信号来控制LED的亮度.
3、软件部分的设计
本文设计所涉及到的软件就是对A/D转换的输出信号的处理从而来控制LED的亮度变化。
程序代码如下:
/*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数*
*设定为C=10,即0。
01mS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0。
01ms,这样*
*可以设定占空比可从1—100变化。
即0.01ms*100=1ms*/
******************************************************************************/
#defineucharunsignedchar
/*****************************************************************************
*TH0和TL0是计数器0的高8位和低8位计数器,计算办法:
TL0=(65536-C)%256;*
*TH0=(65536—C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
*工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时*
*间为1ms*65536=65。
536ms*
******************************************************************************/
#defineV_TH00XFF
#defineV_TL00XF6
#defineV_TMOD0X01
#include<1602shiwu。
h>
#includeh〉
#defineSUM20
#defineCSP1_7
#defineCLKP1_4
#defineDINP1_5
#defineSD0P1_6
#defineEOCP1_3
sbitS1=P2^4;//增加键
sbitS2=P2^5;//减少键
sbitS3=P2^2;
voidinit_sys(void);/*系统初始化函数*/
voidDelay5Ms(void);
voidtimer0(void);
unsignedcharZKB1;
//sbitcs=P3_0;
//sbitrd=P3_1;
//sbitwr=P3_3;
//sbitwr=P3_3;
//sbitp=P1_1;
uchargetdata;
ucharcodetable[]={”0123456789"};
uinttmp1,tmp0;
floattest;
uintTLC_1543_addr(ucharaddr)
{
uintdate_out=0;
uchark;
uchari;
ucharj;
CLK=0;
CS=0;
for(i=0;i〈4;i++)
{
DIN=(bit)(addr&0x08);
CLK=1;
CLK=0;
addr〈〈=1;
}
for(j=0;j<6;j++)//填充6个CLOCK
{
CLK=1;CLK=0;
}
CS=1;
mDelay(5);
CS=0;//等待AD转换
mDelay(5);
for(k=0;k〈10;k++)
{
SD0=1;//非P0口作为数据总线使用时,读入数据前要赋值1,特别
CLK=1;//是既用于写有用于读的情况下.
date_out〈〈=1;
if(SD0)date_out+=1;
CLK=0;
}
return(date_out);
}
/*voidstart()
{
wr=1;//mmDelay(100);
wr=0;//mmDelay(100);
wr=1;//mmDelay(100);
}*/
voiddisplay_num(unsignedlongintnumx,uintx)
{
WriteChar(table[numx/10000],x,0);//?
?
WriteChar(table[(numx%10000)/1000],x,1);//?
?
WriteChar(table[((numx%10000)%1000)/100],x,2);//?
?
WriteChar(table[(((numx%10000)%1000)%100)/10],x,3);//?
?
WriteChar(table[(((numx%10000)%1000)%100)%10],x,4);//?
?
WriteString(”mV”,x,5);
}
charflag;
voiddelayms(unsignedcharms);
voiddelay(unsignedchart);
voidmain()
{uinti;
unsignedlonginttmp;
P0=0;
SetCur(NoCur);
while
(1)
{tmp1+=TLC_1543_addr(0x01);//取20次AD转换的结果,求平均值
//i——;
//if(i==0)
//{
//tmp1=tmp1/SUM;
tmp=tmp1*49999/1023;
//tmp=4*tmp;
tmp1=0;
i=SUM;
//EOC=~EOC;
//}
//display_num(tmp,1);
//if(!
EOC)
//{
//i=SUM
tmp0+=TLC_1543_addr(0x00);//取50次AD转换的结果,求平均值
//i—-;
//if(i==0)
//{
//tmp0=tmp0/SUM;
tmp=tmp0*49999/1023;
//tmp=tmp;
tmp0=0;
i=SUM;
display_num(tmp,1);
WriteString(”ADC",0);
//}
//}
//EOC=1;
/*对占空比值限定范围*/
if(ZKB1>99)ZKB1=1;
if(TLC_1543_addr(0x00)〈=50)ZKB1=5;
if(50〈TLC_1543_addr(0x00)<=204)ZKB1=20;
if(204if(408〈TLC_1543_addr(0x00)〈=612)ZKB1=50;
if(612〈TLC_1543_addr(0x00)〈=816)ZKB1=70;
if(816〈TLC_1543_addr(0x00)〈=916)ZKB1=80;
if(612〈TLC_1543_addr(0x00)〈=1000)ZKB1=90;
if(1000}
}
/******************************************************
*函数功能:
对系统进行初始化,包括定时器初始化和变量初始化*/
voidinit_sys(void)/*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD;//T0定时方式1
TH0=V_TH0;
TL0=V_TL0;
TR0=1;//启动T0
ET0=1;//允许T0中断
EA=1;//开中断
}
//延时
voidDelay5Ms(void)
{
unsignedintTempCyc=1000;
while(TempCyc--);
}
/*中断函数*/
voidtimer0(void)interrupt1
{
staticucharclick=0;/*中断次数计数器变量*/
TH0=V_TH0;/*恢复定时器初始值*/
TL0=V_TL0;
++click;
if(click>=100)click=0;
if(click〈=ZKB1)/*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
S3=0;
else
S3=1;
}
4、结论
通过本文设计能让我更进一步对相关硬件的了解和掌,特别是三极管的电流驱动,这个三极管驱动不仅仅只适用于驱动12个LED灯,而且也可以用于其它的场合,比如电动助力转向系统中就利用桥式三级管电流驱动电动机,从而达到助力转向。
由于水平有限,可能所设计的系统存在问题,今后需要做进一步的完善。
参考文献:
[1]周志敏,周纪海,纪爱华LED驱动电路设计与应用.北京:
人民邮电出版社,2006.
[2]周志敏,纪爱华,白光LED驱动电路设计与应用实例.人民邮电出版社,2009。
9
[3]武庆生,单片机及其应用,电子科技大学出版社,2000。
10.