有时候我们需要检测一些无法直接接触的器件的温度。为了实现这一需求,我们通常会选择红外温度传感器来实现这一功能。考虑到复用的问题,我们一般会将操作元器件的代码抽象为驱动函数以备调用。这里我们就来设计并实现TSEV01CL55红外温度传感器的驱动。

1、功能概述

TSEV01CL55是一种基于红外辐射检测的无接触测温系统。TSEV01CL55在前端装有红外传感器(热电堆)。

1.1、硬件描述

TSEV01CL55适用于需要非接触式温度测量的广泛应用场合。TSEV01CL55红外温度传感器测温时,热堆传感器必须指向所要测量的目标对象。TSEV01CL55红外温度传感器的引脚定义如下:

TSEV01CL55红外温度传感器测温基本工作原理是:用热电堆传感器探测红外辐射,该传感器将入射辐射转换成模拟电压;用热敏电阻测定传感器温度。根据测到的目标温度和环境温度数据进一步的进行模拟信号处理和调理,使用处理单元计算环境温度和物体温度。

1.2、通讯接口

TSEV01CL55红外温度传感器对外通讯采用数字输出总线(I2C)。通过I2C总线和响应的操作命令就可以得到物体温度和环境温度数据。这两个值都是以百分之一的度数传输的。相关的操作命令如下:

TSEV01CL55红外温度传感器测温有一定的范围限制,当环境或物体温度超过指定温度范围时,温度输出显示以下数据:

TSEV01CL55红外温度传感器的I2C硬件模块在SCL“锁存”问题上进行了更改。修改后的I2C模块不再下拉SCL命令主程序等待数据的计算。因此,主设备必须增加等待时间,以确保从设备能够组织数据。对于标准数据传输(比如读取温度),1ms的时间足够从设备组织数据。对于需要更多时间的操作(如读取/写入EEPROM),应该留取足够的时间等待从设备处理数据。

向TSEV01CL55红外温度传感器写命令时序如下:

从TSEV01CL55红外温度传感器读数据时序如下:

上述时序图是读取目标温度的时序图。其它数据的读写过程类似,在此不再赘述。

2、驱动设计与实现

我们已经了解了TSEV01CL55红外温度传感器的基本情况。接下来我们将设计并实现TSEV01CL55红外温度传感器的通用驱动程序。

2.1、对象定义

在使用一个对象之前我们需要获得一个对象。同样的我们想要TSEV01CL55红外温度传感器对象就需要先定义TSEV01CL55红外温度传感器的对象。如何得到TSEV01CL55红外温度传感器的对象呢?接下来我们就来考虑这个问题。

2.1.1、对象的抽象

我们要得到TSEV01CL55红外温度传感器对象,需要先分析器基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下TSEV01CL55红外温度传感器的对象。

先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑TSEV01CL55红外温度传感器对象属性。作为I2C通讯从设备,在总线上唯一区别不同设备的就是设备地址。所以我们将I2C设备地址作为对象的一个属性。TSEV01CL55红外温度传感器所检测的环境温度和目标温度虽然不能唯一标识TSEV01CL55红外温度传感器对象,但可以记录当前的状态所以我们将其作为对象的属性。

接着我们还需要考虑TSEV01CL55红外温度传感器对象的操作问题。对于I2C通讯设备,我们需要向设备写命令,同时也要从设备接收数据,但不论是接收数据还是发送命令都依赖于硬件接口和相关的硬件平台,所以我们将写命令和收数据作为TSEV01CL55红外温度传感器对象的两个操作。此外,操作过程中我们需要时序操作,而延时操作都依赖于具体的平台,所以我们将延时操作作为TSEV01CL55红外温度传感器对象的一个操作。

根据上述我们对TSEV01CL55红外温度传感器的分析,我们可以定义TSEV01CL55红外温度传感器的对象类型如下:

//定义TSEV01CL55红外温度传感器对象类型
typedef struct HLPTObject{uint8_t devAddress;           //对象的地址float tempObject;             //对象温度值float tempAmbient;            //环境温度void (*Delayms)(volatile uint32_t nTime);       //延时操作指针void (*Receive)(struct HLPTObject *hlpt,uint8_t *rData,uint16_t rSize);          //接收数据操作指针void (*Transmit)(struct HLPTObject *hlpt,uint8_t *wData,uint16_t wSize);        //发送数据操作指针
}HLPTObjectType;

2.1.2、对象初始化

我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑TSEV01CL55红外温度传感器对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计TSEV01CL55红外温度传感器对象的初始化函数如下:

/* 红外温度传感器对象初始化 */
void HLPTInitialization(HLPTObjectType *hlpt,         //初始化的对象变量uint8_t address,              //设备I2C地址HLPTReceive receive,          //接收函数指针HLPTTransmit transmit,        //发送函数指针HLPTDelayms delayms            //毫秒延时函数指针)
{if((hlpt==NULL)||(receive==NULL)||(transmit==NULL)||(delayms==NULL)){return;}hlpt->Receive=receive;hlpt->Transmit=transmit;hlpt->Delayms=delayms;hlpt->tempObject=0.0;hlpt->tempAmbient=0.0;if(address>0x00){hlpt->devAddress=address;}else{hlpt->devAddress=HLPTSlaveAddress;}
}

2.2、对象操作

我们已经完成了TSEV01CL55红外温度传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息,接下来我们还要实现面向TSEV01CL55红外温度传感器的各类操作。

面向TSEV01CL55红外温度传感器的操作比较简单,最主要的就是读取温度数据,包括环境温度和目标温度。所以我们开发获取面向TSEV01CL55红外温度传感器数据的操作如下:

/* 读取数据 */
static uint16_t ReadDataFromHLPT(HLPTObjectType *hlpt,uint8_t cmd)
{uint8_t data[2];uint16_t tempCode;hlpt->Transmit(hlpt,cmd,1);hlpt->Delayms(1);hlpt->Receive(hlpt,data,2);tempCode=(data[0]<<8)+data[1];return tempCode;
}

3、驱动的使用

我们已经设计并实现了TSEV01CL55红外温度传感器的驱动程序,接下来我们将考虑设计一个简单的应用来验证这一驱动。

3.1、声明并初始化对象

使用基于对象的操作我们需要先得到这个对象,所以我们先要使用前面定义的TSEV01CL55红外温度传感器对象类型声明一个TSEV01CL55红外温度传感器对象变量,具体操作格式如下:

HLPTObjectType hlpt;

声明了这个对象变量并不能立即使用,我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:

HLPTObjectType *hlpt,初始化的对象变量

uint8_t address,设备I2C地址

HLPTReceive receive,接收函数指针

HLPTTransmit transmit,发送函数指针

HLPTDelayms delayms,毫秒延时函数指针

对于这些参数,对象变量我们已经定义了。而设备地址,根据实际情况输入就好了。主要的是我们需要定义几个函数,并将函数指针作为参数。这几个函数的类型如下:

/*延时操作指针类型*/
typedef void (*HLPTDelayms)(volatile uint32_t nTime);/*接收数据操作指针类型*/
typedef void (*HLPTReceive)(struct HLPTObject *hlpt,uint8_t *rData,uint16_t rSize);/*发送数据操作指针类型*/
typedef void (*HLPTTransmit)(struct HLPTObject *hlpt,uint8_t *wData,uint16_t wSize);

对于这几个函数我们根据样式定义就可以了,具体的操作可能与使用的硬件平台有关系。具体函数定义如下:

/*从TSEV01CL55接收数据*/
static void ReceiveFromHLPT(HLPTObjectType *sht,uint8_t *rData,uint16_t rSize)
{HAL_I2C_Master_Receive(&hlpti2c, sht->devAddress,rData, rSize, 1000);
}/*向TSEV01CL55传送数据*/
static void TransmitToHLPT(HLPTObjectType *sht,uint8_t *tData,uint16_t tSize)
{HAL_I2C_Master_Transmit(&hlpti2c,sht->devAddress,tData,tSize,1000);
}

对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下:

HLPTInitialization(&hlpt,0x54,ReceiveFromHLPT,TransmitToHLPT,HAL_Delay);

3.2、基于对象进行操作

我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值,接下来我们使用这一驱动开发我们的应用实例。

/*读取温度值*/
void GetTemperatureData(void)
{float tempObject;float tempAmbient;GetHLPTemperature(&hlpt);tempObject=hlpt.tempObject;tempAmbient=hlpt.tempAmbient;
}

4、应用总结

我们实现了TSEV01CL55红外温度传感器的驱动,并再次基础上设计了一个简单的验证应用。我们得到了目标温度和环境温度。这说明我们的驱动设计是成功的。

在使用驱动时我们需要注意,与TSEV01CL55红外温度传感器的I2C通讯会出现锁死的情况,特别是使用硬件I2C收发器的时候。而且TSEV01CL55红外温度传感器不会在数据准备好后下拉SCL电平,所以读取数据时,需要给以足够的延时来保证数据准备就绪。

在使用TSEV01CL55红外温度传感器的驱动时还应注意,TSEV01CL55红外温度传感器有一个固定的地址0x54,在初始化时输入此地址,若不给定这个地址就会以广播的方式通讯。

欢迎关注:

外设驱动库开发笔记12:TSEV01CL55红外温度传感器驱动相关推荐

  1. 外设驱动库开发笔记15:DHT11温湿度传感器驱动

    与DS18B20一样DHT11也是采用单总线,但所不同的是DHT11可同时实现温度和湿度的检测.在我们的产品中经常使用它来检测环境的温湿度信息.这一篇我们将设计并封装DHT11的驱动程序,以方便重复使 ...

  2. 外设驱动库开发笔记21:BME680环境传感器驱动

    环境传感器是一类我们很常用的传感器.它可以方便我们获取压力.温度.湿度以及空气质量等数据.在这一篇中,我们将分析BME680环境传感器的功能,并设计和实现BME680环境传感器的驱动. 1.功能概述 ...

  3. 外设驱动库开发笔记19:BMP280压力温度传感器驱动

    压力和温度监测在嵌入式系统开发中是非常常见的需求,特别是对环境大气压力和温度的检测需求就更常见了.我们一般都会选择一些封装较小操作比较方便的压力传感器.BMP280就是满足这一要求的器件.在这一篇中我 ...

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

      很多时候我们需要检测流量和压力这些参数,比如我们要检测大气压,或者通过测量差压来获得输送流体的流量等,都需要用到压力传感器.这一篇我们就来讨论MS4515DO压力传感器的数据获取. 1.功能概述 ...

  5. 外设驱动库开发笔记50:HP203B气压传感器驱动

      在我们的项目中,经常会有需要检测大气压力的时候.这次我们在大气环境监测的过程中用到了HP203B这款气压传感器.所以这一篇中,我们来思考HP203B气压传感器的驱动设计. 1.功能概述   HP2 ...

  6. 外设驱动库开发笔记13:MLX90614红外温度传感器驱动

    红外温度传感器一般用于非接触式的温度检测.在我们的系统中经常会有这样的需求.所以我们将其设计为通用的驱动库以备复用.这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现. 1.功能概述 ML ...

  7. 外设驱动库开发笔记31:S-Modlue远红外气体传感器驱动

      在气体分析类产品中,我们经常会用到远红外气体传感器.我们就在碳氢类气体成分分析中使用了S-Modlue远红外气体传感器.接下来,我们将讨论S-Modlue远红外气体传感器驱动的设计与实现. 1.功 ...

  8. 外设驱动库开发笔记8:GPIO模拟I2C驱动

    I2C总线简单方便,是我们经常使用的一种总线.但有时候我们的MCU没有足够多的I2C控制器来实现我们的应用,所幸我可以使用普通的GPIO引脚来模拟低速的I2C总线通信.这一节我们就来实现使用软件通过普 ...

  9. 外设驱动库开发笔记10:SHT2x系列温湿度传感器驱动

    温湿度检测是嵌入式编程中经常应用到的一项功能.在我们的产品中亦经常使用.SHT2x系列温湿度传感器作为一种高精度低成本的集成模块,一直应用于我们的产品中.在这里我们讨论如何封装SHT2x系列温湿度传感 ...

最新文章

  1. 简单介绍Idea使用正则表达式批量替换字符串的方法
  2. Linux配置免密登录
  3. React 学习总结
  4. makefile 学习(一)
  5. mysql还原数据mysqldump
  6. [COGS746] [网络流24题] 骑士共存
  7. java解析excelpoi_Java解析Excel之POI(一)
  8. 4.网络层(2)---子网划分
  9. python版本回退_版本回退
  10. Irrlicht引擎源码剖析——第十三天
  11. Vue中动态绑定自定义快捷键
  12. win11最新bug修复合集(来源于微软官方)
  13. bryntum gantt 5.0.6
  14. c语言 指针 pdf,彻底搞定C指针.pdf
  15. 已知含税单价、税率、数量,计算不含税单价、不含税金额、税额
  16. 刘强东:京东高管降薪10%-20% 拿百亿投向基层员工
  17. 麦克风声源定位原理_一种利用麦克风阵列进行声源定位的方法与流程
  18. memont高级使用说明
  19. 基于VGG的猫狗识别
  20. 亚马逊测评提升销量有什么好办法,分享6点技巧

热门文章

  1. 部署WEB应用到云服务器时,出现的部分网页不能显示或者连接数据库问题。
  2. 1 计算机组成原理第一章 计算机系统概述 计算机发展历程、层次结构、性能指标
  3. nuxt项目打包上线之二
  4. 解决老是提示找不到Mapper文件无法执行定义的方法问题!
  5. 【转】chrome浏览器的跨域设置——包括版本49前后两种设置
  6. excel导入数据到sqlserver
  7. UTF8有BOM和无BOM
  8. java读写html文件时出现中文乱码问题的解决方法
  9. PowerCenter Designer小结
  10. 《动手学深度学习》第一天 (2.1+2.2)