智能温度测量仪课程设计.docx

上传人:b****5 文档编号:3960469 上传时间:2022-11-26 格式:DOCX 页数:14 大小:199.47KB
下载 相关 举报
智能温度测量仪课程设计.docx_第1页
第1页 / 共14页
智能温度测量仪课程设计.docx_第2页
第2页 / 共14页
智能温度测量仪课程设计.docx_第3页
第3页 / 共14页
智能温度测量仪课程设计.docx_第4页
第4页 / 共14页
智能温度测量仪课程设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

智能温度测量仪课程设计.docx

《智能温度测量仪课程设计.docx》由会员分享,可在线阅读,更多相关《智能温度测量仪课程设计.docx(14页珍藏版)》请在冰豆网上搜索。

智能温度测量仪课程设计.docx

智能温度测量仪课程设计

一、系统功能说明

1.1主要技术指标

1)测温范围:

-200~600摄氏度;

2)测温精度:

0.5摄氏度;

3)稳定性:

0.5摄氏度

1.2PT100传感器

电阻式温度传感器(RTD,ResistanceTemperatureDetector)是指一种物质材料作成的电阻,它会随温度的改变而改变电阻值。

PT100温度传感器是一种以铂(Pt)做成的电阻式温度传感器,属于正电阻系数,其电阻阻值与温度的关系可以近似用下式表示:

在0~600℃范围内:

Rt=R0(1+At+Bt2)

在-200~0℃范围内:

Rt=R0(1+At+Bt2+C(t-100)t3)

式中A、B、C为常数,

A=3.96847×10-3;

B=-5.847×10-7;

C=-4.22×10-12;

由于它的电阻—温度关系的线性度非常好,因此在测量较小范围内其电阻和温度变化的关系式如下:

R=Ro(1+αT)

其中α=0.00392,Ro为100Ω(在0℃的电阻值),T为华氏温度,因此铂做成的电阻式温度传感器,又称为PT100。

1.2.1PT100传感器特性

PT100温度传感器的测量范围广:

-200℃~+600℃,偏差小,响应时间短,还具有抗振动、稳定性好、准确度高、耐高压等优点,其得到了广泛的应用,本设计即采用PT100作为温度传感器。

1.2.2PT100传感器测量原理

Pt100是电阻式温度传感器,测温的本质其实是测量传感器的电阻,通常是将电阻的变化转换成电压或电流等模拟信号,然后再将模拟信号转换成数字信号,再由处理器换算出相应温度。

采用Pt100测量温度一般有两种方法:

方案一:

设计一个恒流源通过Pt100热电阻,通过检测Pt100上电压的变化来换算出温度;

测温原理:

通过运放U1A将基准电压4.096V转换为恒流源,电流流过Pt100时在其上产生压降,再通过运放U1B将该微弱压降信号放大(图中放大倍数为10),即输出期望的电压信号,该信号可直接连AD转换芯片。

根据虚地概念“工作于线性范围内的理想运放的两个输入端同电位”,运放U1A的“+”端和“-”端电位V+=V-=4.096V;假设运放U1A的输出脚1对地电压为Vo,根据虚断概念,(0-V-)/R1+(Vo-V-)/RPt100=0,因此电阻Pt100上的压降VPt100=Vo-V-=V-*RPt100/R1,因V-和R1均不变,因此图1虚线框内的电路等效为一个恒流源流过一个Pt100电阻,电流大小为V-/R1,Pt100上的压降仅和其自身变化的电阻值有关。

设计及调试注意点:

1.等效恒流源输出的电流不能太大,以不超过1mA为准,以免电流大使得Pt100电阻自身发热造成测量温度不准确,试验证明,电流大于1.5mA将会有较明显的影响。

2.运放采用单一5V供电,如果测量的温度波动比较大,将运放的供电改为±15V双电源供电会有较大改善。

3.电阻R2、R3的电阻值取得足够大,以增大运放的U1B的输入阻抗。

图1恒流源式测温电路

由于封装问题,实际原理图如下:

方案二:

采用惠斯顿电桥,电桥的四个电阻中三个是恒定的,另一个用Pt100热电阻,当Pt100电阻值变化时,测试端产生一个电势差,由此电势差换算出温度。

测温原理:

电路采用TL431和电位器VR1调节产生4.096V的参考电源;采用R1、R2、VR2、Pt100构成测量电桥(其中R1=R2,VR2为100Ω精密电阻),当Pt100的电阻值和VR2的电阻值不相等时,电桥输出一个mV级的压差信号,这个压差信号经过运放LM324放大后输出期望大小的电压信号,该信号可直接连AD转换芯片。

差动放大电路中R3=R4、R5=R6、放大倍数=R5/R3,运放采用单一5V供电。

设计及调试注意点:

1.同幅度调整R1和R2的电阻值可以改变电桥输出的压差大小;

2.改变R5/R3的比值即可改变电压信号的放大倍数,以便满足设计者对温度范围的要求

3.放大电路必须接成负反馈方式,否则放大电路不能正常工作。

4.VR2也可为电位器,调节电位器阻值大小可以改变温度的零点设定,例如Pt100的零点温度为0℃,即0℃时电阻为100Ω,当电位器阻值调至109.885Ω时,温度的零点就被设定在了25℃。

测量电位器的阻值时须在没有接入电路时调节,这是因为接入电路后测量的电阻值发生了改变。

5.理论上,运放输出的电压为输入压差信号×放大倍数,但实际在电路工作时测量输出电压与输入压差信号并非这样的关系,压差信号比理论值小很多,实际输出信号为4.096*(RPt100/(R1+RPt100)-RVR2/(R1+RVR2))

(1)式中电阻值以电路工作时量取的为准。

6.电桥的正电源必须接稳定的参考基准,因为如果直接VCC的话,当网压波动造成VCC发生波动时,运放输出的信号也会发生改变,此时再到以VCC未发生波动时建立的温度-电阻表中去查表求值时就不正确了,这可以根据式

(1)进行计算得知。

图2三线制接法桥式测温电路

1.3AT89C51单片机

AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

1.4LCD显示器

液晶显示器是一种采用了液晶控制透光度技术来实现色彩的显示器。

和CRT显示器相比,LCD的优点是很明显的。

由于通过控制是否透光来控制亮和暗,当色彩不变时,液晶也保持不变,这样就无须考虑刷新率的问题。

对于画面稳定、无闪烁感的液晶显示器,刷新率不高但图像也很稳定。

LCD显示器还通过液晶控制透光度的技术原理让底板整体发光,所以它做到了真正的完全平面。

二、系统总体设计

测温的模拟电路是把当前PT100热电阻传感器的电阻值,转换为容易测量的电压值,经过放大器放大信号后送给A/D转换器把模拟电压转为数字信号后传给单片机AT89C51,单片机再根据公式换算把测量得的温度传感器的电阻值转换为温度值,并将数据送出到LCD显示器进行显示。

本设计系统主要包括温度信号采集单元,单片机数据处理单元,温度显示单元。

其中温度信号的数据采集单元部分包括温度传感器、温度信号的获取电路(采样)、放大电路、A/D转换电路。

系统的总结构框图如图1-1所示。

1-1系统的总结构框图

本温度测量系统设计,是采用PT100温度传感器经过放大和A/D转换器送到单片机进行控制温度显示。

另外本系统还可以通过外接电路扩展实现温度报警功能,从而更好的实现温度现场的实时控制。

三、硬件设计

3.1放大电路的设计

本次放大电路我选用的是LM358,其内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。

它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。

3.2信号调理电路

调理电路的作用是将来自于现场传感器的信号变换成前向通道中A/D转换器能识别的信号,作为本系统,由于温度传感器是热电阻PT100,因此调理电路完成的是怎样将与温度有关的电阻信号变换成能被A/D转换器接受的电压信号。

3.3A/D转换器的选择与设计电路

在我们所测控的信号中均是连续变化的物理量,通常需要用计算机对这些信号进行处理,则需要将其转换成数字量,A/D转换器就是为了将连续变化的模拟量转换成计算机能接受的数字量。

根据A/D转换器的工作原理,常用的A/D转换器可分为两种,双积分式A/D转换器和逐次逼近式A/D转换器。

1.双积分A/D转换器工作原理

2.逐次逼近型A/D转换器工作原理

在本设计系统中,为了将模拟量温度转换成数字量,采用德州仪器公司生产的4通道12位串行输出采样模数转换器ADS7841。

具体连线如下图所示:

3.4单片机控制电路

本设计是采用AT89C51单片机作为主控电路,AT89C51单片机是Atmel公司的产品,与Intel公司的MCS51系列兼容。

在AT89C51单片机内部有作为程序存储器的Flash存储器,其容量为4KB,可以承受不低于1000次的反复擦写,调试比较方便。

其中P1口为A/D转换器的通信端口,P2口为按键控制,P0口为LCD的数据端口,具体电路图如下:

 

3.5按键和显示电路

本次设计使用4x4矩阵键盘,将其行线以及列线接到单片机的P2口,其中列线接上拉电阻然后在通过异或逻辑门在接至单片机的P2.0到P2.3口。

具体连线如下图所示:

3.6显示电路

本次设计使用LCD12864来显示温度采集结果,其中将LCD的数据口接入单片机的P0口,具体接线如下图所示:

四、软件设计

4.1软件的流程图

图1系统总流程图图2温度转换程序流程图

图3显示流程图图4主函数流程图

4.2系统软件设计说明

进行微机测量控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个测量对象的实际需要设计应用程序。

因此,软件设计在微机测量控制系统设计中占重要地位。

对于本系统,软件设计更为重要。

在单片机测量控制系统中,大体上可分为数据处理、过程控制两个基本类型。

数据处理包括:

数据的采集、数字滤波、标度变换等。

过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以便达到测量控制目的。

软件设计主要是对温度进行采集、显示,通过按键操作,进行时间的设置与修改。

因此,整个软件可分为温度采集子程序、时钟读取程序、按键子程序、显示子程序、及系统主程序。

4.3软件的有关算法

4.3.1最小二乘理论获取温度―电阻公式

根据误差理论,我们要获得较高精度的温度测量值,办法一般有2个,要么采用查表法,要么建立高精度的数学模型。

如果用查表法,主要有2个问题,如果要提高测量精度,则需要建立大量的表格,而且得提前做大量得试验来进行多点校正,还有一个问题是程序的通用性差,这台仪器上校正好得数据可能在另一台上不合适。

而采用已知的分度表,建立数学模型,然后通过工程量(标度)变换,通过测量A/D转换的结果后计算得到。

这里我们考虑第2种方法的优点,首先采用分段的方法,将测量范围分段,然后查出该段的数学模型的各个系数,然后计算出温度值,这里,由于时间的关系,我们对整个测量范围分了3段,分别为0-49℃、50-70℃、71-100℃,利用分度表进行离线的数学拟合,得到各段的数学模型系数。

同时,可通过再将标度值代入可粗略估计在各个测量段内的最大误差值。

我们通过最小二乘法进行线性拟合,得到如下的数学模型为:

T1=2.5772R-257.77080-49℃

T2=2.6366R-267.0150-70℃

T3=2.7206R-281.9071-100℃

上述3个数学模型中,最大的理论误差值都小于0.5℃,能够满足精度要求,实际上如果有足够的时间,我们完全可以分得再细一些,这样理论的误差将会变得更小。

4.3.2标度变换公式的获取

根据上述的线性拟合结果:

T=A·R-B,这里的A、B是上述不同温度段的系数,而R值由于在输出为0V时,实际上有个对应于100欧姆的偏置电路,因此根据R-R0=U/I,而I=2.500V/1.500K,而AD/U/G=4096/4.900V,这里的AD值为A/D转换得结果G为放大器的增益,本设计中的二级放大器放大的倍数为80倍。

将上述条件代入得:

T=A·(4.9·AD/4096/G/I+100)-B

五、程序清单

ADS7841驱动程序

#include

#include

#include"delay.h"

#include"ads7841.h"

#include"LCD1602.h"

//----------------------ADS7841控制字节---------------

#definecontrol_byte0b10011000

//bitvaldescription

//bit71start,恒为1

//bit6,5,4001选择CH0为+IN

//bit41选择为单端输入

//bit2X外部MODE接GND,该位无作用,恒为12位

//bit1,000转换期间ADC为掉电模式

voidport_init(void)

{

PORTA=0xFF;//将所有端口初始化为输入,打开上拉

DDRA=0x00;

PORTB=0xFF;

DDRB=0x00;

PORTC=0xFF;

DDRC=0x00;

PORTD=0xFF;

DDRD=0x00;

PORTE=0xFF;

DDRE=0x00;

PORTF=0xFF;

DDRF=0x00;

PORTG=0xFF;

DDRG=0x00;

}

voidmain()

{

unsignedintresult;

unsignedchari,array[4],table[]="0123456789";

port_init();//端口初始化

LCD1602_init();//1602液晶初始化

ads7841_init();//ADS7841初始化

LCD_write_string(0x80,"result:

");

while

(1)

{

ads7841_start();//启动ADS7841,即拉低CS

delay_nus(10);

result=ads7841_W_R(control_byte);//发送控制字,并得到转换数据

result&=0b0000111111111111;//屏蔽掉高四位

delay_nus(10);

ads7841_finish();//停止ADS7841,即拉高CS

for(i=0;i<4;i++)//以下均为显示部分

{

array[i]=result%10;//

esult/=10;

}

for(i=0;i<4;i++)

{

LCD_write_onechar(0x87+i,table[array[3-i]]);

}

delay_nms(300);

}

}

#ifndef_ads7841_h

#define_ads7841_h

defineDCLKPD0

#defineDCLK_ddrDDRD

#defineDCLK_portPORTD

#defineDCLK_pinPIND

#defineCSPD1

#defineCS_ddrDDRD

#defineCS_portPORTD

#defineCS_pinPIND

#defineDINPD2

#defineDIN_ddrDDRD

#defineDIN_portPORTD

#defineDIN_pinPIND

#defineBUSYPD3

#defineBUSY_ddrDDRD

#defineBUSY_portPORTD

#defineBUSY_pinPIND

#defineDOUTPD4

#defineDOUT_ddrDDRD

#defineDOUT_portPORTD

#defineDOUT_pinPIND

defineads7841_start()CS_port&=~(1<

#defineads7841_finish()CS_port|=(1<

voidads7841_init(void);

unsignedintads7841_W_R(unsignedcharbyte);

#endif

#include

#include

#include"delay.h"

#include"ads7841.h"

/*******************************************************************************

**函数名称:

ads7841_init()

**函数功能:

初始化ADS7841端口

**备注:

*******************************************************************************/

voidads7841_init(void)

{

DCLK_port&=~(1<

DCLK_ddr|=(1<

CS_port|=(1<

CS_ddr|=(1<

DIN_port&=~(1<

DIN_ddr|=(1<

BUSY_port|=(1<

BUSY_ddr&=~(1<

DOUT_port|=(1<

DOUT_ddr&=~(1<

}

/*******************************************************************************

**函数名称:

ads7841_W_R

**函数功能:

向ADS7841写入控制字节,读出转换好的数

**输入参数:

unsignedcharbyte:

控制字节

unsignedintresult:

AD转换好的数

**备注:

数据从高位到低位写入,从高位到低位读出

*******************************************************************************/

unsignedintads7841_W_R(unsignedcharbyte)

{

unsignedchari,temp;

unsignedintresult=0;

for(i=0;i<8;i++)//8位数据计数

{

DCLK_port&=~(1<

if(byte&0x80)//当前位是否是1

{

DIN_port|=(1<

}

else

{

DIN_port&=~(1<

}

delay_nus(10);//调整时钟和脉冲宽度

DCLK_port|=(1<

delay_nus(10);

byte<<=1;//数据左移1位,为送出新数据位做准备

}

delay_nus(10);

DCLK_port&=~(1<

delay_nus(10);

i=BUSY_pin;//读BUSY的状态

delay_nus(10);

if(i&(1<

{

//------------------------以下先读出高八位-------------------------------------

for(i=1;i<=8;i++)

{

result<<=1;//保存读入的数据位

DCLK_port|=(1<

delay_nus(10);

DCLK_port&=~(1<

elay_nus(10);

if(DOUT_pin&(1<

{

result|=0x01;

}

else

{

result&=0xfe;

}

}

//-----------------------以下读出低四位----------------------------------------

for(i=1;i<=4;i++)

{

temp<<=1;//保存读入的数据位

DCLK_port|=(1<

delay_nus(10);

DCLK_port&=~(1<

delay_nus(10);

if(DOUT_pin&(1<

{

temp|=0x01;

}

else

{

temp&=0xfe;

}

}

for(i=1;i<=4;i++)//再给ADS7841四个时钟

{

DCLK_port|=(1<

delay_nus(10);//调整时钟和脉冲宽度

DCLK_port&=~(1<

delay_nus(10);//调整时钟和脉冲宽度

}

}

result=(result<<4)+temp;//将结果合成,返回

returnresult;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1