外设驱动库开发笔记38:RTD热电阻测温驱动

  我们已经讨论过多种温度检测方式,但我们尚未关注热电阻温度检测,但热电阻测温在工业环境中是非常常见的。尽管有很多集成的数字式的热电阻接口元器件,但这些器件不但成本较高,灵活性也大打折扣。所以我们有时会使用更简单灵活的电路来驱动RTD。而在这一篇中,我们将讨论如何设计并实现RTD热电阻测温的驱动。

1、功能概述

  RTD热电阻是常用的测温元件。RTD的英文全称为“Resistance Temperature Detector”,因此准确来说,它应该翻译为“电阻温度检测器”。RTD是一种特殊的电阻,其阻值会随着温度的升高而变大,随着温度的降低而减小。工业上利用它的这一特性进行温度测量,因此RTD也被俗称为“热电阻”。

  并不是所有的金属都适合做成RTD,符合这一特性的材料需要满足如下几个要求:

  • 该金属的电阻值与温度变化能呈线性关系;

  • 该金属对温度的变化比较敏感,即单位温度变化引起的阻值变化(温度系数)比较大;

  • 该金属能够抵抗温度变化造成的疲劳,具有好的耐久性;

  符合该要求的金属并不多,常见的RTD材料有:铂(Pt)、镍(Ni)和铜(Cu)。对应的国家统一生产工业标准化热电阻有三种:WZP型铂电阻、WZC型铜热电阻和WZN型镍热电阻。

1.1、铂热电阻

  铂电阻是我们常用的RTD,铂热电阻采用温度系数为3.885x10-3的元件,温度和电阻的关系表达式:

  在-200℃~0℃为:

  在0℃~850℃为:

  其中:Rt温度为t℃时的电阻;R0是温度为0℃时的电阻。而各个系数均为常数:

  常数A=3.9083×10-3

  常数B=-5.775×10-7

  常数C=-4.183×10-12

  铂热电阻对应的测温范围是:-200℃~850℃。常见的型号Pt50、Pt100、Pt200、Pt500和Pt1000等。名称中的数值表示热电阻在0℃下的标称电阻值。

1.2、铜热电阻

  铜热电阻也是在工业上常用的RTD,铜热电阻采用温度系数为:4.28x10-3的元件。温度和电阻的关系表达式:

  其中,Rt是温度为t℃时的电阻,R0是温度为0℃时电阻,而各个系数长数的取值为:

  常数α=4.28x10-3

  常数β=-9.31x10-8

  常数γ=1.23x10-9

  铜热电阻对应的测温范围是:-50℃~150℃。而常见的分类型号有:Cu50、Cu100等。名称中的数值表示热电阻在0℃下的标称电阻值。

1.3、镍热电阻

  另一种工业标准RTD则是镍热电阻。镍热电阻采用温度系数为6.17x10-3的元件。温度和电阻的关系表达式:

  其中,Rt是温度为t℃时的电阻,R0是温度为0℃时电阻,而各个系数长数的取值为:

  常数A=5.485x10-3

  常数B=6.65x10-6

  常数C=2.805x10-11

  镍电阻对应的测温范围是:-60℃~180℃。而常见的分类型号有:Ni100、Ni300、Ni500等。名称中的数值表示热电阻在0℃下的标称电阻值。

2、驱动设计与实现

  我们已经了解了RTD的特性,以及不同材质的RTD温度与点组的关系表达式。接下来我们就实现通过RTD检测温度的驱动。

2.1、对象定义

  在实现RTD的驱动之前,我们依然需要抽象并定义RTD对象,并将其声明为对象类型。

2.1.1、对象的抽象

  在实现对RTD的操作之前,我们先抽象RTD对象。每一个RTD对象都有几个共同的属性:标称电阻,温度和类型。类型就是前面所描述的三种,我们将其定义为枚举。对象的声明如下:

/* 定义RTD类型枚举 */
typedef enum RTDCategory {WZP,WZC,WZN
}RTDCategoryType;/* 定义RTD对象 */
typedef struct RTDObject{float nominalR;     //RTD标称电阻float temperature;       //所测温度RTDCategoryType type; //RTD类型
}RTDObjectType;

2.1.2、对象的初始化

  声明一个RTD对象后,仅仅只是声明了一个对象变量,在赋值之前尚不能使用。所以我们要使用初始化函数将其初始化之后才可使用。RTD对象的初始化函数如下:

/* 初始化RTD对象 */
void RTDInitialization(RTDObjectType *rtd,RTDCategoryType type,float nr)
{if(rtd==NULL){return;}rtd->type=type;rtd->nominalR=nr;
}

2.2、对象操作

  前面我们已经提到了各类热电阻的电阻与温度的关系表达式。在这些表达式中,二次以上的项的系数其实是非常小的,所以在一般要求不高,温度变化不是很大的场合基本就是线性关系。所以我们将其简化为线性方程:

2.2.1、WZP铂电阻

  铂电阻的温度与电阻的关系在0度以上和0度以下略有差别,但如果我们采用线性近似的话则是一样的。所以我们采用线性方程实现如下:

/* 计算铂电阻温度 */
static float CalcWzpTemperature(RTDObjectType *rtd,float rt)
{float temp=0.0;float a=0.0039083;temp=((rt/rtd->nominalR)-1.0)/a;rtd->temperature=temp;return temp;
}

2.2.2、WZC铜电阻

  铜电阻的温度与电阻的关系表达式相对复杂,但好在高次项的影响相对较小,我们依然可以使用线性近似来实现它。

/* 计算铜电阻温度 */
static float CalcWzcTemperature(RTDObjectType *rtd,float rt)
{float temp=0.0;float alpha=0.00428;temp=((rt/rtd->nominalR)-1.0)/alpha;rtd->temperature=temp;return temp;
}

2.2.3、WZN镍电阻

  镍电阻的电阻温度系数比铂电阻和铜电阻都要好,但其线性度则不如铂电阻,同样的是其高次项的影响也相对较小,在温度并不大范围变化时仍然可以采取线性近似。

/* 计算镍电阻温度 */
static float CalcWznTemperature(RTDObjectType *rtd,float rt)
{float temp=0.0;float a=0.005485;temp=((rt/rtd->nominalR)-1.0)/a;rtd->temperature=temp;return temp;
}

2.2.4、统一温度获取

  面向不同类型的RTD,我们实现了各自的温度转换函数,但作为驱动函数库,我们总是希望能进行无差别调用。所以我们希望设计一个统一的接口函数。所幸每种类型RTD操作函数均有相同的格式,于是我们就很容易想到使用函数指针来处理它。

float (*CalcTemperature[])(RTDObjectType *rtd,float rt)={CalcWzpTemperature,CalcWzcTemperature,CalcWznTemperature};/*计算热电阻测得的温度*/
float CalcRTDTemperature(RTDObjectType *rtd,float rt)
{float temp=0.0;temp=CalcTemperature[rtd->type](rtd,rt);return temp;
}

3、驱动的使用

  我们采用RTD测温时可以使用这一驱动。其实用步骤分两步:声明并初始化对象;调用函数计算温度值。接下来我们就来实现之。

3.1、声明并初始化对象

  首先使用RTDObjectType类型定义RTD对象,如果有多个可以使用数组方式定义。RTDObjectType rtd;或RTDObjectType rtd[N];的形式。其中N为数量。

  定义对象变量后和以调用初始化函数对齐进行初始化:

  RTDInitialization(&rtd,type,nr);

  其中type为RTDCategoryType枚举类型,可以是铂热电阻(WZP)、铜热电阻(WZC)和镍热电阻(WZN)。nr为所操作对象在0摄氏度时的标称电阻值。

3.2、调用函数计算温度值

  对象初始化后就可以操作对象来获取对象当前时刻的温度值。具体如下:

  CalcRTDTemperature(&rtd,rt);

  其中rt为当前对象的电阻值。

4、应用总结

  我们实现了RTD的检测,对得到的当前温度电阻值,使用根本驱动就可以计算得到当前的温度。

  本驱动支持铂热电阻(WZP)、铜热电阻(WZC)和镍热电阻(WZN)。对于不同该类型,不同标称值的对象均可以使用。不过需要注意:铂热电阻对应的测温范围是:-200℃850℃;铜热电阻对应的测温范围是:-50℃150℃;镍电阻对应的测温范围是:-60℃~180℃。超过范围的将不被支持。

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外设驱动库开发笔记39:按键操作驱动

按键在我们的项目中是经常使用到的组件。一般来说,我们都是在用到按键时直接针对编码,但这样每次都做很多重复性的工作。所以在这里我们考虑做一般性抽象得到一个可应用于按键操作的通用性驱动程序。 1、功能概述 按键操作在我们的产品种经常用到&#…

外设驱动库开发笔记40:AT25xxx外部存储器驱动

我们在前面开发过AT24CXX系列EEPROM存储器,它使用的是I2C接口。不过有时候我们也会使用SPI接口的EEPROM存储器。在这一篇我们将来讨论AT25XXX系列EEPROM存储器的驱动设计、实现及使用。 1、功能概述 AT25XXX系列EEPROM存储器采用SPI接口,因其操作简单且…

闪存中的键值对:无文件系统 minINI

许多嵌入式系统应用需要以持久的方式存储某种数据:校准值、设置或日志信息。对于较少的数据量,使用外部存储器或文件系统是一种过度大材小用。在许多系统中,我使用minINI以“ini-file”的方式存储键值解析,但它需要使用某种文件系…

外设驱动库开发笔记41:ADS1256 ADC驱动

我们经常会碰到多通道AD采集的需求,有时候甚至需要高精度的ADC器件。本篇我们将来设计并实现ADS1256模数转换器的驱动。并简单讨论该驱动使用方式。 1、功能概述 ADS1256是TI公司推出的一款低噪声高分辨率的24位Sigma-Delta(E-v)模数转换器(ADC)。E-vADC与传统的逐…

PID参数自整定库之一:继电反馈整定算法

在前述的篇章中,我们实现了PID控制器并在后续对其进行了改进。但作为经典PID控制器还存在PID参数整定的问题。通常我们可以采取人工整定的办法,但人工整定涉及到比较专业的知识,而且找到合适的参数本身也不是一件容易的事,所以人们…

外设驱动库开发笔记42:DAC8552 DAC驱动

模拟信号输出是经常会遇到的应用需求,解决的办法应多种,但我们使用最多的还是数模转换。对于不同的数模转换器我们需要为其编写适用的驱动程序,在这一篇中我们就来考虑如何实现DAC8552高精度模数转换器的驱动程序。 1、功能概述 该DAC8552是…

软件设计开发笔记2:基于QT设计串口调试工具

串口通信是我们经常会遇到的问题。很多时候当我们设计一个串口应用时,我们希望有一个简便的、可视的方式来验证它。这一篇中我们就来基于QT设计一个串口调试工具。 1、概述 在开始软件设计之前,我们来简略地分析一下这样一个小软件其要包含的主要内容有…

外设驱动库开发笔记43:GPIO模拟SPI驱动

SPI总线是我们常用的串行设备接口,一般情况下我们都会适应硬件SPI接口,但有些时候当硬件端口不足时,我们也希望可以使用软件来模拟SPI硬件接口,特别是要求不是很高的时候。在这一篇中我们将来讨论如何使用GPIO和软件来模拟SPI通讯…

外设驱动库开发笔记44:DDC114 ADC驱动

在产品设计过程中,很多时候都会用到ADC器件,而在一些特殊场合还需要一些特别的ADC器件。我们在这篇中将讨论常用于医疗器件方面的,DDC114这款电流输入ADC,并为其设计一个驱动程序。 1、功能概述 模数转换器DDC114是一款电流输入型…

PID控制器改进笔记之七:改进PID控制器之防超调设定

我们已经设计了PID控制器,并根据实际使用的情况对器进行了诸多的改进。在这一篇中我们将讨论如何改进PID控制器超调的问题。 1、问题提出 在前面的文章中,我们曾推导过增量式PID控制器的公式,并且对其进行了离散化以适用于程序实现&#xff…

软件设计开发笔记3:基于QT的Modbus RTU主站

Modbus是一种常见的工业系统通讯协议。在我们的设计开发工作中经常使用到它。在这一篇中我们将简单实现一个基于QT的Modbus RTU主站上位工具。 1、概述 Modbus RTU主站应用很常见,有一些是通用的,有一些是专用的。而这里我们希望实现一个主要针对我们的…

外设驱动库开发笔记45:MS4515DO压力传感器驱动

很多时候我们需要检测流量和压力这些参数,比如我们要检测大气压,或者通过测量差压来获得输送流体的流量等,都需要用到压力传感器。这一篇我们就来讨论MS4515DO压力传感器的数据获取。 1、功能概述 MS4515DO是TE公司推出的一款基于PCB安装的小…

外设驱动库开发笔记48:MCP4725单通道DAC驱动

在产品设计过程中,我们经常会遇到数模转换的应用需求。在本篇种我们就来讨论一下MCP4725单通道数模转换器的驱动设计与实现。 1、功能概述 MCP4725是一个低功耗,高精度,单通道,12位缓冲电压输出数字到模拟转换器(DAC)与非易失性存…

如何确保不使用动态内存

在许多嵌入式应用程序中,内存分配必须是静态的,而不是动态的。意味着在应用程序中不应使用对malloc()或free()等内容的调用,因为它们可能会在运行时失败(内存不足、堆碎片)。 但是,当与第三方库甚至 C/C 标…

go 单元测试 testing 打印输出_2020,你需掌握go 单元测试进阶篇

本文说明go语言自带的测试框架未提供或者未方便地提供的测试方案,主要是用于解决写单元测试中比较头痛的依赖问题。也就是伪造模式,经典的伪造模式有桩对象(stub),模拟对象(mock)和伪对象(fake)。比较幸运的是,社区有丰富的第三方测试框架支持…

一文读懂Git工作流

Git是目前最流行的代码管理工具,相信大家也都是在用Git来管理自己团队的源代码。 团队一般为了规范开发,保持良好的代码提交记录以及维护 Git 分支结构清晰,方便后续维护等,都会迫切需要一个比较规范的 Git 工作流。 本文就是在…

xbox360fsd更新游戏封面_游戏类短视频创作指南

一.起步阶段1.内容发布垂直,整体风格一致,选定一个品类的游戏内容风格持续更新注意:冷启动时期不要频繁更换游戏类型2.账号IP化 根据自身风格特色打造独特的风格账号。有利延长账号生命周期,提升粉丝转化率。搞笑、中二…

开发者们都在关注的网站

开发者们都在关注的网站 😉 综合类(5个) 1、GitHub 全球最大的编程开源社区,很多优秀的开源项目都在上边,不知道这个都不要说自己是程序员😂 访问地址:https://github.com 2、CSDN 全球最大中…

ios framework 调用第三方 framework_Python基础:标准库和常用的第三方库

Python的标准库有:名称作用datetime为日期和时间处理同时提供了简单和复杂的方法。zlib直接支持通用的数据打包和压缩格式:zlib,gzip,bz2,zipfile,以及 tarfile。random提供了生成随机数的工具。math为浮点…

作图神器ProcessOn - 免费好用

因工作需要,我经常需要花一些流程图,时序图,架构图什么的,之前使用的Windows系统,大部分情况下就用的Visio来画图。后来为了工作方便,换成了Mac电脑,结果发现Mac上没有Visio,然后就在…