基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx

上传人:b****5 文档编号:16079921 上传时间:2022-11-18 格式:DOCX 页数:19 大小:156.88KB
下载 相关 举报
基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx_第1页
第1页 / 共19页
基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx_第2页
第2页 / 共19页
基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx_第3页
第3页 / 共19页
基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx_第4页
第4页 / 共19页
基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx

《基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。

基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx

通过集成运放芯片构建放大电路得到电压信号进行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.4~1.1微米,峰值响应波长为0.9微米,其特性曲线如图7所示。

在不同光照下,硅光电池有不同的电信号输出,且二者之间具有单值对应关系,因此,可以通过检测其输出电信号并根据其输出特性关系,得到对应的光照度信息,以达到光照度检测的目的。

图7硅光电池光谱响应特性曲线

该模块使用LM358运算放大芯片实现,如图8所示,该芯片引脚如图9所示,可以实现I/V变换,即将光电流信号转换为直流电压信号,并且进行放大。

图8电压放大及I/V转换模块

图9LM358引脚图

2A/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:

基准电源端;

图10A/D转换模块

图11PCF8591引脚图

3单片机控制模块

该模块由89C51芯片实现,如图12所示,89C51引脚图如图13所示。

该模块通过芯片内部的程序控制驱动PCF8591芯片并采集模数转换后的数字信号,对采集后的数字信号进行处理,控制数码管显示系统检测得到的照度值。

图12单片机系统

图1389C51引脚图

4数码管显示系统及锁存器

该模块由芯片74HC573和数码管实现,如图14,74HC573引脚图如图15所示。

数码管段选使用573锁存器,因为单片机引脚直接驱动功率不太够。

图14数码管显示系统及锁存器

图1574HC573

3.2软件部分

程序部分代码如下:

1main.c

/*******************************************************************************

*

*普中科技

--------------------------------------------------------------------------------

*实验名:

AD显示试验

*实验说明:

使用数码管显示AD读取到电位器的电压值

*连接方式:

见连接图

*注意:

*******************************************************************************/

#include<

reg51.h>

#include"

i2c.h"

//--定义使用的IO--//

#defineGPIO_DIGP0

sbitLSA=P2^2;

sbitLSB=P2^3;

sbitLSC=P2^4;

sbitLE=P2^2;

//--定义PCF8591的读写地址--//

#defineWRITEADDR0x90//写地址

#defineREADADDR0x91//读地址

//--定义全局变量--//

unsignedcharcodeDIG_CODE[17]={

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的显示码

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

unsignedcharDisplayData[8];

//用来存放要显示的8位数的值

//--声明全局函数--//

voidDigDisplay();

//动态显示函数

voidPcf8591SendByte(unsignedcharchannel);

unsignedcharPcf8591ReadByte();

voidPcf8591DaConversion(unsignedcharvalue);

/******************************************************************

长延时函数

******************************************************************/

voiddelay(ucharz)

{

ucharx,y;

for(x=z;

x>

0;

x--)

for(y=50;

y>

y--);

}

*函数名:

main

*函数功能:

主函数

*输入:

*输出:

voidmain()

unsignedintadNum,n;

uintb1,b,g,s;

inttime1;

floatvalue;

uchardate[10];

while

(1)

{

time1++;

if(time1%15)

{

Pcf8591SendByte(0);

date[time1%15]=Pcf8591ReadByte()*2;

}

//--显示电位器电压--//

//Pcf8591SendByte(0);

//发送电位器转换命令

if(time1==150)

{time1=0;

//adNum=Pcf8591ReadByte()*2;

//将转换结果读走

adNum=(date[0]+date[1]+date[2]+date[3]+date[4]+date[5]+date[6]+date[7]+date[8]+date[9])/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=table[b1];

delay(10);

P0=0xfd;

P1=table[b];

P0=0xfb;

P1=table[s];

P0=0xf7;

P1=table[g];

Pcf8591SendByte

写入一个控制命令

channel(转换通道)

voidPcf8591SendByte(unsignedcharchannel)

{

I2C_Start();

I2C_SendByte(WRITEADDR,1);

//发送写器件地址

I2C_SendByte(0x40|channel,0);

//发送控制寄存器

I2C_Stop();

/***************************************************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学反思汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1