基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx
《基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
![基于Si光电池的照度计设计与调试方案Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/18/8c59f609-a8eb-4d3f-b827-cbfbf4673681/8c59f609-a8eb-4d3f-b827-cbfbf46736811.gif)
通过集成运放芯片构建放大电路得到电压信号进行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();
/***************************************************************************