当前位置:文档之家› 温度调试实验报告

温度调试实验报告

温度检测系统调试实验报告09级电力电子与电力传动张颖1 温度检测系统电路原理采用平衡电桥法的温度测量电路。

温度传感器采用pt100热电阻,并把它作为测量电桥的一个桥臂。

pt100的电阻值在0℃时为100Ω;100℃时为138.5Ω,具体的对照关系可查询分度表。

当温度为0℃时,测量电桥平衡,输出为零。

一旦温度不为零,电桥平衡被破坏,通过等臂电桥,把PT100据温度变化而引起的微弱的电压变化送到一个差分放大电路,信号经过放大反相后可得到一个在0~100摄氏度内范围为0~2.43v的电压,这样就可以接入c8051f040进行AD转换得到输出对应一定温度值的电压信号。

根据多次的实验数据,得出一条直线方程,方程换算为该电压值所对应的温度值。

于是,只要标定其中的对应关系,就可以计算出实际的温度值。

其中最后一个放大器起电压跟随器作用。

温度检测电路原理图如下图1温度检测电路原理图2 硬件构成硬件系统主要由传感器模块、调理电路、F04单片机和电源模块四部分组成。

系统还包括液晶显示。

2.1 温度传感器PT100简介该电路应用温度传感器PT100。

PT100(铂热电阻温度传感器)具有精度高,测温范围宽,使用方便等优点,在工业过程控制和测量系统中得到了广泛的应用。

当温度测量范围不大,元件长度和截面积随温度改变引起的阻值变化可以忽略时,热电阻元件的阻值随温度变化可以认为是线性的,可用下式表示:20(1)t R R At Bt =++,其中0R 表示0摄氏度时PT100的电阻值100欧姆;t R 表示t摄氏度PT100电阻的阻值;33.9080210/O A C -=⨯;75.8019510/O B C -=-⨯;经过理论计算:PT100在0~500摄氏度区间的非线性误差为1.2909%;在0~100摄氏度的非线性误差为0.1%,所以在我们的测量范围之内,可以按线性处理。

2.2protel 制图如图1所示温度检测电路原理图。

鉴于电桥的敏感性,对元器件的要求比较高,两个臂上的电阻,即R1,R2最好选择高精度的精密电阻,用万用表从大量普通电阻中筛选几个精度较高的电阻。

PCB 板图温度检测电路PCB 板图2.3 温度的标识首先,我们知道在温度为0摄氏度时, PT100的电阻值为100欧姆。

假设PT100至于0摄氏度的环境里,调节电位器P2使R6和P2的总电阻为100欧姆达到电桥平衡。

而后在温度为70℃时,调节P1使电路的输出达到最大1.748V 。

而后就可以对其他温度值时的电压进行标定了。

实验表明,如此调节之后,对于温度的标定可以带来很大的方便之处。

为了使直线方程适用于所有的板子,可以调节P1,使6块板子都可以使用同一个方程。

3 软件3.1端口设置本模块选择AIN0.0通道AMX0SL=0x00;单端输入AMX0CF=0x00;ADC0开启,连续跟踪模式,对AD0BUSY写1启动ADC0转换,转换结果右对齐ADC0CN=0x80;采用VREF0参考电压,内部温度传感器关闭,内部参考电压产生器开启,内部参考电压输出开启2.43V REF0CN=0x03;禁止ADC0转换结束中断EIE2&=~0x02;禁止ADC0窗口比较中断EIE1&=~0x04。

3.2温度数据的处理首先将AD转换得到的数据根据2.3中的方程换算为该值所对应的温度值,注意:由方程直接得到的温度数据若要在液晶屏显示还需要经过一些数据处理,才能准确地显示出来。

为了能够精确的得到温度值,实验中,我们采集34组数据,然后经过数据处理,得到的值送显示。

3.3液晶显示设计本文设计的液晶显示屏是128x64的。

由于市场需求的液晶是多种多样的,例如,64x32、128x64、256x64等等,但是液晶的显示原理都是类似的,只是驱动稍有不同。

液晶显示器(LCD)是现在非常普遍的显示器。

它具有体积小、重量轻、省电、辐射低、易于携带等优点。

根据液晶显示模块使用手册,在半宽字符表与汉字字符表中查找需要显示的字符的ASCII,然后由字符显示的RAM的地址与32个字符显示区域的一一对应关系,找出所要显示的字符的位置。

在程序中,通过调用液晶控制相关函数,包括液晶初始化,写数据子程序,写指令子程序,在指定位置显示字符函数等,可以达到所需要的效果。

3.4 程序/******************************************************************** **********Copyright (c) 2007 江苏大学电气学院*All right reserved*文件名称:main.c*摘要c8051f040单片机温度数据采集*作者:*完成日期:2009年7月28日********************************************************************* *********/#include<c8051f040.h>#include<intrins.h>unsigned char LCD_Ctrl=0;#define SYSCLK 11059200xdata unsigned char Show_Buf[3][16]={{0xA1,0xA0,0xA1,0xA0,0xA1,0xA0,0xCE,0xDE,0xCF,0xDF,0x A1,0xA0,0xA1,0xA0,0xA1,0xA0},{0xB6,0xE0,0xB2,0xCE,0xCA,0xFD,0xCB,0xAE,0xD6,0xCA,0xBC,0xE0,0xB2,0x E2,0xD2,0xC7},{0xCE,0xC2,0xA1,0xA0,0xB6,0xC8,0xA1,0xC3,0x20,0x20,0x20,0x20,0x20,0x20,0x A1,0xE6}};void delayus(unsigned char i) //us级延时t=2i+5us{while(--i);}void delayms(unsigned int x) //ms级延时t=x ms{unsigned char j;while(x--){for(j=0;j<123;j++){;}}}void Init_PORT(void){WDTCN=0x07;WDTCN=0xDE;WDTCN=0xAD;SFRPAGE=0x0F;P0MDOUT=0x00;P0=0xff;P1MDOUT=0x00;P1=0xff;P2MDOUT=0x00;P2=0xff;P3MDOUT=0x00;P3MDIN=0xff;P3=0xff;P4MDOUT=0x00;P4=0xff;P5MDOUT=0x00;P5=0xff;P6MDOUT=0x00;P6=0xff;P7MDOUT=0x00;P7=0xff;SFRPAGE=0x0F;XBR0=0x05;XBR1=0x00;XBR2=0x40;XBR3=0x00;}void External_Crystal(void){unsigned char i;SFRPAGE=0x0F;OSCXCN=0x67; //配置为外部石英晶振模式,且配置相应频率的驱动电流for(i=0;i<255;i++); //等待1ms以上while(!(OSCXCN&0x80)); //XTLVLD是否为1,若为1表明外部晶振稳定,可切换到外部时钟CLKSEL=0x01; //选择外部晶振OSCICN=0x00; //将内部晶振关闭}void Init_ADC(void){SFRPAGE=0x00;AMX0CF=0x00; //单端输入AMX0SL=0x00; //选择AIN0.0通道ADC0CF=(SYSCLK/2500000)<<3; //采样频率为2.5Mhz PGA增益为1ADC0CN=0x80; //ADC0开启,连续跟踪模式,对AD0BUSY写1启动ADC0转换,转换结果右对齐REF0CN=0x03; //采用VREF0参考电压,内部温度传感器关闭,内部参考电压产生器开启,内部参考电压输出开启2.43VEIE2&=~0x02; //禁止ADC0转换结束中断EIE1&=~0x04; //禁止ADC0窗口比较中断}/********************************************************************** *******************************************函数原型 : unsigned int ADC(void)**返回值: ADCvalue**说明:A/D数据处理函数。

即为滤波处理,去掉最大值和最小值,数字平滑滤波,AD0BUSY置位启动A/D装换********************************************************************* *******************************************/unsigned int ADC(void){unsigned int i,j;ADCvalue,ADCvaluemax1=0,ADCvaluemin1=0x0fff,ADCvaluemax2=0,ADCvalue min2=0x0fff;xdata long ADCvaluesum1=0;xdata long ADCvaluesum2=0;SFRPAGE=0x00;AD0INT=0;AD0BUSY=1;ADCvaluesum2=0;ADCvaluemax2=0;ADCvaluemin2=0xff;for(j=0;j<34;j++){ADCvaluemax1=0;ADCvaluemin1=0xfff;ADCvaluesum1=0;SFRPAGE=0x00;for(i=0;i<10;i++){AD0BUSY=1;delayms(28);while(!AD0INT);AD0INT=0;ADCvalue=(ADC0H<<8)+ADC0L;ADCvaluesum1=ADCvaluesum1+ADCvalue;if(ADCvaluemax1<ADCvalue)ADCvaluemax1=ADCvalue;if(ADCvaluemin1>ADCvalue)ADCvaluemin1=ADCvalue;}ADCvalue=(ADCvaluesum1-ADCvaluemin1-ADCvaluemax1)>>3;ADCvaluesum2=ADCvaluesum2+ADCvalue;if(ADCvaluemax2<ADCvalue)ADCvaluemax2=ADCvalue;if(ADCvaluemin2>ADCvalue)ADCvaluemin2=ADCvalue;}ADCvalue=(ADCvaluesum2-ADCvaluemin2-ADCvaluemax2)>>5;return(ADCvalue);}//写数据子程序void WriteData(unsigned char DData){SFRPAGE=0x0F;LCD_Ctrl=LCD_Ctrl|0x04; //RS=1 选择数据寄存器P4=LCD_Ctrl;_nop_();_nop_();_nop_();_nop_();LCD_Ctrl=LCD_Ctrl&0xfd; //RW=0 写P4=LCD_Ctrl;_nop_();_nop_();_nop_();P7=DData;delayus(100);LCD_Ctrl=LCD_Ctrl|0x01; //E=1P4=LCD_Ctrl;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();LCD_Ctrl=LCD_Ctrl&0xfe; //E=0P4=LCD_Ctrl;_nop_();_nop_();_nop_();_nop_();P7=0xff;delayus(100);}//写指令子程序void WriteCom(unsigned char CData){SFRPAGE=0x0F;LCD_Ctrl=LCD_Ctrl&0xfb; //RS=0 选择数据寄存器P4=LCD_Ctrl;_nop_();_nop_();_nop_();_nop_();LCD_Ctrl=LCD_Ctrl&0xfd; //RW=0 写P4=LCD_Ctrl;_nop_();_nop_();_nop_();P7=CData;delayus(100);LCD_Ctrl=LCD_Ctrl|0x01; //E=1P4=LCD_Ctrl;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();LCD_Ctrl=LCD_Ctrl & 0xfe; //E=0P4=LCD_Ctrl;_nop_();_nop_();_nop_();_nop_();P7=0xff;delayus(100);}void Init_LCD(void){unsigned char i;WriteCom(0x30);delayus(100);WriteCom(0x01);delayms(10);WriteCom(0x06);delayus(100);WriteCom(0x0c);delayus(100);WriteCom(0x80); //指定第1行的起始地址for(i=0;i<16;i++){WriteData(Show_Buf[0][i]);}WriteCom(0x90); //指定第2行的起始地址for(i=0;i<16;i++){WriteData(Show_Buf[1][i]);}WriteCom(0x88); //指定第3行的起始地址for(i=0;i<16;i++){WriteData(Show_Buf[2][i]);}}unsigned int Temperprocess(unsigned int Tin )//参数传递的是输入电压对应的代码值{double t,t1;t=(Tin*2.43)/4096;t1=41.02442*t-8.89405;return((int)(t1*1000));}void main(void){unsigned char j,sc3,sc2,sc1,sc0;unsigned int Temperadc=0,Temper=0;Init_PORT();External_Crystal();Init_ADC();delayms(500);Init_LCD();while(1){Temperadc=ADC();Temper=Temperprocess(Temperadc);sc3=Temper/10000;sc2=(Temper%10000)/1000;sc1=(Temper%1000)/100;sc0=(Temper%100)/10;Show_Buf[2][9]=0x30+sc3;Show_Buf[2][10]=0x30+sc2;Show_Buf[2][11]=0x2E;Show_Buf[2][12]=0x30+sc1;Show_Buf[2][13]=0x30+sc0;WriteCom(0x8C);for(j=9;j<14;j++){WriteData(Show_Buf[2][j]);}}}4 实验数据根据多次的实验数据,使用直线法得出的方程比较理想,下表是一组测得的由该组数据可得到一条直线方程为:R=41.02442*d1-8.89405。

相关主题