非接触式红外测温MLX90614

1.MLX90614简介

  MX90614是一款由迈来芯公司提供的低成本,无接触温度计。输出数据和物体温度呈线性比例,具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101(温度是通过PTC或是PTAT元件测量)和信号处理专用集成芯片MLX90302,专门用于处理红外传感器输出信号。用以阻碍可见光和近红外光辐射的光学滤波器(可传播长波)集成在封装内提供对环境和日光的免疫。滤波器的波长通带为5.5到14μm。由于集成了低噪声放大器、17位模数转换器和强大的数字信号处理芯片 MLX90302,使得高精度和高分辨度的温度计得以实现。一个附加的片上温度传感器用来测量芯片的温度。测量完两个传感器的输出后,对应的环境温度和物体温度被计算出。计算所得物体温度和环境温度存储在MLX90302的RAM单元,温度分辨率为0.01℃,并可通过两线 SMBus(系统管理总线)兼容协议接口(IIC与之兼容)(0.02℃分辨率)或是10位PWM(脉宽调制)输出模式输出。MLX90614出厂温度范围都进行过校准,传感器测量的温度为视场里所有物体温度的平均值。
  MLX90614 系列模块是一组通用的红外测温模块。 在出厂前该模块已进行校验及线性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通道输出,并有两种输出接口,适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设备应用等。
  MLX90614的出厂校准温度范围很广:环境温度-40 ~ 125 ˚C,物体温度-70 ~ 382.2 ˚C。传感器测量的温度为视场里所有物体温度的平均值。MLX90614 室温下的标准精度为±0.5ºC。医疗应用版本的传感器可在人体温度范围内达到±0.1ºC 的精度。
在这里插入图片描述
在这里插入图片描述

  • 硬件接口:
引脚说明
SCLI2C时钟线
SDAI2C数据线
VDD电源3.3~5V
VSS数字地GND

2.工作原理

  MLX90614是由内部状态机控制物体温度和环境温度的测量和计算,进行温度后处理,并将结果通过PWM或是SMBus模式输出。ASSP支持两个IR传感器。 (MLX90614xAx只有一个IR传感器) IR传感器的输出通过增益可编程的低噪声低失调电压放大器放大,经过Sigma Delta调制器转换为单一比特流并反馈给 DSP做后续的处理。信号通过可编程的(用 EEPROM 实现)FIR和IIR低通滤波器以进一步减低输入信号的带宽从而达到所需的噪声特性和刷新率。IIR滤波器的输出为测量结果并存于内部RAM中,其中三个单元可被用到:一个是片内温度传感器(片上PTAT或PTC),其余两个为IR传感器。基于以上测量结果,计算出对应的环境温度Ta和物体温度To,两个温度分辨率都为0.01℃。Ta和 To可通过两种方式读取:通过两线接口读取RAM单元,(0.02℃分辨率,固定范围)或者通过 PWM 数字模式输出。(10位分辨率,范围可配置)测量周期的最后一步为:测量所得Ta和To被重新调节为PWM所需的输出分辨率,并且该数据存在PWM 状态机的寄存器中,状态机可以产生固定频率和一定占空比来表示测量的数据。
在这里插入图片描述

3.通讯协议

  单片机与MLX90614红外测温模块之间通信的方式是“类IIC”通信,意思就是通信方式跟IIC通信方式很像但又不是IIC,它有另外一个名字叫做SMBus。SMBus (System Management Bus)是1995年由 intel公司提出的一种高效同步串行总线,SMBus只有两根信号线:双向数据线和时钟信号线,容许CPU与各种外围接口器件以串行方式进行通信、交换信息,既可以提高传输速度也可以减小器件的资源占用,另外即使在没有SMBus 接口的单片机上也可利用软件进行模拟。。MLX90614 SMBus时钟的最大频率为100KHz,最小为 10KHz。
在这里插入图片描述

  • S 是起始信号,Sr是重发起始信号。
  • Rd 读使能,Wr写使能。
  • A 是应答,0为应答1为非应答(发送数据和读取数据都需要应答)。
  • P 是停止信号。
  • PEC 是CRC-8的多项式 a X8+X2+X1+1。每个字节的最高有效位首先传送。

3.1 起始信号和停止信号

在这里插入图片描述

//发送起始信号
//时钟为高电平时,数据由高电平变为低电平。
static void I2C1_Start(void)
{
I2C1_SDAout_Mode();//输出模式
    I2C1_SDAout(1);
	I2C1_SCL(1);
	Delay_Us(2);
	I2C1_SDAout(0);
	Delay_Us(2);
	I2C1_SCL(0);//方便后续数据收发
    Delay_Us(1);
}
//停止信号
//时钟线为高电平时,数据线由低变高。
static void I2C1_Stop(void)
{
	I2C1_SDAout_Mode();//输出模式
	I2C1_SCL(0);
	I2C1_SDAout(0);
	Delay_Us(5);
	I2C1_SCL(1);
	Delay_Us(5);
	I2C1_SDAout(1);
}

3.2 数据传输时序

在这里插入图片描述
时钟线为高时读取数据。应答信号本身就是一位数据。

  • 获取应答示例
//获取应答信号
static u8 I2C1_Wait_Ack(void)
{
	u8 cnt=0;
	I2C1_SDAIN_Mode();//配置为输入模式
	I2C1_SDAout(1);	
	I2C1_SCL(0);//告诉从机,主机需要获取数据
	Delay_Us(5);
	I2C1_SCL(1);//从机数据发送完成,主机开始读取数据
	while(I2C1_SDAin)
	{
		cnt++;
		Delay_Us(5);
		if(cnt>=100)return 1;
	}
	Delay_Us(5);
	I2C1_SCL(0);//方便下一次数据收发
	return 0;
}
  • 读取一字节数据示例
//读取一个字节数据
static u8 I2C1_Read_Byte(void)
{
	u8 i=0;
	u8 data=0;
	I2C1_SDAIN_Mode();//配置为输入模式
	for(i=0;i<8;i++)
	{
		I2C1_SCL(0);//告诉从机,主机需要获取数据
		Delay_Us(5);
		I2C1_SCL(1);//开始读取数据
		data<<=1;//默认收到0
		if(I2C1_SDAin)data|=0x01;
		Delay_Us(5);
	}
	I2C1_SCL(0);
	return data;
}

时钟线为低电平时发送数据。应答信号本身就是一位数据。

  • 发送应答示例
/***********发送应答信号**************************
**
**形参:u8 ack -- 0应答,1非应答
**
***************************************************/
static void I2C1_SendAck(u8 ack)
{
	I2C1_SDAout_Mode();//输出模式	
	I2C1_SCL(0);//告诉从机,主机开始发送数据
  if(ack&0x01)
  {
    I2C1_SDAout(1);
  }
  else I2C1_SDAout(0);
	Delay_Us(5);
	I2C1_SCL(1);//告诉从机,主机数据发送完成
	//方便下一次数据收发
	Delay_Us(5);
	I2C1_SCL(0);
}
  • 发送一字节数据示例
//发送一个字节数据
static void I2C1_Send_Byte(u8 data)
{
	u8 i=0;
	I2C1_SDAout_Mode();//输出模式
	for(i=0;i<8;i++)
	{
		I2C1_SCL(0);//告诉从机,主机开始发送数据
		if(data&0x80)I2C1_SDAout(1);
		else I2C1_SDAout(0);
		Delay_Us(5);
		I2C1_SCL(1);//主机数据发送完成
		data<<=1;
		Delay_Us(5);
	}
	I2C1_SCL(0);//方便下一次数据收发
}

4.读取温度数据示例

  对该模块操作主要是看懂几个图。模块里有EEPROM和RAM两块,EEPROM里只有限定数目的地址是允许客户改写的。整个 EEPROM可通过SMBus接口读和写。
在这里插入图片描述
  RAM中不能写入数据,只能进行读取,并且只有有限数目是客户感兴趣的。
  TA是环境温度地址,Tobj1是物体温度低8位,Tobj2是物体温度高8位。
  读取数据流程如下:设备地址为0x0

在这里插入图片描述
  ①发送起始信号–>②设备地址+写使能(0x0)+获取应答–>③发送读取温度命令(0x07)+获取应答–>④发送起始信号–>⑤设备地址+读使能(0x1)+获取应答–>⑥读取温度低8位+发送应答–>⑦读取温度高8位+发送应答–>⑧发送停止信号;

//读内存
uint16_t MLX906_ReadMemory(void)
{
    uint8_t Pec,PecReg,ErrorCounter;
    uint8_t TempL=0;
    uint8_t TempH=0;
    uint8_t arr[6];
    ErrorCounter=0;
    do
    {
        ErrorCounter++;
        if(ErrorCounter==10)
        {
            return 0;
        }            
        I2C1_Start();//起始信号
        I2C1_Send_Byte(0x00);//发送MLX90614地址
        I2C1_Wait_Ack();
        I2C1_Send_Byte(0x07);//发送读MLX90614 RAM地址
        I2C1_Wait_Ack();
        I2C1_Start();//重新启动
        I2C1_Send_Byte(0x01);//发送数据采集命令
        I2C1_Wait_Ack();
        TempL=I2C1_Read_Byte();//读取地位数据
        I2C1_SendAck(0);
        TempH=I2C1_Read_Byte();//读取高位数据
        I2C1_SendAck(0);
        Pec=I2C1_Read_Byte();//读取校验位
        I2C1_SendAck(0);
        I2C1_Stop();//停止信号
        arr[5]= 0x00;
        arr[4]= 0x07;
        arr[3]= 0x01;
        arr[2]= TempL;
        arr[1]= TempH;
        arr[0]= 0;
        PecReg=CRC_Calculation(arr);//计算CRC校验
    }while(PecReg!=Pec);
    return (uint16_t)((TempH<<8)|TempL);
}
  • CRC-8的多项式X8+X2+X1+1计算示例
//crc校验
uint8_t CRC_Calculation(uint8_t pec[])
{
    uint8_t crc[6];//存放多项式
    uint8_t BitPosition = 47;
    uint8_t shift;
    uint8_t i,j,temp;
    do
    {
        crc[5]=0;
        crc[4]=0;
        crc[3]=0;
        crc[2]=0;
        crc[1]=0x01;
        crc[0]=0x07;
        BitPosition = 47;
        shift = 0;
        i=5;
        j=0;
        while((pec[i]&(0x80>>j))==0 && i>0)
        {
            BitPosition--;
            if(j<7)
            {
                j++;
            }
            else
            {
                j= 0x00;
                i--;
            }
        }
        shift= BitPosition-8;
        while(shift)
        {
            for(i=5;i<0xFF;i--)
            {
                if((crc[i-1]&0x80)&&(i>0))
                {
                    temp=1;
                }
                else
                {
                    temp=0;
                }
                crc[i]<<=1;
                crc[i]+=temp;
            }
            shift--;
        }
        for(i=0;i<=5;i++)
        {
            pec[i]^=crc[i];
        }
    }while(BitPosition>8);
    return pec[0];
}

5.温度转换示例

  • 环境温度Ta

  传感器芯片温度是通过PTC或是PTAT元件测量的,传感器所有的状态和数据处理都是在片内进行的,处理好的线性传感器温度Ta存于芯片内存里。计算好的温度输出分辨率为 0.02 ˚C,传感器的出厂校准范围为40…+125 ˚C。在RAM单元地址006h中,2DE4h对应-38.2 ˚C (线性输出最低限度) ,4DC4h (19908d)对应 125 ˚C。通过下式将RAM内容转换为实际的Ta温度,结果是开尔文为单位。

  • 环境温度:

    Ta[°K]=Targe*0.02;

  • 物体温度:

     To[°K]=Targe*0.02;

  • 所有转换为摄氏度计算方法为:

    Temp=Targe*0.02-273.5;

//读温度
float MLX906_Read_Temp(void)
{
    return (float )MLX906_ReadMemory()*0.02-273.15;
}

6.软件配置

在这里插入图片描述
在这里插入图片描述

6.1 温度获取与显示

  红外测温,实时显示温度数据。

  Lcd_Init();
  LCD_ShowPicture(56,32,128,128,(unsigned char *)gImage_wbyq);
  _LCD_DisplayFont(48,180,BRRED,24,0);
  _LCD_DisplayFont(48+24,180,BRRED,24,1);
  _LCD_DisplayFont(48+24*2,180,BRRED,24,2);
  _LCD_DisplayFont(48+24*3,180,BRRED,24,3);
  _LCD_DisplayFont(48+24*4,180,BRRED,24,4);
  _LCD_DisplayFont(48+24*5,180,BRRED,24,5);
	uint16_t data;
	float temp;
	char buff[200];
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		temp=MLX906_Read_Temp();
		printf("temp=%.1f\r\n",temp);
		snprintf(buff,sizeof(buff),"Temp:%.1f",temp);

		LCD_ShowStr(120-strlen(buff)/2*12,210,24,buff,RED,WHITE);
		Delay_Ms(500);

  }

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue简单实现滚动条

背景&#xff1a;产品提了一个需求在一个详情页&#xff0c;一个form表单元素太多了&#xff0c;需要滚动到最下面才能点击提交按钮&#xff0c;很不方便。他的方案是&#xff0c;加一个滚动条&#xff0c;这样可以直接拉到最下面。 优化&#xff1a;1、支持滚动条&#xff0c;…

uniapp 【专题详解 -- 时间】云数据库时间类型设计,时间生成、时间格式化渲染(uni-dateformat 组件的使用)

云数据表的时间类型设计 推荐使用时间戳 timestamp "createTime": {"bsonType": "timestamp","label": "创建时间&#xff1a;" }时间生成 获取当前时间 Date.now() .add({createTime: Date.now() })时间格式化渲染 下载安…

Prototype原型模式(对象创建)

原型模式&#xff1a;Prototype 链接&#xff1a;原型模式实例代码 注解 模式定义 使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 ——《设计模式》GoF 目的 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&am…

Chapter 7 - 10. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Detecting Congestion on a Remote Monitoring Platform Remote monitoring platforms can monitor all the ports in a network simultaneously to provide network-wide single-pane-of-glass visibility. 远程监控平台可同时监控网络中的所有端口,以提供全网单一窗口可视性…

selenium 用webdriver.Chrome 访问网页闪退解决方案

1.1.1. 解决方案&#xff1a; 1.1.1.1. 移动插件到谷歌的安装目录下 1.1.1.2. 设置环境变量 1.1.1.3. 重启电脑检查成功 解决时间&#xff1a;5min

Springcloud 微服务实战笔记 Eureka

服务治理 服务注册 在服务治理框架中&#xff0c;通常都会构建一个注册中心&#xff0c;每个服务单元向注册中心登记自己提供的服务&#xff0c;将主机与端口号、版本号、通信协议等一些附加信息告知注册中心&#xff0c;注册中心按服务名分类组织服务清单。当服务启动后&…

STM32学习笔记二十一:WS2812制作像素游戏屏-飞行射击游戏(11)探索游戏脚本

还记得上次在第十七章中为BOSS创建的路径动画吧。我们写了一大坨的代码来描述BOSS的运动路径&#xff0c;但凡是写过几年代码的人都不会干出这样的事情。-_-! 没办法&#xff0c;谁叫那时候还没有脚本呢。这章就来补齐这块短板。 脚本属于配置化的一种&#xff0c;你可以把脚…

MongoDB数据类型详解

BSON 协议与数据类型 MongoDB 为什么会使用 BSON&#xff1f; JSON 是当今非常通用的一种跨语言 Web 数据交互格式&#xff0c;属 ECMAScript 标准规范的一个子集。JSON &#xff08;JavaScript Object Notation&#xff0c;JS 对象简谱&#xff09;即 JavaScript 对象表示法…

Docker网络相关操作

文章目录 网络相关操作1 网络模式1.1 bridge模式1.2 host模式1.3 Container网络模式1.4 none模式1.5 overlay网络模式1.6 macvlan网络模式 2 bridge网络2.1 通过link的方式2.2 新建bridge网络 3 none网络4 host网络5 网络命令汇总5.1 查看网络5.2 创建网络5.3 删除网络5.4 查看…

Python 中的==操作符 和 is关键字

Python是一种功能强大的通用编程语言&#xff0c;提供了各种比较值和对象的方法。其中包括操作符和is关键字&#xff0c;它们的用途不同&#xff0c;但由于它们有时可以达到相同的目的&#xff0c;所以经常会被混淆。在本文中&#xff0c;我们将深入研究和is之间的区别&#xf…

过滤器亚马逊审核UL900报告标准

过滤器亚马逊审核UL900防火等级检测标准,要符合ISO17025资质实验室出具的报告才能成功的上架亚马逊平台。 过滤器&#xff08;filter&#xff09;是输送介质管道上不可缺少的一种装置&#xff0c;通常安装在减压阀、泄压阀、定水位阀 ,方工过滤器其它设备的进口端设备。过滤器…

wsl(ubuntu)创建用户

我们打卡ubuntu窗口&#xff0c;如果没有创建用户&#xff0c;那么默认是root用户 用户的增删改查 查 查询所有的用户列表 cat /etc/passwd | cut -d: -f1cat /etc/passwd: 这个命令用于显示 /etc/passwd 文件的内容。/etc/passwd 文件包含了系统上所有用户的基本信息。每一…

Java字符串:构建和操作字符序列的动态工具

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、常用方法1、字符串构造2、String对象的比较Ⅰ、比较是否引用同一个对象Ⅱ、 按照字典序比较 3、转换Ⅰ、数值和字符串的转换…

探索 OceanBase 中图数据的实现

在数据管理和处理的现代环境中&#xff0c;对能够处理复杂数据结构的复杂数据模型和方法的需求从未如此迫切。图数据的出现以其自然直观地表示复杂关系的独特能力&#xff0c;开辟了数据分析的新领域。 虽然 Neo4j 等成熟的图形数据库为处理图形数据提供了强大的解决方案&…

HTML 使用 ruby 给汉字加拼音

使用 ruby 给汉字加拼音 兼容性 使用 ruby 给汉字加拼音 大家有没有遇到过要给汉字头顶上加拼音的需求? 如果有的话, 你是怎么解决的呢? 如果费尽心思, 那么你可能走了很多弯路, 因为 HTML 原生就有这样的标签来帮我们实现类似的需求. <ruby> ruby 本身是「红宝石」…

K8S陈述式资源管理(1)

命令行: kubectl命令行工具 优点: 90%以上的场景都可以满足对资源的增&#xff0c;删&#xff0c;查比较方便&#xff0c;对改不是很友好 缺点:命令比较冗长&#xff0c;复杂&#xff0c;难记声明式 声明式&#xff1a;K8S当中的yaml文件来实现资源管理 GUI&#xff1a;图形…

C#,入门教程(08)——基本数据类型及使用的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(07)——软件项目的源文件与目录结构https://blog.csdn.net/beijinghorn/article/details/124139947 数据类型用于指定数据体&#xff08;DataEntity&#xff0c;包括但不限于类或结构体的属性、变量、常量、函数返回值&#xff09;…

3_并发编程可见性(volatile)之缓存锁内存屏障过程

并发编程可见性volatile 1.背景原来 从下面的程序可以知道main线程把stop修改成false&#xff0c;而在t1线程没有中没有读取到stop值为false&#xff0c;所以导致了t1线程不能够停止。 从而说明stop值在线程t1不可见&#xff0c;解决这个问题在stop变量上添加volatile即可(p…

java spring boot 获取resource目录下的文档

主要代码 String filePath"templates/test.xls" ClassPathResource classPathResource new ClassPathResource(filePath); InputStream inputStream classPathResource.getInputStream();目录 主要目录存放再这 代码案例 public void downloadTemplate( HttpS…

计算机毕业设计 基于SpringBoot的公司资产网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…