1、课程设计基于PN结的温度测量系统设计智能仪器设计基础课 程 设 计 报 告论文题目: 基于1N4007的温度测量电路设计 学院(系): 电子信息与自动化学院 班 级: 学生姓名: 指导教师: 基于PN结的温度测量系统设计摘要: 本文给出了一种基于PN结的温度测量系统方案。利用PN结正向压降的温度特性测量环境温度。文章详细介绍了电路中恒流源、放大电路、AD采样电路、LCD液晶的设计方法、硬件连接电路以及软件的编写思路,其中,数据处理部分详细介绍了线性插值的数据处理方法。关键字:二极管 温度 非线性校正 正文:一、原理与总体方案1.1、二极管(PN结)特性:晶体二极管为一个由p型半导体和n型半导体
2、形成的p-n结,在其界面处两侧形互相抑消作用使载流子的扩散电流增加引起了正向电流,并且和电压成指数关系。1.1.1电流-电压特性:理想PN结的正向电流IF和正向压降VF存在如下关系:IF= Is*exp【-e*Vf/(k*T)】式中,-e为电子电量;k为玻耳兹曼常数;T为绝对温度;Is为反向饱和电流,与PN结材料的禁带宽度及温度有关.在此基础上得出PN结的正向电压Vf与热力学温度T之间的关系,从而证明半导体PN结在某个温度范围内是性能优良的温度传感器。1.1.2温度特性:半导体二极管的温度特性曲线温度对二极管的性能有较大的影响,温度升高时,反向电流将呈指数规律增加,如硅二极管温度每增加8,反向
3、电流将约增加一倍;锗二极管温度每增加12,反向电流大约增加一倍。另外,温度升高时,二极管的正向压降将减小,每增加1,正向压降VD大约减小2 mV,即具有负的温度系数。这些可以从下图所示二极管的伏安特性曲线上看出。据资料介绍:在恒流模式下,If=If0,1n=If/If0=0,有:S=(Vg0-Vf0)/T0-(kB/q)*(1+1nT/T0).因1nT/T0是T的缓变函数, S的模随着T增加而上升,但在不宽的温度范围内,S近似常数。1.2主要电路方案分析:1.2.1恒流源:为保证整个温度测量范围内PN结的正向电流恒定,PN结的正向偏置采用恒流源驱动。采用三极管的特性和特殊电路,让通过二极管的电
4、流始终在100uA左右。1.2.2电桥的设置:采用电桥连接方式使放大器放大传感器变化电压的差值。电桥通过两个电阻和二极管并联构成,从而向放大器正负两端输入电压。通过理论分析及仿真实验研究选择合适的电桥电路参数。1.2.3放大电路的设置:PN结的结电压变化是一个微弱信号,结电压在温度每变化1度时大约变化2mv左右,所以需要进行放大后才能被后续电路处理。采用三运放高共模抑制比放大电路,放大电桥两端的差模信号。设计中可采用三个独立的运放来构成放大电路,也可采用仪用放大器AD620,根据电路实际情况来设置。(AD620的电源提供范围为正负2.3V到正负18V,低功耗,精确度高)。1.2.4滤波电路:采
5、用一阶无源RC低通滤波器,截至频率为50HZ。1.2.5AD转换:采用8位的AD转换元件AD0809,这样可以使用其8位数据线与CPU进行并口通信。因为AD0809对于本设计来说,精度已经达到,所以未用采用SPI通信的12位AD7841等多位的AD转换器件。1.2.6处理器:采用单片机STC89C52(32个IO口,8KB的Flash等)。而未用本身带有10位AD的ARM处理器,因为其对本设计而言会有很多硬件资源剩余,而且不熟悉其操作更会增加程序设计难度。所以综合考虑,对本设计而言,一般单片机的性价比更高。1.2.7显示部分:采用液晶LCD1602,可设置8位数据端口,2行显示,5*7点阵等。
6、1.3 DS18B20介绍:DS18B20为一款单总线测温器件,它具有线路简单,体积小的特点。由于DS18B20采用的是1Wire总线协议方式,即在一根数据线实现数据的双向传输,而对STC89C51单片机来说,硬件上并不支持单总线协议,因此,必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。 DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动
7、读时序完成数据接收。数据和命令的传输都是低位在先。 1.4实验原理:设计整体思路:当通过PN结(以后用二极管表示)的电流恒定后,二极管两端的电压变化就主要与其感受的环境温度有关,所以以此来研究二极管的电压和温度特性。通过电桥设置,将温度选择一个基准,即电压随温度变化的基准,当温度变化时,电压就会相对基准有个差值。将差值信号放大,滤波,输入单片机处理和采用温度传感器18B20标定温度值,得到一个AD值和温度对应的表,然后用二极管测温度,得到AD值采用查表非线性处理得到温度值,结果和18B20测温结果对比显示在液晶上。非线性处理方法原理:将非线性的图形取一些采样点,通过这些采样点相邻之间直线相连就
8、近似得到该曲线。我们的实验目的之一就是得到二极管电压-温度特性曲线。二极管测温原理:由文献资料我们已知了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值已
9、知,所以可以从公式得到的值。二、硬件设计 2.1电源部分: 2.2电桥和放大部分2.2.1恒流源分析:为保证整个温度测量范围内二极管的正向电流恒定,其正向偏置采用恒流源驱动。当三极管Q1正常工作时,其Ube=0.7V,通过三极管集电极端的电流I=(VDD-0.7v)/R1,只要VDD和R1恒定,I就一定。那么由Q1和Q2两个三极管参数几乎一样,镜像得到通过二极管D1的电流值就为I,那么就一定了。2.2.2电桥分析:通过R3和R4在R4两端产生一个恒定基准电压(比如15度时VDD减去二极管的电压值),从而当温度变化时,电桥两端就会有一电压差。2.2.3放大分析:采用LM324自己搭建三运放高共模
10、抑制比放大电路。从下表我们可以看出所测电路输出值与输入值的关系,在差值为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采样、单片机及显示部分 2.3.1AD转换原理:由于采用8位的ADC0809,其参考
11、电压为3v, 理论上输入的电压为0.875v到3v(对应温度为15100),根据转换原理可得到AD转换值x=(255*Vin)/3,通过比较取整。三、程序设计:3.1温度传感器18B20标定温度:注意:DS18B20在完成一个读时序过程,至少需要60us才能完成。写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线3.2程序流程图四、实验结果记录:所测二极管1N4007电压-温度特性曲线:二极管两端电压温度基本成指数关系:AD值
12、18b20所测温度9415.18961610016.0610620.411223.1211624.8112227.6312931.8413833.2714636.2315540.9315942.3816344.7416846.4317347.2417749.32同环境下1N4007和18b20所测温度比较:18150.1218552.518b20温度()1N4007温度()18953.1818.9318.2219255.3126.8127.1419457.8730.3831.2219858.2532.6833.2720059.3733.5634.0120359.6164.3765.912046
13、2.964.3765.9120567.8在所有电路做好后,我们用1N4007测了一组温度数据,其与温度传感器测温相比较如上表所示。两者的差值基本上在1内。20772.620876.920880.6320888.7220995.46五、电路调试与问题分析5.1.电路部分调试:5.1.1模拟部分硬件调试及分析:首先必须保证电路原理正确,然后根据原理检查电路板的接线是否正确,有无虚焊、错焊以及漏焊,各电路是否连接正确。我们在制作电路过程中就有焊错焊漏的现象,比如7805输入输出脚接反,导致电源输出为7V以上。通过对关键点的测试以及各电路的特点,最终很不容易完成电路板。但是只要细心一点,还是不会出什么
14、错的。在确保电路连接无误后,我们开始模拟部分调试。调节滑动变阻器设定AD620的放大倍数到设定值。然后输入一较小电压差,但是输出值确是4V以上,调节滑动变阻器就是下不来。反复分析电路连接,输入电压差值,以及滤波电路都查不出问题所在。所以我们将问题集中在AD620上,但是Proteus和multisim软件仿真都没有错啊。查看资料和询问老师后,单电源其线性工作区大楷在-Vs+1.6v和+Vs-1.6v,可能是输入的共模电压值太大,或是采用单电源的原因。二极管电桥输出电压高于3.5v,于是我们串联了一个30欧/2W的电阻欲将其共模降下来,但是连上电路后居然降低到1.5v左右了,但是另一个电桥输出最
15、低在2.3V左右,这样无法调零。怀疑是不是电阻的功率太大了,我们把电阻值换后,而且电阻小于30欧都使其值在原来位置。最后我们考虑将另外一电桥的电阻比例换了,使其输出电压调节能力更大。这样我们就将共模电压降了下来,输入AD620后,其输出值有一点变化,但是调节滑动变阻器还是不能得到理想值,甚至调而无用,输入电压为0v时输出超过了1.5v, 所以我们认为其放大后没在线性区工作所致。后来我们将单电源改为正负10v的双电源调试,输入100mv的差值,输出确达到8V以上,调节放大倍数也无济于事。最终考虑换为用LM324自己搭建一个三运放高共模抑制比放大电路。通过对所连放大电路的测量,知道其工作线性区大概
16、在0.5V到3V,计算调节好放大倍数后,输入电压差值(共模电压在2.5v左右),能够看到输出值,也能够调节放大倍数,但是但是输出值不稳定。是否是干扰太大了?通过老师指导测量,我们发现恒流源也有一定问题,恒流源的值不稳定,可能是三极管没有工作。再通过查资料,发现恒流源的电流应该在几百UA左右(以前是0到300mA)。于是将以前的30欧/2w的电阻改为40K,而接二极管一端电桥串联上20K分压电阻,最终测量恒流源在100UA左右,比较稳定。但是输入的电压差还是不是很稳定,采用仪器测量二极管的电压和电源纹波较大,采用470uf和0.1uf并联接地后,输出值终于稳定下来。但是纹波还是存在,并且只要动了
17、电路板都会出现其变大的情况,但通过LM324后,其值还是很稳定的,可能刚才的纹波就是电源电压的,因此通过放大器被差掉了,得到了理想的值。调节数字部分电路时,刚开始ADC0809一直不正常工作,反复检查电路连接和程序都没多大问题,最终检查电路原理图时,发现单片机的EA脚没接电源。因为其控制是否访问外部存储器,接电源表示从程序从内部存储器开始工作,接好后,ADC0809正常工作。在测量温度时,发现IN4007所测温度不稳定,而AD输入值还是较稳定的,示波器测量其参考电压(我们是用滑动变阻器调节5V电源到3V)纹波较大,接了电容后所测温度比较稳定。另外我们在标定温度是出现温度下降时,AD值成锯齿波下
18、降,我想也是由此影响。5.2程序部分调试:我们采用各个程序模块单独调试,显示、AD转换、18b20程序依次调试,各个部分都正常后,再将其全部合成一起,所以程序并未出现大的问题,只是在标定温度列表后,出现数据存储区溢出情况。六、总结 通过对电路的实际测试,电路基本上达到了预定要求,能够测得15摄氏度到100摄氏度左右的温度。但由于当温度高于65摄氏度左右时,电压值不会随温度升高而升高. 通过本次课程设计,我们学习了实际问题的处理方法。这次课程设计的实际问题是设计一个测量PN结温度-电压特性曲线和用PN结做一个温度传感器测量温度电路,并通过动手和使用所学知识将其实现。我们在制作过程也得到了一些收获
19、:1.在制作电路前必须把原理搞清楚,确保方案没有错误 ,同时深刻理解,看似简单的事情,要实际动手做好却不是很容易。2.实验也锻炼了我们分析和解决实际问题的能力,比如从设计检测电路的过程中,我们都有步骤并依次一步步进行,确保每一部分正确后在进行下一步。3.我们的基本理论都是采用所学知识,让我们深刻认识理论与实践相结合的重要性以及理论与实践存在的差异性,同时我们也采用其他途径查询所需资料,并认真学习。4. 本次课程设计过后,我们巩固了最电器元件的识别和选择方面的知识,熟悉了各种绘图仿真软件及测试仪器的应用,编程的经验。5.让我们最有收获的是在遇到问题时,能够有步骤的分析,我们感受解决问题后的乐趣。
20、虽然有少数理论问题还没分析清楚,这也跟我们提供了很多继续思考学习的空间。参考文献:【1】智能仪器设计基础/史健芳等编著 北京: 电子工业出版社, 2007【2】电路与模拟电子技术/陈士英,郭炯杰编著 北京: 机械工业出版社, 2004 【3】万文略主编.嵌入式系统设计及应用实验指导书M.重庆:重庆工学院电子信息与自动化学院,2008。【4】放大电路实用设计手册/段九州主编 沈阳: 辽宁科学技术出版社, 2002 【5】液晶显示器件应用技术/李宏,张家田等编著 北京: 机械工业出版社, 2004 【6】张国雄主编. 测控电路M.天津大学:机械工业出版社,2008。【7】PN结正向压降温度特性的研
21、究和应用/陈水桥 物理实验 第二十卷 第七期附:#include #include LCD1602.hsbit AL=P23;sbit START=P24;sbit EOC=P26;sbit OUTE=P25;sbit AD_CLK=P27;sbit DQ =P30; /定义通信端口unsigned char TempBuffer10; / unsigned char ADBuffer10;/存显示的字符/*T0中断服务程序*/void t0(void) interrupt 1 using 0 AD_CLK=AD_CLK; void IntToT(unsigned int t, unsigne
22、d char *str, unsigned char n) unsigned char a5; unsigned char i, j; a0=(t/1000)%10; /取得整数值到数组 a1=(t/100)%10; a2=-2;/ a3=(t/10)%10; a4=(t/1)%10; for(i=0; i5; i+) /转成ASCII码 ai=ai+0; for(i=0; ai=0 & i=3; i+); for(j=5-n; ji; j+) /填充空格 *str= ; str+; for(i=0; i5; i+) *str=ai; str+; /加入有效的数字 *str=0; void D
23、elay1ms(unsigned int count) unsigned int i,j; for(i=0;icount;i+) for(j=0;j0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay(4); return(dat);/写一个字节void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat=1; /delay(4);/读取
24、温度ReadTemperature(void)unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=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
25、;tt=t*0.0625;t=tt*100; /放大10倍输出并四舍五入-此行没用return(t);/*/unsigned char ADC(void) /AD采样函数 unsigned char temp=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);unsigned char DATA_GET(void) /AD滤波(均值滤波等) unsigned char AD_DATA12; /存放12次AD采样值 unsigned ch
26、ar getdata,temp; unsigned int R_DATA=0; unsigned char i,j; for(i=0;i=11;i+) AD_DATAi=ADC(); for(i=0;i=11;i+) for(j=0;jAD_DATAj+1) temp=AD_DATAj; AD_DATAj=AD_DATAj+1; AD_DATAj+1=temp; for(i=1;i=10;i+) R_DATA=AD_DATAi+R_DATA; R_DATA=R_DATA/10; getdata=(unsigned char)R_DATA; return getdata; unsigned in
27、t xianxing(unsigned char DATA_IN) /*线性校正函数*/ float Y16=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; unsigned char X16=94,106,112,122,138,146,155,163,173,181,185,189,192,194,203,208; unsigned char m=0; unsigned int R_DATA=0; float temp=0.0; if(DATA_INX15) DATA_IN=X15; for(m=1;m16;m+) if(DATA_IN=Xm) temp=(float)(DATA_IN-Xm-1)/(Xm-Xm-1)*(Ym-Ym-1)+Ym-1; break; temp*=100; R_DATA=(unsigned int)temp; return (R_DATA);main()
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1