0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32物联网开发板(3)--红外测温MLX90614

wang123a 来源:wang123a 作者:wang123a 2023-05-11 09:04 次阅读

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 的精度。

poYBAGRblbeAXnhOAACLoMUSvI4824.pngpYYBAGRblcWAC9z9AAHVn0R1UtQ009.png

硬件接口:

引脚

说明

SCL

I2C时钟线

SDA

I2C数据线

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 状态机的寄存器中,状态机可以产生固定频率和一定占空比来表示测量的数据。

pYYBAGRbllCAHQsxAACXKmbx5FU288.png

3. 通讯协议

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

poYBAGRblqKANhfnAADJvx_E_5U060.png

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

3.1 起始信号和停止信号

pYYBAGRbls2AL2vXAAF37spJ_0s618.png
//发送起始信号
//时钟为高电平时,数据由高电平变为低电平。
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 数据传输时序

pYYBAGRblv2AKez5AABTWLmSslo585.png

时钟线为高时读取数据。应答信号本身就是一位数据。
(1)获取应答示例

//获取应答信号
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;
}

(2)读取一字节数据示例

//读取一个字节数据
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;
}

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

/***********发送应答信号**************************
**
**形参: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);
}

(4)发送一字节数据示例

//发送一个字节数据
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);//方便下一次数据收发
}

3.3 读取温度数据示例

对该模块操作主要是看懂几个图。模块里有EEPROM和RAM两块,EEPROM里只有限定数目的地址是允许客户改写的。整个 EEPROM可通过SMBus接口读和写。

poYBAGRbl6OAQaPAAAFeNtw_E4o715.png

RAM中不能写入数据,只能进行读取,并且只有有限数目是客户感兴趣的。

pYYBAGRbl72ADy5eAACXTT1MMhI956.png

TA是环境温度地址,Tobj1是物体温度低8位,Tobj2是物体温度高8位。
读取数据流程如下:设备地址为0x0

poYBAGRbl9OABmApAABl179Ux7w493.png

①发送起始信号-->②设备地址+写使能(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);
}

2.2.4 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];
}

3.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;
}
pYYBAGRbmQeAOtQEABxHqtx-dIE329.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 滤波器
    +关注

    关注

    158

    文章

    7334

    浏览量

    174829
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348866
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1348

    浏览量

    120880
  • 开发板
    +关注

    关注

    25

    文章

    4437

    浏览量

    94084
  • 红外测温
    +关注

    关注

    2

    文章

    166

    浏览量

    14946
收藏 人收藏

    评论

    相关推荐

    STC12C5A60S2与红外测温模块MLX90614

    STC12C5A60S2与红外测温模块MLX90614用什么方式通信比较好
    发表于 04-16 18:52

    红外测温传感器MLX90614测温的响应时间是多少??????

    红外测温传感器MLX90614测温的响应时间是多少??????
    发表于 05-16 20:59

    请问STM32如何通过IIC驱动MLX90614红外温度传感器?

    请问STM32如何通过IIC驱动MLX90614红外温度传感器?
    发表于 11-25 09:11

    为什么无法使用MSP430进行调试MLX90614红外测温传感器呢

    在用MSP430G2553调试MLX90614红外测温传感器时,输出的值始终为-273.1,我认为应该是读取寄存器内容为0所致,我的程序使用STM32程序修改后进行调试的,原32程序输
    发表于 11-29 06:08

    如何利用STM32F4去移植MLX90614红外温度计呢

    MLX90614是什么?如何利用STM32F4去移植MLX90614红外温度计呢?
    发表于 12-02 07:02

    MLX90614简介

    1.MLX90614简介MLX90614是一款价格昂贵的非接触式红外温度传感器,尤其在疫情的影响下,其价格更是高不可攀,该传感器主要用于不能直接接触测量温度的场合。其常用型号为
    发表于 12-08 06:51

    请问一下如何去实现一种基于STM32MLX90614测温显示设计呢

    请问一下如何去实现一种基于STM32MLX90614测温显示设计呢?
    发表于 12-15 06:41

    基于STM32MLX90614人体红外测温仪的设计资料分享

    前述:QQ:961209458V X:F9986858承接毕业设计。设计的内容本课题主要是设计一种基于STM32MLX90614人体红外测温仪。全文主要阐述了非接触式人体体温测试仪的
    发表于 01-10 06:02

    mlx90614进行红外测温的方法

    做项目使用了NRF51822,要用mlx90614进行红外测温,分享一下相关的使用。mlx90614是一款红外非接触温度计,有多个型号,BA
    发表于 01-10 08:17

    STM32如何通过IIC驱动MLX90614红外温度传感器?

    STM32如何通过IIC驱动MLX90614红外温度传感器?
    发表于 01-27 07:11

    如何使用 MLX90614 红外测温仪实现 SMBus 通信

    本文档介绍了 PIC 微控制器中的 MLX90614 红外温度计 SMBus 通信。本文档还介绍了红外测温仪的应用,以及典型电路示例和所用开发
    的头像 发表于 06-21 17:47 7635次阅读
    如何使用 <b class='flag-5'>MLX90614</b> <b class='flag-5'>红外</b><b class='flag-5'>测温</b>仪实现 SMBus 通信

    使用STM8S和MLX90614手持非接触红外测温枪设计的工程文件和程序

    基于STM8S手持非接触红外测温MLX90614 额温枪设计,包含原理图、PCB、源程序等
    发表于 02-04 08:00 0次下载
    使用STM8S和<b class='flag-5'>MLX90614</b>手持非接触<b class='flag-5'>红外</b><b class='flag-5'>测温</b>枪设计的工程文件和程序

    基于STM32MLX90614人体红外测温

      今天分享一个项目是做一个红外测温的。这个东西网上都有现成的资料和代码,做起来不难。关于红外测温用的芯片是mlx90614
    发表于 01-26 19:06 82次下载
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>MLX90614</b>人体<b class='flag-5'>红外</b><b class='flag-5'>测温</b>枪

    基于MLX90614的mcu的代码实现红外功能

    基于MLX90614的mcu的代码实现红外功能
    发表于 06-20 15:06 4次下载

    stm32中使用mlx90614的驱动代码

    关于stm32中使用mlx90614的驱动代码
    发表于 06-25 10:07 2次下载