当前位置:文档之家› 智能仪器 温度测量..

智能仪器 温度测量..

《智能仪器》实验报告实验项目温度测量实验时间同组同学班级11111学号1111111姓名111112014年4月实验二温度测量一、实验目的了解常用的集成温度传感器(AD590)基本原理、性能;掌握测温方法以及数据采集和线性标度变换程序的编程方法。

二、实验仪器智能调节仪、PT100、AD590、温度源、温度传感器模块,传感器实验箱(一);“SMP-201 8051模块”、“SMP-204 块块模块”、“SMP-101 8位A/D模块”、“SMP-401 块块块示模块”。

三、实验原理集成温度传感器AD590是把温敏器件、偏置电路、放大电路及线性化电路集成在同一芯片上的温度传感器。

其特点是使用方便、外围电路简单、性能稳定可靠;不足的是测温范围较小、使用环境有一定的限制。

AD590能直接给出正比于绝对温度的理想线性输出,在一定温度下,相当于一个恒流源,一般用于-50℃-+150℃之间温度测量。

温敏晶体管的集电极电流恒定时,晶体管的基极-发射极电压与温度成线性关系。

为克服温敏晶体管U b电压生产时的离散性、均采用了特殊的差分电路。

本实验仪采用电流输出型集成温度传感器AD590,在一定温度下,相当于一个恒流源。

因此不易受接触电阻、引线电阻、电压噪声的干扰,具有很好的线性特性。

AD590的灵敏度(标定系数)为1 A/K,只需要一种+4V~+30V电源(本实验仪用+5V),即可实现温度到电流的线性变换,然后在终端使用一只取样电阻(本实验中为传感器调理电路单元中R2=100Ω)即可实现电流到电压的转换,使用十分方便。

电流输出型比电压输出型的测量精度更高。

在实验一的基础上进行电压测量、标定、线性变换,最后显示出对应温度。

图2-1 温度传感器模块原理图四、实验内容与步骤1.参考“附录实验PT100温度控制实验”,将温度控制在500C,在另一个温度传感器插孔中插入集成温度传感器AD590。

2.将±15V直流稳压电源接至实验箱(一)上,温度传感器实验模块的输出Uo2接实验台上直流电压表。

3.按图2-1接线,并将AD590引线的红色端接“温度传感器模块”的a1,蓝色端接“温度传感器模块”的b1,并从实验台上接+5V 电源到a1端。

调节RW2大约在中间位置,用实验台上“直流电压表”的20V 档测量“温度传感器模块”的“Uo2”端,再调节电位器Rw1使直流电压表显示为零。

5.按照图将信号引到差动放大器的输入Ui ,记下模块输出Uo2的电压值。

6.升高温度源的温度每隔50C 记下Uo2的输出值。

直到温度升至1200C 。

并将实验结果填入表2-1。

7.按照实验1的1-5步骤搭建单片机AD 转换电路,将模块输出电压Uo2接入到“SMP-101 8位AD 块块模块”的CH0;8.编写数据采集程序及标度变换程序,并进行调试,检验程序的测量结果是否与温度源给定的温度一致。

(数据采集程序及硬件电路参考“实验一”的结果,线性标度变换公式参考教材中的“标度变换”一节)五、实验报告1.由记录的数据数据计算在此范围内整个测温系统的灵敏度,并画出标定出的拟合直线。

(端基法)表2-1 温度与输出电压关系T Uo2V (℃())384552596673801.387 1.419 1.45 1.483 1.515 1.548 1.581T (℃) 384552596673808794101108115Uo2(V )1.387 1.419 1.450 1.483 1.515 1.548 1.581 1.612 1.645 1.678 1.710 1.7422.由表2-1记录的数据计算在此范围内集成温度传感器的非线性误差。

K=(1.742-1.387)/(115-38)=0.0046所以y=0.0046*x+1.2122V1=0V2=0.0002V3=0.0014V4=0.0006V5=0.0008V6=0V7=0.0080V8=0.0004V9=0.0016V10=0.0012V11=0.0010V12=0所以最大误差为:0.0016非线性误差=0.0016/1.742*100%=0.09% 3.画出程序流程图。

开始初始化AD转换器结束4.用c语言编制实验程序。

主程序:#include <c8051f020.h> // SFR declarations#include <stdio.h>#include "Delay.h"#include "AD774.h"//-----------------------------------------------------------------------------// 16-bit SFR Definitions for 'F02x//-----------------------------------------------------------------------------sfr16 DP = 0x82; // data pointersfr16 TMR3RL = 0x92; // Timer3 reload valuesfr16 TMR3 = 0x94; // Timer3 countersfr16 ADC0 = 0xbe; // ADC0 datasfr16 ADC0GT = 0xc4; // ADC0 greater than windowsfr16 ADC0LT = 0xc6; // ADC0 less than windowsfr16 RCAP2 = 0xca; // Timer2 capture/reloadsfr16 T2 = 0xcc; // Timer2sfr16 RCAP4 = 0xe4; / Timer4 capture/reloadsfr16 T4 = 0xf4; // Timer4sfr16 DAC0 = 0xd2; // DAC0 datasfr16 DAC1 = 0xd5; // DAC1 data//-----------------------------------------------------------------------------// Global CONSTANTS//-----------------------------------------------------------------------------#define BAUDRATE 115200 // Baud rate of UART in bps#define SYSCLK 22118400//11059200 // SYSCLK frequency in Hz#define SAMPLE_RATE 50000 // Sample frequency in Hz #define INT_DEC 256 // integrate and decimate ratio//sbit AD_BUSY = P3^5;sbit AD_BUSY = P1^6;//-----------------------------------------------------------------------------// Function PROTOTYPES//-----------------------------------------------------------------------------void SYSCLK_Init (void);void PORT_Init (void);//-----------------------------------------------------------------------------// Global V ARIABLES//-----------------------------------------------------------------------------long result; // ADC0 decimated value//-----------------------------------------------------------------------------// MAIN Routine//-----------------------------------------------------------------------------void main (void){unsigned char high8,low4;unsigned char HIGH4,LOW8;unsigned char i=0;unsigned char add=0;unsigned char j=0; // temperature WDTCN = 0xde; // disable watchdog timer WDTCN = 0xad;SYSCLK_Init (); // initialize oscillatorPORT_Init (); // initialize crossbar and GPIO// sample rateHIGH4 = 0x00;LOW8 = 0x00;AD_BUSY = 1;//选择并设置多路开关的通道为第1 号通道SET_PGA(0x00); //选择并设置程控放大器的放大倍数为1while(1){SET_PLUS(0x00+2*0x20);AD_START(); //启动AD转换while(AD_BUSY); //等AD转换完if(!AD_BUSY) //若转换完,则读转换后的数字量{high8 = RD_ADDA TA_H8(); //读高8位(D7~D4D11~D8)low4 = RD_ADDATA_L4(); //读低4位(D3~D0)}HIGH4 = high8 & 0x0f; // (0000D11~D8)-> HIGH4LOW8 = (high8 & 0xf0)|(low4 & 0x0f);//(D7~D4D3~D0)-> LOW8//P2 = HIGH4;//P3 = LOW8;result=HIGH4*256+LOW8;result=HIGH4*256+LOW8;Delay_ms(255);}}}//-----------------------------------------------------------------------------// Initialization Subroutines//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------// SYSCLK_Init//-----------------------------------------------------------------------------//// This routine initializes the system clock to use an 22.1184MHz crystal// as its clock source.void SYSCLK_Init (void){int i; // delay counterOSCXCN = 0x67; // start external oscillator with// 22.1184MHz crystalfor (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settleOSCICN = 0x88; // select external oscillator as SYSCLK// source and enable missing clock// detector}//-----------------------------------------------------------------------------// PORT_Init//-----------------------------------------------------------------------------//// Configure the Crossbar and GPIO ports//void PORT_Init (void){XBR0 = 0x04; // Enable UART0XBR1 = 0x00;XBR2 = 0x40; // Enable crossbar and weak pull-upsP1MDOUT = 0xff; // enable P1.6 (LED) as push-pull output P2MDOUT = 0xff; // enable P1.6 (LED) as push-pull output P3MDOUT = 0xff; // enable P1.6 (LED) as push-pull output P74OUT = 0xff; //设置P4-P7口输出EMI0CF=0x2f; //外部存储器接口EMI0TC=0x9e; //外部存储器时序控制延时程序:#include "c8051F020.h"#include <intrins.h>#include "delay.h"/****************************************************************************** ******//****************************************************************************** ****** 函数名称:Delay_us;** 函数功能描述:延时n微秒子函数;** 输入参数:延时时间(单位微秒);** 返回数据:none;** 注意:none;******************************************************************************* *****/void Delay_us(unsigned char Times){unsigned char i;for (i=0; i<Times; i++){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}}/****************************************************************************** ****** 函数名称:Delay_us;** 函数功能描述:延时n毫秒子函数;** 输入参数:延时时间(单位毫秒);** 返回数据:none;** 注意:none;******************************************************************************* *****/void Delay_ms(unsigned char Times){unsigned char i;for (i=0; i<Times; i++){Delay_us(250);Delay_us(250);Delay_us(250);Delay_us(250);}}/****************************************************************************** ****** 函数名称:Delay_us;** 函数功能描述:延时n秒子函数;** 输入参数:延时时间(单位秒);** 返回数据:none;** 注意:none;******************************************************************************* *****/void Delay_s(unsigned char Times){unsigned char i;for (i=0; i<Times; i++){ Delay_ms(250);Delay_ms(250);Delay_ms(250);Delay_ms(250);}}附加程序:#include <c8051f020.h> // SFR declarations//=========================================================//========================================================= #define PLUS_ADDR 0x8c00#define PGA_ADDR 0x8b00#define AD_START_ADDR 0x8d00#define RD_H8_DATA_ADDR 0x8e00#define RD_L4_DA TA_ADDR 0x8f00unsigned char xdata *PLUS_POINT = (unsigned char *)PLUS_ADDR; unsigned char xdata *PGA_POINT = (unsigned char *)PGA_ADDR;unsigned char xdata *AD_POINT = (unsigned char *)AD_START_ADDR; unsigned char xdata *RD_H8_POINT = (unsigned char *)RD_H8_DATA_ADDR; unsigned char xdata *RD_L4_POINT = (unsigned char *)RD_L4_DATA_ADDR;//=========================================================//========================================================= //入口参数:一个多路开关参数//出口参数:无//功能:根据所给的开关参数打开相应的开关void SET_PLUS(unsigned char i){*PLUS_POINT = i;}//=========================================================//========================================================= //入口参数:一个增益参数//出口参数:无//功能:根据所给的增益参数设置相应的放大倍数void SET_PGA(unsigned char i){*PGA_POINT = i;}//=========================================================//========================================================= //入口参数:无//出口参数:无//功能:启动AD转换void AD_START(void){*AD_POINT = 0x00;}//=========================================================//========================================================= //入口参数:无//出口参数:AD转换结果的高8位数//功能:读AD转换结果的高8位数unsigned char RD_ADDA TA_H8(void){unsigned char i;i = *RD_H8_POINT;return(i);}//=========================================================//========================================================= //入口参数:无//出口参数:AD转换结果的低4位数//功能:读AD转换结果的低4位数unsigned char RD_ADDA TA_L4(void){unsigned char i;i = *RD_L4_POINT;return(i);}5.调试结果分析硬件连接图:当显示的温度为115度时,此时电压表上显示的数值为1.742V ,而通过AD转换后受输出的result为3024.根据上次实验可以算出3042所对应的电压值为2.42V,远远大于了电压表上显示的1.742V,所以说明误差特别大。

相关主题