基于PN结的温度测量系统.docx
- 文档编号:11959434
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:19
- 大小:230.26KB
基于PN结的温度测量系统.docx
《基于PN结的温度测量系统.docx》由会员分享,可在线阅读,更多相关《基于PN结的温度测量系统.docx(19页珍藏版)》请在冰豆网上搜索。
基于PN结的温度测量系统
一.设计原理与总体方案
1.1二极管(PN结)特性
晶体二极管为一个由p型半导体和n型半导体形成的p-n结,在其界面处两侧形互相抑消作用使载流子的扩散电流增加引起了正向电流,并且和电压成指数关系。
理想PN结的正向电流IF和正向压降VF存在如下关系:
IF=Is*exp【-e*Vf/(k*T)】式中,-e为电子电量;k为玻耳兹曼常数;T为绝对温度;Is为反向饱和电流,与PN结材料的禁带宽度及温度有关.在此基础上得出PN结的正向电压Vf与热力学温度T之间的关系,从而证明半导体PN结在某个温度范围内是性能优良的温度传感器。
温度对二极管的性能有较大的影响,温度升高时,反向电流将呈指数规律增加,如硅二极管温度每增加8℃,反向电流将约增加一倍;锗二极管温度每增加12℃,反向电流大约增加一倍。
另外,温度升高时,二极管的正向压降将减小,每增加1℃,正向压降VD大约减小2mV,即具有负的温度系数。
这些可以从下图所示二极管的伏安特性曲线上看出。
据资料介绍:
在恒流模式下,If=If0,1n=If/If0=0,有:
S=(Vg0-Vf0)/T0-(kB/q)*(1+1nT/T0).因1nT/T0是T的缓变函数,S的模随着T增加而上升,但在不宽的温度范围内,S近似常数。
1.2主要电路方案分析
为保证整个温度测量范围内PN结的正向电流恒定,PN结的正向偏置采用恒流源驱动。
采用三极管的特性和特殊电路,让通过二极管的电流始终在100uA左右。
采用电桥连接方式使放大器放大传感器变化电压的差值。
电桥通过两个电阻和二极管并联构成,从而向放大器正负两端输入电压。
通过理论分析及仿真实验研究选择合适的电桥电路参数。
PN结的结电压变化是一个微弱信号,结电压在温度每变化1度时大约变化2mv左右,所以需要进行放大后才能被后续电路处理。
采用三运放高共模抑制比放大电路,放大电桥两端的差模信号。
设计中可采用三个独立的运放来构成放大电路,也可采用仪用放大器AD620,根据电路实际情况来设置。
(AD620的电源提供范围为正负2.3V到正负18V,低功耗,精确度高)。
采用一阶无源RC低通滤波器,截至频率为50HZ。
采用8位的AD转换元件AD0809,这样可以使用其8位数据线与CPU进行并口通信。
因为AD0809对于本设计来说,精度已经达到,所以未用采用SPI通信的12位AD7841等多位的AD转换器件。
采用单片机STC89C52(32个IO口,8KB的Flash等)。
而未用本身带有10位AD的ARM处理器,因为其对本设计而言会有很多硬件资源剩余,而且不熟悉其操作更会增加程序设计难度。
所以综合考虑,对本设计而言,一般单片机的性价比更高。
采用液晶LCD1602,可设置8位数据端口,2行显示,5*7点阵等。
1.3DS18B20介绍
DS18B20为一款单总线测温器件,它具有线路简单,体积小的特点。
由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对STC89C51单片机来说,硬件上并不支持单总线协议,因此,必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:
初始化时序、读时序、写时序。
所有时序都是将主机作为主设备,单总线器件作为从设备。
而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。
数据和命令的传输都是低位在先。
1.4实验原理
设计整体思路:
当通过PN结(以后用二极管表示)的电流恒定后,二极管两端的电压变化就主要与其感受的环境温度有关,所以以此来研究二极管的电压和温度特性。
通过电桥设置,将温度选择一个基准,即电压随温度变化的基准,当温度变化时,电压就会相对基准有个差值。
将差值信号放大,滤波,输入单片机处理和采用温度传感器18B20标定温度值,得到一个AD值和温度对应的表,然后用二极管测温度,得到AD值采用查表非线性处理得到温度值,结果和18B20测温结果对比显示在液晶上。
非线性处理方法原理:
将非线性的图形取一些采样点,通过这些采样点相邻之间直线相连就近似得到该曲线。
我们的实验目的之一就是得到二极管电压-温度特性曲线。
二极管测温原理:
由文献资料我们已知了PN结的温度电压变化特性是指数关系。
现假设我们测得N个温度值(可用18b20测得)y1,y2,……,yn以及的对应的AD采样值x1,x2,……,xn。
在N值足够大的情况下,我们认为相邻两点是线性的关系,因此,具体某测量点对应的温度值可用以下方法获得:
首先,我们需要知道未知值x那两个x值的中间,然后根据我们已知坐标(x0,y0)与(x1,y1),要得到[x0,x1]区间内某一
位置x在直线上的值。
根据图中所示,我们得到
假设方程两边的值为α,那么这个值就是插值系数—从x0到x的距离与从x0到x1距离的比值。
由于x值已知,所以可以从公式得到α的值
。
二.硬件设计
2.1电源部分
2.2电桥和放大部分
接线图:
为保证整个温度测量范围内二极管的正向电流恒定,其正向偏置采用恒流源驱动。
当三极管Q1正常工作时,其Ube=0.7V,通过三极管集电极端的电流I=(VDD-0.7v)/R1,只要VDD和R1恒定,I就一定。
那么由Q1和Q2两个三极管参数几乎一样,镜像得到通过二极管D1的电流值就为I,那么就一定了。
通过R3和R4在R4两端产生一个恒定基准电压(比如15度时VDD减去二极管的电压值),从而当温度变化时,电桥两端就会有一电压差。
采用LM324自己搭建三运放高共模抑制比放大电路。
从下表我们可以看出所测电路输出值与输入值的关系,在差值为0.1V到0.50V范围内,输出放大5倍,在差值为0.6V以上就有一些非线性关系。
根据电路设计方案,当差值大于0.90V以上时U值不随U0-U1变化而变化,U最大值为3.23V。
能够满足设计要求。
从理论上说,我们将0到100℃对应放大后的值为0.5V到3V,那么所有值都在其线性区域内,由资料介绍二极管的温度特性分析,每变化1℃就会使差值增加1mv,那么最多变化200mv,这样三运放放大倍数为12.5倍。
由差模增益:
调节硬件电路得到。
电路输出值与输入值的关系如下图:
2.3AD采样及显示部分
由于采用8位的ADC0809,其参考电压为3v,理论上输入的电压为0.875v到3v(对应温度为15°~100°),经过单片机由数码管动态显示温度。
三.程序设计
3.1温度传感器18B20标定温度
当DS18B20在完成一个读时序过程,至少需要60us才能完成。
写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。
3.2流程图及程序代码
程序代码:
#include
#include"LCD1602.h"
sbitAL=P2^3;
sbitSTART=P2^4;
sbitEOC=P2^6;
sbitOUTE=P2^5;
sbitAD_CLK=P2^7;
sbitDQ=P3^0;//定义通信端口
unsignedcharTempBuffer[10];//
unsignedcharADBuffer[10];//存显示的字符
/***********T0中断服务程序************/
voidt0(void)interrupt1using0
{
AD_CLK=~AD_CLK;
}
voidIntToT(unsignedintt,unsignedchar*str,unsignedcharn)
{
unsignedchara[5];
unsignedchari,j;
a[0]=(t/1000)%10;//取得整数值到数组
a[1]=(t/100)%10;
a[2]=-2;//
a[3]=(t/10)%10;
a[4]=(t/1)%10;
for(i=0;i<5;i++)//转成ASCII码
a[i]=a[i]+'0';
for(i=0;a[i]=='0'&&i<=3;i++);
for(j=5-n;j
{*str='';str++;}
for(i=0;i<5;i++)
{*str=a[i];str++;}//加入有效的数字
*str='\0';
}
voidDelay1ms(unsignedintcount)
{
unsignedinti,j;
for(i=0;i for(j=0;j<120;j++); } /********************18b20采集温度程序***********************/ //延时函数 voiddelay(unsignedinti) { while(i--); } //初始化函数 voidInit_DS18B20(void) { unsignedcharx=0; DQ=1;//DQ复位 delay(8);//稍做延时 DQ=0;//单片机将DQ拉低 delay(80);//精确延时大于480us DQ=1;//拉高总线 delay(14); x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败 delay(20); } //读一个字节 ReadOneChar(void) { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay(4); } return(dat); } //写一个字节 voidWriteOneChar(unsignedchardat) { unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1; } //delay(4); } //读取温度 ReadTemperature(void) { unsignedchara=0; unsignedcharb=0; unsignedintt=0; floattt=0; Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0x44);//启动温度转换 Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度 a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; t=tt*100;//放大10倍输出并四舍五入---此行没用 return(t); } /************************************************************/ unsignedcharADC(void)//AD采样函数 { unsignedchartemp=0; AL=0;START=0;OUTE=0; AL=1;START=1; AL=0;START=0; while(EOC==0); OUTE=1; temp=P1; OUTE=0; return(temp); } unsignedcharDATA_GET(void)//AD滤波(均值滤波等) { unsignedcharAD_DATA[12];//存放12次AD采样值 unsignedchargetdata,temp; unsignedintR_DATA=0; unsignedchari,j; for(i=0;i<=11;i++) { AD_DATA[i]=ADC(); } for(i=0;i<=11;i++) { for(j=0;j<=10;j++) if(AD_DATA[j]>AD_DATA[j+1]) { temp=AD_DATA[j]; AD_DATA[j]=AD_DATA[j+1]; AD_DATA[j+1]=temp; } } for(i=1;i<=10;i++) { R_DATA=AD_DATA[i]+R_DATA; } R_DATA=R_DATA/10; getdata=(unsignedchar)R_DATA; returngetdata; } unsignedintxianxing(unsignedcharDATA_IN)/*线性校正函数*/ { floatY[16]={15.18,20.40,23.12,27.63,33.27,36.23,40.93,44.74,47.24,50.12,52.5,53.18,55.31,57.87,59.61,65.91}; unsignedcharX[16]={94,106,112,122,138,146,155,163,173,181,185,189,192,194,203,208}; unsignedcharm=0; unsignedintR_DATA=0; floattemp=0.0; if(DATA_IN DATA_IN=X[0]; if(DATA_IN>X[15]) DATA_IN=X[15]; for(m=1;m<16;m++) { if(DATA_IN<=X[m]) {temp=(float)((DATA_IN-X[m-1])/(X[m]-X[m-1]))*(Y[m]-Y[m-1])+Y[m-1]; break; } } temp*=100; R_DATA=(unsignedint)temp; return(R_DATA); } main() { unsignedcharAD_OUT=0; unsignedintT_OUT=0; unsignedintDATA; EA=1;//开总中断 TMOD=0x02;//设定定时器T0工作方式 TH0=216;//利用T0中断产生CLK信号 TL0=216; TR0=1;//启动定时器T0 ET0=1; LCD_Initial(); Delay1ms(10); GotoXY(0,0); Print("Thetemperature"); GotoXY(0,1); Print("gathersystem"); while (1) { AD_OUT=DATA_GET(); DATA=xianxing(AD_OUT); IntToT(DATA,&ADBuffer[0],5);//Delay1ms (1); T_OUT=ReadTemperature(); IntToT(T_OUT,&TempBuffer[0],5); GotoXY(0,0); Print("18b20: 'C");//Delay1ms (1); GotoXY(8,0); Print(&TempBuffer[0]);Delay1ms (1); GotoXY(0,1); Print("1N4007: 'C");Delay1ms (1); GotoXY(8,1); Print(&ADBuffer[0]); Delay1ms(100); } } 四.实验结果及结论 4.1实验结果 所测二极管PN结(1N4007)电压-温度特性曲线: 二极管两端电压—温度基本成指数关系: AD值 18b20所测温度 94 15.18 96 16 100 16.06 106 20.4 112 23.12 116 24.81 122 27.63 129 31.84 138 33.27 146 36.23 155 40.93 159 42.38 163 44.74 168 46.43 173 47.24 177 49.32 181 50.12 185 52.5 18b20温度(℃) 1N4007温度(℃) 189 53.18 18.93 18.22 192 55.31 26.81 27.14 194 57.87 30.38 31.22 198 58.25 32.68 33.27 200 59.37 33.56 34.01 203 59.61 64.37 65.91 204 62.9 64.37 65.91 205 67.8 207 72.6 208 76.9 208 80.63 208 88.72 209 95.46 4.2结论 通过对电路的实际测试,电路基本上达到了预定要求,能够测得15摄氏度到100摄氏度左右的温度,但当温度高于65摄氏度左右时,电压值不会随温度升高而升高。 五.设计心得 本次课程设计由于是个人独立选定课题,所以在此过程的开始时基本上所有人都在自己独立思考,因此本次课程设计的前期多半是在摸索中前进,当然付出中会有收获,本次课程设计让我弄懂了很多以前感觉模糊的东西,同时也带给我成功的喜悦感,增加了我的自信心,当我看到由我自己设计的东西由想法变成实物时,我的心里充满了成功的喜悦感。 回想起此次课程设计过程中经历的种种困难,遇到不明白的问题时,与他人讨论,请教老师的过程,所有的努力都指向一个明确的目标----确保课程设计的成功,我真的很感动。 通过本次课程设计,我们学习了实际问题的处理方法。 本次课程设计过后,我们巩固了最电器元件的识别和选择方面的知识,熟悉了各种绘图仿真软件及测试仪器的应用,编程的经验。 让我们最有收获的是在遇到问题时,能够有步骤的分析,我们感受解决问题后的乐趣。 虽然有少数理论问题还没分析清楚,这也跟我们提供了很多继续思考学习的空间。 参考文献 [1]史健芳智能仪器设计基础.北京: 电子工业出版社,2007. [2]李宏张家田液晶显示器件应用技术.北京: 机械工业出版社,2004. [3]彭介华.电子技术课程设计指导.北京: 高等教育出版社,1997. [4]谢自美.电子线路设计.武汉: 华中科技大学出版社,2006. [5]童诗白、华成英.模拟电子技术基础.4版.北京: 高等教育出版社,2006. [6]陆秀令、韩清涛.模拟电子技术.北京: 北京大学出版社,2007.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PN 温度 测量 系统