基于Si光电池的照度计设计与调试任务书资料Word文档下载推荐.docx
《基于Si光电池的照度计设计与调试任务书资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于Si光电池的照度计设计与调试任务书资料Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
GND:
地。
REF(+):
参考电压正端。
REF(-):
参考电压负端。
START:
A/D转换启动信号输入端。
ALE:
地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换).
EOC:
转换结束信号输出引脚开始转换时为低电平,当转换结束时为高电平。
OE:
输出允许控制端,用以打开三态数据输出锁存器。
根据光电转换前置放大的三种电路,可以设计三种方案,它们分别是方案一:
电阻转换模式,方案二:
三极管转换模式,方案三:
集成运放转换模式。
2.1方案一
本方案的光电前置放大模块采用电阻转换模式,其电路图如下:
图3电阻转换电路
2.2方案二
本方案的光电前置放大模块采用三极管转换模式,其电路图如下:
图4三极管转换电路
2.3方案三
图5集成运放转换电路
2.4方案比较
三种方案各有优缺点,它们的不同之处在于光电信号处理模块。
纯电阻电路适合在电流较大的情况下使用,三极管电路适合在电流变化范围较小的情况下使用,集成运放芯片适用范围广,但成本会提高很多。
要从系统信号的实际要求和成本运算等各个方面考虑来选择适合I/V转换电路。
3.实现方案
选择方案二为实现方案。
所要设计的照度计电路电流变化范围小,所以方案二的三极管电路和方案三的集成运放芯片比较合适。
二考虑到成本问题,应选用方案二为实现电路。
图6电路仿真图
4.调试过程及结论
4.1电路连线
根据设计仿真图进行搭线,搞清楚实验开发板各个模块的内容以及接线柱的连接问题。
图7实际电路图
连线完成后,用相关软件将之前写好的程序导入到51芯片中,然后可以进行粗略的调试。
首先观察LCD显示板有无示数显示,然后用手机强光照射硅光电池,看看示数有何变化。
4.2调试过程中的数据记录及处理
将硅光电池置于合适的光照强度范围内,观察LCD示数的显示。
记录下数据并与标准照度计进行比较。
表1照度计原始数据记录表
标准照度计
实验照度计
32lx
36lx
38lx
40lx
44lx
45lx
50lx
51lx
55lx
58lx
62lx
64lx
68lx
72lx
71lx
78lx
77lx
4.3调试过程中遇到的问题
1)LCD显示屏第四个数字不显示,不发光。
经过检查后发现,该数字对应的引脚接线松动,重新插紧后,数码管显示出数字。
2)LCD显示的数字过大,数量级达到10^3,通过调试电阻,将数值降到适当范围内。
3)设计的照度计显示的数值与标准照度计有较大范围的误差。
对程序进行修改,从而降低了误差。
4.4结论
此次调试过程中遇到了很多问题,通过各种排查将误差降到最小,使自己设计的照度计与标准照度计尽量接近。
但是最后的出的数据仍然出现了问题,当光照强度在90lx范围内时,实验照度计显示的数值与标准照度计基本吻合。
但当光照强度超过了90lx,实验照度计便饱和了。
5.心得体会
从最开始的初定题目,到最后程序的完成,历经两周的时间。
在这期间,遇到了各种问题,各种困难,程序运行错误,无法实现功能的挫败和绝望感,解决问题后的欣喜和满足感,各种感受记忆犹新。
之所以选择基于硅光电池照度计这一课题,主要是因为觉得比较这个题目比较新颖。
其原理也比较容易理解,硅光电池受光的影响产生电流,经过并联采样电阻产生电压信号。
这次课程设计总体上对我来说并不那么简单,首先是距离学习光电技术实在是过的时间太久了,很多知识都忘记的差不多了,并且期间穿插有必修课的考试。
一边准备考试,一边准备课设确实让课设在时间上打了折扣。
考试结束后便全力投入到课设当中了,最终也做出了成品。
比起以往的实验,这次课设可谓提高了一个新的层次,它包含了各个方面的技术,基本上调用了自己所有的知识储备。
设计到C++,单片机,模电数电以及光电技术等我们所学的所有专业课程。
首先是要进行电路仿真,先用proteus做好电路图,然后再用keil编写程序将程序导入到51芯片中。
过程并没有那么顺利,现实总比想象残酷许多。
一开始是LCD不显示示数,然后再是示数没有变化。
通过很长一段时间的调试,才终于将仿真做好,并进行答辩。
其次就是真枪实弹的实物操作了。
按照电路图将电路连接好后,再导入程序。
发现电路并没有想仿真图一样显示,与标准照度计有着很大的出入。
通过不断的电路修改以及程序修改,照度计终于完成!
由于时间问题和自身编程能力限制,最后做出的照度计并不令我十分满意,当光照强度超过100lx时,我的照度计就饱和了。
但这次课设确实让我收获了很多,所学的理论知识也及时得到巩固。
6.参考文献
[1]马德骏等.C语言程序设计(第2版).科学出版社,2009.
[2]吴友宇.模拟电子电路.科学出版社,2005.
[3]伍时和.数字电子技术基础.清华大学出版社,2005.
[4]杨应平.光电技术.机械工业出版社,2005.
7.附录
导入芯片程序代码:
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitlcden=P2^1;
sbitlcdrs=P2^0;
sbitlcdrw=P2^2;
sbitadwr=P3^7;
//
sbitadcs=P3^0;
//oe==gnd
sbiteoc=P2^3;
ucharcodetable[]="
theillustionis"
;
ucharcodetable1[]="
lx"
uintnum,a,d,qian,bai,shi,ge,num1;
uintillusion,temp;
voidinit(void);
//初始化函数
voiddelay(uinta);
//延时函数
voidwrite_com(ucharcom);
//写指令函数
voidwrite_data(uchardate);
//写数据函数
voiddisplay(uintd);
//显示函数
voidmain(){
voidinit();
//初始化
EA=1;
//开总中断
ET0=1;
//开定时器中断
TR0=1;
//启动定时器
lcden=0;
/***********对1602液晶的模式进行设置***************/
write_com(0x38);
//设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);
//设置开显示,不显示光标
write_com(0x06);
//写一个字符后地址指针加一
write_com(0x01);
n(0x07);
//显示清零,数据指针清零
while
(1)
{
/*******开始不断扫描P1引脚是否有信号,并且对信号进行计算和显示********/
if(P1!
=0)
{
delay(10);
If(P1!
=0)//防止误判
adwr=0;
delay(5);
adwr=1;
while
(1);
for(a=10;
a>
0;
a--)
{temp=illusion*4;
temp=1000;
display(temp);
//显示照度
}
};
/**********************初始化程序************************/
voidinit(void)
TMOD=0x01;
//定时器0工作于计数方式1
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
//定时时间为50ms
num=0;
//
adcs=0;
//sign=0;
temp=0;
write_com(0x80);
/*************延时函数每次延时50ms********************/
voiddelay(uinta)
Uintb,c;
for(b=a;
b>
b--)
for(c=110;
c>
c--);
/************定时器中断函数*****************/
voidto_time()interrupt1
//中断函数里重新赋初值
num++;
If(num==20)//每20*50ms计算一次,并且将速度显示
//标志位
Illusion=P1;
}
}/***********写指令函数************/
voidwrite_com(ucharcom)
lcdrs=0;
lcdrw=0;
P0=com;
lcden=1;
delay(20);
}/*********写数据函数*************/
voidwrite_data(uchardate)
Lcdrs=1;
Lcdrw=0;
P0=date;
/*************显示函数********************/
voiddisplay(uintillusion)
qian=illusion/1000;
bai=illusion%1000/100;
shi=illusion%100/10;
ge=illusion%10;
//速度范围为0至9999.
for(num1=0;
num1<
20;
num1++)//显示前面一段字符
write_data(table[num1]);
write_com(0x80+0x41);
//显示光照强度
write_data(0x30+qian);
write_com(0x80+0x42);
write_data(0x30+bai);
write_com(0x80+0x43);
write_data(0x30+shi);
write_com(0x80+0x44);
write_data(0x30+ge);
write_com(0x80+0x47);
2;
num1++)
write_data(table1[num1]);