基于Si光电池的照度计设计与调试方案.doc_第1页
基于Si光电池的照度计设计与调试方案.doc_第2页
基于Si光电池的照度计设计与调试方案.doc_第3页
基于Si光电池的照度计设计与调试方案.doc_第4页
基于Si光电池的照度计设计与调试方案.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Si光电池的照度计设计与调试方案1 技术指标(1) 要求系统测量范围为0-200lx,测量精度达到1lx;(2) 设计光电池输出信号处理电路,要求可以控制处理后的电压幅度;(3) 设计照度计硬件电路系统,要求系统各个模块能够正常工作;(4) 设计照度计软件控制系统,要求系统整体工作稳定;(5) 给设计系统定标,要求测量结果误差在1%以内。2 设计方案及其比较 当光电池的光敏面收到光照射时,PN节耗尽区内的光生电子与空穴在内建电场力的作用下分别向N区和P区运动,在闭合的电路中产生光电流。首先将光电流经过I/V变换和电压放大后形成直流电压信号,其次通过模数转换电路将处理得到的直流电压信号转换为数字电压信号,再通过单片机处理后得到可以反应光照度的数字信号,最后通过LCD实时显示出来。照度计的系统框图如图1所示。图1 照度计系统框图2.1 方案一 通过电阻转换的方式进行I/V转换,如图2,之后将电压放大后的直流电压信号通过由ADC0809构成的A/D转换模块得到数字电压信号,然后,通过单片机得到可以反应光照度的数字信号,最后,通过LED数码管实时显示出来。图2 电阻转换模块2.2 方案二 通过三极管构建放大电路得到电压信号进行I/V转换,如图3,之后将电压放大后的直流电压信号通过由ADC0809构成的A/D转换模块得到数字电压信号,然后,通过单片机得到可以反应光照度的数字信号,最后,通过LED数码管实时显示出来。图3 三极管转换模式2.3 方案三 通过集成运放芯片构建放大电路得到电压信号进行I/V转换,如图4,之后将电压放大后的直流电压信号通过由ADC0809构成的A/D转换模块得到数字电压信号,然后,通过单片机得到可以反应光照度的数字信号,最后,通过LED数码管实时显示出来。 图4 集成运放转换模式2.4 方案比较三种方案各有优缺点,方案一适合在电流较大的情况下使用,方案二适合在电流变换范围小的情况下使用,方案三适用范围广,但成本会提高很多。由于此次课程设计电路板上已经有运放芯片,故采取方案三。3 实现方案3.1 硬件部分系统的硬件由I/V变换模块、光电池前置放大模块、A/D转换模块、单片机控制模块以及数码管显示模块组成,如图5,Proteus仿真图如图6所示。当光电池的光敏面收到光照射时,PN节耗尽区内的光生电子与空穴在内建电场力的作用下分别向N区和P区运动,在闭合的电路中产生光电流。因为光电流需要转换为电压信号,才能通过数码管显示,所以需要进行I/V变换。但是,所得的电压值过小,不宜测量,故需要电压放大模块将其放大为直流电压信号。其次,数码管显示的是数字信号,所以,需要将放大得到的直流电压信号进过A/D转换模块转换为数字电压信号。最后,通过单片机处理后得到可以反应光照度的数字信号,并通过数码管实时显示出来。图5 系统电路图图6 总电路图1 光电池和电压放大及I/V转换模块本系统选用的硅光电池光谱响应波长一般为0.41.1微米,峰值响应波长为0.9微米,其特性曲线如图7所示。在不同光照下,硅光电池有不同的电信号输出,且二者之间具有单值对应关系,因此,可以通过检测其输出电信号并根据其输出特性关系,得到对应的光照度信息,以达到光照度检测的目的。图7 硅光电池光谱响应特性曲线 该模块使用LM358运算放大芯片实现,如图8所示,该芯片引脚如图9所示,可以实现I/V变换,即将光电流信号转换为直流电压信号,并且进行放大。图8 电压放大及I/V转换模块图9 LM358引脚图 2 A/D转换模块 该模块由PCF8591芯片实现,如图10所示,该芯片引脚如图11所示,可以实现A/D转换,将直流电压信号转换为数字电压信号。 PCF8591各引脚功能如下: AIN0、AIN1、AIN2、AIN3:模拟信号输入端; A0、A1、A2:引脚地址端; VDD、VSS:电源端; SDA、SCL:I2C总线的数据线、时钟线; OSC:外部时钟输入端,内部时钟输出端; EXT:内部、外部时钟选择线,使用内部时钟时EXT接地; AGND:模拟信号地; AOUT:D/A转换输出端; VREF:基准电源端;图10 A/D转换模块图11 PCF8591引脚图 3 单片机控制模块 该模块由89C51芯片实现,如图12所示,89C51引脚图如图13所示。该模块通过芯片内部的程序控制驱动PCF8591芯片并采集模数转换后的数字信号,对采集后的数字信号进行处理,控制数码管显示系统检测得到的照度值。图12 单片机系统图13 89C51引脚图 4 数码管显示系统及锁存器 该模块由芯片74HC573和数码管实现,如图14,74HC573引脚图如图15所示。数码管段选使用573锁存器,因为单片机引脚直接驱动功率不太够。图14 数码管显示系统及锁存器图15 74HC5733.2 软件部分程序部分代码如下:1 main.c/* * 普中科技-* 实 验 名 : AD显示试验* 实验说明 : 使用数码管显示AD读取到电位器的电压值* 连接方式 : 见连接图* 注 意 : */#include#includei2c.h/-定义使用的IO-/#define GPIO_DIG P0sbit LSA=P22;sbit LSB=P23;sbit LSC=P24;sbit LE=P22;/-定义PCF8591的读写地址-/#define WRITEADDR 0x90 /写地址#define READADDR 0x91 /读地址/-定义全局变量-/unsigned char code DIG_CODE17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;unsigned char DisplayData8;/用来存放要显示的8位数的值/-声明全局函数-/void DigDisplay(); /动态显示函数void Pcf8591SendByte(unsigned char channel);unsigned char Pcf8591ReadByte();void Pcf8591DaConversion(unsigned char value);void DigDisplay();/* 长延时函数*/void delay(uchar z)uchar x,y;for(x=z;x0;x-)for(y=50;y0;y-);/* 函 数 名 : main* 函数功能 : 主函数* 输 入 : 无* 输 出 : 无*/void main()unsigned int adNum,n;uint b1,b,g,s;int time1;float value;uchar date10;while(1)time1+; if(time1%15)Pcf8591SendByte(0);datetime1%15 = Pcf8591ReadByte()*2;/-显示电位器电压-/Pcf8591SendByte(0); /发送电位器转换命令if(time1=150) time1=0;/adNum = Pcf8591ReadByte()*2;/将转换结果读走adNum = (date0+date1+date2+date3+date4+date5+date6+date7+date8+date9)/10.;/-我们8591每读取到一个1就表示5/256V,所以要知道电压值就乘以0.01953-/value = adNum * 0.01953/1.3; /转为电压值adNum = value * 1000; /保留两位小数n=adNum; / n=n*500./255;/ n=123; b1=n/1000; b=n%1000/100; s=n/10%10; g=n%10; LE=1;P0=0xfe;P1=tableb1;delay(10);P0=0xfd;P1=tableb;delay(10);P0=0xfb;P1=tables;delay(10);P0=0xf7;P1=tableg;delay(10);/* 函 数 名 : Pcf8591SendByte* 函数功能 : 写入一个控制命令* 输 入 : channel(转换通道)* 输 出 : 无*/void Pcf8591SendByte(unsigned char channel)I2C_Start();I2C_SendByte(WRITEADDR, 1); /发送写器件地址I2C_SendByte(0x40|channel, 0); /发送控制寄存器I2C_Stop();/* 函 数 名 : Pcf8591ReadByte* 函数功能 : 读取一个转换值* 输 入 : 无* 输 出 : dat*/unsigned char Pcf8591ReadByte()unsigned char dat;I2C_Start();I2C_SendByte(READADDR, 1);/发送读器件地址dat=I2C_ReadByte(); /读取数据I2C_Stop(); /结束总线 return dat;/* 函 数 名 : Pcf8591DaConversion* 函数功能 : PCF8591的输出端输出模拟量* 输 入 : value(转换的数值)* 输 出 : 无*/void Pcf8591DaConversion(unsigned char value)I2C_Start();I2C_SendByte(WRITEADDR, 1);/发送写器件地址I2C_SendByte(0x40, 1); /开启DA写到控制寄存器I2C_SendByte(value, 0); /发送转换数值I2C_Stop();/* 函 数 名 : DigDisplay* 函数功能 : 使用数码管显示* 输 入 : 无* 输 出 : 无*/void DigDisplay()unsigned char i;unsigned int j;for(i=0;i0; b-)for(a=2; a0; a-);/* 函 数 名 : I2C_Start()* 函数功能 : 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿* 输 入 : 无* 输 出 : 无* 备 注 : 起始之后I2C_SDA和I2C_SCL都为0*/void I2C_Start()I2C_SDA = 1;I2C_Delay10us();I2C_SCL = 1;I2C_Delay10us();/建立时间是I2C_SDA保持时间4.7usI2C_SDA = 0;I2C_Delay10us();/保持时间是4usI2C_SCL = 0;I2C_Delay10us();/* 函 数 名 : I2C_Stop()* 函数功能 : 终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿* 输 入 : 无* 输 出 : 无* 备 注 : 结束之后保持I2C_SDA和I2C_SCL都为1;表示总线空闲*/void I2C_Stop()I2C_SDA = 0;I2C_Delay10us();I2C_SCL = 1;I2C_Delay10us();/建立时间大于4.7usI2C_SDA = 1;I2C_Delay10us();/* 函 数 名 : I2cSendByte(uchar num)* 函数功能 : 通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,* * 保持发送信号I2C_SDA保持稳定* 输 入 : num ,ack* 输 出 : 0或1。发送成功返回1,发送失败返回0* 备 注 : 发送完一个字节I2C_SCL=0, 需要应答则应答设置为1,否则为0*/uchar I2C_SendByte(uchar dat, uchar ack)uchar a = 0,b = 0;/最大255,一个机器周期为1us,最大延时255us。for(a=0; a 7; /起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号dat = dat 4.7usI2C_SCL = 0;I2C_Delay10us();/时间大于4usI2C_SDA = 1;I2C_Delay10us();I2C_SCL = 1;while(I2C_SDA & (ack = 1)/等待应答,也就是等待从设备把I2C_SDA拉低b+;if(b 200) /如果超过200us没有应答发送失败,或者为非应答,表示接收结束I2C_SCL = 0;I2C_Delay10us();return 0; I2C_SCL = 0;I2C_Delay10us(); return 1;/* 函 数 名 : I2cReadByte()* 函数功能 : 使用I2c读取一个字节* 输 入 : 无* 输 出 : dat* 备 注 : 接收完一个字节I2C_SCL=0*/uchar I2C_ReadByte()uchar a = 0,dat = 0;I2C_SDA = 1;/起始和发送一个字节之后I2C_SCL都是0I2C_Delay10us();for(a=0; a8; a+)/接收8个字节I2C_SCL = 1;I2C_Delay10us();dat = 1;dat |= I2C_SDA;I2C_Delay10us();I2C_SCL = 0;I2C_Delay10us();return dat;3 i2c.h#ifndef _I2C_H_#define _I2C_H_#include/-重定义关键词-/#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif/-定义使用的IO口-/sbit I2C_SCL = P21;sbit I2C_SDA = P20;/-声明全局变量-/void I2C_Delay10us();void I2C_Start();void I2C_Stop();uchar I2C_SendByte(uchar dat, uchar ack);uchar I2C_ReadByte();#endif3.3 测试电路 测试电路布线图如图16所示。图16 测试电路布线图4 调试过程及结论4.1 调试过程的现象连接好电路后,将单片机程序下载进芯片,打开开发板总开关,数码管显示当前光照度对应的电压值,不过有小幅跳变,当用手完全遮挡光电池的光敏面时,数码管显示0,当改变光强时,数码管显示的电压值随之变化,且光强变小时,电压值降低,光强变大时,电压值增加,即趋势是一样的。4.2 调试过程中出现的问题 1 使用烧录器下载单片机程序的过程中,发现程序不可下载,下载了相应的驱动后,仍然有问题,在老师的指点下,将P3口的接线换到别的接口,并且更改了程序后正常下载程序。 2 数码管显示乱码且顺序不对,因为段选和位

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论