非接触式红外测温MLX90614

news2024/11/17 12:29:47

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);

  }

在这里插入图片描述

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

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

相关文章

原生微信小程序如何动态修改svg图片颜色及尺寸、宽高(封装svgIcon组件)

最终效果 前言 动态设置Svg图片颜色就是修改Svg源码的path中的fill属性&#xff0c; 通过wx.getFileSystemManager().readFile读取.xlsx文件 把文件转成base64 封装svg-icon组件 1、在项目的components下新建svg-icon文件夹&#xff0c;新增base64.js文件 class Base64 {cons…

深圳易图讯实景三维数字孪生系统 实景三维电子沙盘

深圳易图讯实景三维数字孪生系统是一款基于三维地理空间的数字孪生系统&#xff0c;首先&#xff0c;该系统集成了多维度地理空间数据&#xff0c;可以将各类数据与应用需求进行充分整合&#xff0c;实现数据跨界融合、场景全角度可视等功能。其次&#xff0c;该系统具备智能化…

36V到80V降5V1A电源芯片WT6039

36V到80V降5V1A电源芯片WT6039 宽电压12V到90V的降压DC-DC转换器WT6039&#xff0c;功能强大&#xff0c;使用广泛。 WT6039是一款功能非常强大的降压DC-DC转换器芯片&#xff0c;它在12V到90V的宽电压范围内都能正常工作。WT6039不仅具有使能开关控制、参考电源、误差放大器等…

gRPC - 分布式 gRPC 四种通信方式、三种代理方式(全代码演示)

目录 一、分布式 gRPC 开发 1.1、项目结构 & 前置说明 1.1.1、项目结构 1.1.2、protoc 必备依赖 1.1.3、推荐插件&#xff08;简化开发&#xff09; 1.1.4、protoc 生成 Java 代码说明 1.2、一元 RPC&#xff08;代理方式一&#xff1a;阻塞式 BlockingStub&#xff…

深度学习中的准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的AUC值,

混淆矩阵 其中关于 TP, TN; FP, FN 的解释&#xff1b; 其中首字母 T&#xff0c;F代表预测的情况&#xff0c;即T代表预测的结果是对的&#xff0c; F代表预测的结果是错误的&#xff1b; 第二个字母代表预测是预测为 正样本&#xff0c;还是负样本&#xff0c; Positve 代表…

Python实现某城市从站点API获取天气状况示例(Crossin教室实例24)

一、要点说明&#xff1a; 根据站点当前API数据是由‘\r’字符连接的字符串的特点&#xff0c;主要用到了字符串的split()方法。此方法参数就是‘\r’。函数返回值是被分隔的字符串的列表。通过使用列表索引就可以分项取到天气数据。 二、示例代码&#xff1a; import reque…

面试被问了几百遍的 IOC 和 AOP ,一篇文章带你搞清楚!!!

面试被问了几百遍的 IOC 和 AOP &#xff0c;一篇文章带你搞清楚&#xff01;&#xff01;&#xff01; 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC&#xff1f;IoC 解决了什么问题&#xff1f;IoC 和 DI 的区别&#xff1f;什么是 AOP&#xff…

LeetCode206链表反转

//我来理解一下运用递归求解 class Solution { public:ListNode* reverseList(ListNode* head) {//首先判断是否为最后一个元素if(head null|| head.next null){return head;//返回末尾元素}ListNode* receive;//此时进入循环的每一层都实现了temp接收head.next的结点进行…

解决sublime中文符号乱码问题

效果图 原来 后来 问题不是出自encode文件编码&#xff0c;而是win10的字体问题。 解决方法 配置&#xff1a; { "font_face":"Microsoft Yahei", "dpi_scale": 1.0 } 参考自 Sublime 输入中文显示方框问号乱码_sublime中文问号-CSDN博…

Python新年烟花代码

Pygame 绘制烟花的基本原理 1&#xff0c;发射阶段&#xff1a;在这一阶段烟花的形状是线性向上&#xff0c;通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动&#xff0c;运动过程中 5个点被赋予不同大小的加速度&#xff0c;随着时间推移&#xff0c;后面的…

LeGO-LOAM 安装以及运行

一、源码地址&#xff1a; GitHub - RobustFieldAutonomyLab/LeGO-LOAM: LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable TerrainLeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain - GitH…

报错解决:Error creating bean with name ‘userServiceImpl‘

首先&#xff1a;spring整合MyBatis是出现这个错误&#xff1a; Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name userServiceImpl: Unsatisfied dependency expressed through fiel…

你的网站或许不需要前端构建(二)

前一阵&#xff0c;有朋友问我&#xff0c;能否在不进行前端编译构建的情况下&#xff0c;用现代语法开发网站界面。 于是&#xff0c;就有了这篇文章中提到的方案。 写在前面 这篇文章&#xff0c;依旧不想讨论构建或不构建&#xff0c;哪一种方案对开发更友好&#xff0c;…

go-cqhttp作者停止维护——替代品OpenShamrock的使用方法

目录 前言 解决办法 配置要求 实操 刷入面具 安装lsp框架 安装OpenShamrock和QQ 注意 大功告成 前言 由于QQ官方针对协议库的围追堵截&#xff0c;go-cqhttp已经无力维护下去了 原文连接 QQ Bot的未来以及迁移建议 Issue #2471 Mrs4s/go-cqhttp (github.com)https…

基于WS2812的圣诞树

项目说明 通过使用1010封装的WS2812灯珠&#xff0c;实现整体观感和谐、可视角度更佳的迷你圣诞树采用电池供电触摸开关机手机遥控方案&#xff0c;主打一个优雅。 主要特色 1、灯板部分&#xff08;圣诞树主体&#xff09; 使用1010封装的WS2812灯珠&#xff0c;体积小更和…

Jetson Orin Nano_安装jtop指令(遇到循环提示重启服务的问题)、查看系统运行情况及基本信息

1、安装jtop 1.1、如果一切顺利的话&#xff0c;流程如下 安装jetson-stats&#xff08;前提&#xff1a;安装pip3&#xff09; sudo pip3 install jetson-stats 执行jtop&#xff0c;根据提示需要重启服务 sudo systemctl restart jtop.service sudo jtop 1.2、循环提示…

深入理解Java中资源加载的方法及Spring的ResourceLoader应用

在Java开发中&#xff0c;资源加载是一个基础而重要的操作。本文将深入探讨Java中两种常见的资源加载方式&#xff1a;ClassLoader的getResource方法和Class的getResource方法&#xff0c;并介绍Spring框架中的ResourceLoader的应用。 1. 资源加载的两种方式 1.1 ClassLoader…

Spring见解4 基于注解的AOP配置

5.基于注解的AOP配置 5.1.创建工程 5.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

基于群居蜘蛛算法优化的Elman神经网络数据预测 - 附代码

基于群居蜘蛛算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于群居蜘蛛算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于群居蜘蛛优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…