MLX90614系列红外测温模块的原理及应用南京航空航天大学曾德志摘要:MLX90614系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通道输出,并有两种输出接口,适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设备应用等。本文以MLX90614AAA为例介绍其原理和应用。1引言一般来说,测温方式可分为接触式和非接触式,接触式测温只能测量被测物体与测温传感器达到热平衡后的温度,所以响应时间长,且极易受环境温度的影响;而红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有影响动被测物体温度分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点,近年来在家庭自动化、汽车电子、航空和军事上得到越来越广泛的应用。2测温原理概述物体红外辐射能量的大小和波长的分布与其表面温度关系密切。因此,通过对物体自身红外辐射的测量,能准确地确定其表面温度,红外测温就是利用这一原理测量温度的。红外测温器由光学系统、光电探测器、信号放大器和信号处理及输出等部分组成。光学系统汇聚其视场内的目标红外辐射能量,视场的大小由测温仪的光学零件及其位置确定。红外能量聚焦在光电探测器上并转变为相应的电信号。该信号经过放大器和信号处理电路,并按照仪器内的算法和目标发射率校正后转变为被测目标的温度值。PWM的全称是PulseWidthModulation(脉冲宽度调制)即通过调节脉冲的周期、宽度,以达到变压、变频的目的,数字式脉宽调制方式中,数字是控制信号,通过改变高低电平数的比值达到改变占空比的目的,PWM控制电路在开关稳压电源、不间断电源(UPS)以及直流电机调速,交流电机变频调速等控制电路中有着广泛应用。SMBus(SystemManagementBus,)是1995年由intel公司提出的一种高效同步串行总线,SMBus只有两根信号线:双向数据线和时钟信号线,容许CPU与各种外围接口器件以串行方式进行通信、交换信息,即可以提高传输速度也可以减小器件的资源占用,另外即使在没有SMBus接口的单片机上也可利用软件进行模拟。Melexis公司生产的MLX90614系列测温模块是应用非常方便的红外测温装置,其所有的模块都在出厂前进行了校验,并且可以直接输出线性或准线性信号,具有很好的互换性,免去了复杂的校正过程。该模块以81101热电元件作为红外感应部分。输出是被测物体温度(TO)与传感器自身温度(Ta)共同作用的结果,理想情况下热电元件的输出电压为:)(44TaToAVir−=其中温度单位均为Kelvin,A为元件的灵敏度常数。目标温度和环境温度由81101内置的热电偶测定测量,从81101中输出的两路温度信号分别经内部MLX90302器件上高性能、低噪声的斩波稳态放大器放大再经一个17-bit的模数转换器(ADC)和强大的数字信号处理(DSP)单元后输出。该系列模块的温度解析度可达0.01°C,体积小巧,被测目标和环境温度能通过单通道(由MLX90302内的状态机控制)输出,有两种输出方式:PWM输出、可编程SMBus输出,适于多种应用环境,下面以MLX90614为例,重点介绍其特性和使用方法。通过SMBus编程可以更改模块EEPROM内的预设值并按照应用要求进行配置,并可以读出EEPROM内的配置信息;还可以读出模块RAM内温度等数据。MLX90614有适用于3伏和5伏电源操作的两种类型。由于3伏型其小于2毫安的电流消耗,它非常适用于手提装置和电池动力装置。为此,传感器也具有一个节能“休眠”模式,此时电流消耗可低于2毫安。对于12伏汽车电池直接供电的情况,5伏型包含的电子部件可与几个外部元件一起在较高电压下运行。3MLX90614简介3.1MLX90614管脚表1MLX90614的管脚功能名称功能描述VSS电源地,金属外壳和该管脚相连SCL/VzSMBus接口的时钟信号,或8-16V电源供电时接三极管基极PWM/SDAPWM或SMBus接口的数据信号,通常模式下从该管脚通过PWM输出物体温度VDD电源3.2MLX90614存储器3.2.1EEPROM只有某些存储单元用户能够写入,但是可以读出全部存储单元。MLX90614的EEPROM有32个16位存储单元,其中存储单元Tomax,Tomin,Ta分别是用户物体温度上下限和环境温度范围,PWMCTRL是PWM配置寄存器。3.2.2RAM用户不能向RAM写入数据,但是可以读一些存储单元。MLX90614的RAM有32个17位存储单元,其中TA,TOBJ1,TOBJ2是环境温度和物体温度,在SMBus方式下,可以从这几个存储单元读出环境和被测物体的温度。4应用设计4.1MLX90614测温特性4.1.1MLX90614的SMBus协议图2SMBus的数据包组成4.1.2读器件(命令决定是读RAM或EEPROM)数据格式4.1.3写器件(命令决定是写RAM或EEPROM)数据格式4.1.4数据传输时序图3MLX90614的数据传输时序PWM/SDA上的数据在SCL变为低电平300n后即可改变,数据在SCL的上升沿被捕获。16位数据分两次传输,每次传一个字节。每个字节都是按照高位(MSB)在前,低位(LSB)在后的格式传输,两个字节中间的第九个时钟是应答时钟。4.2单片机接口电路MLX90614AAA与单片机连接的硬件电路如图4所示。SCL、PWM/SDA管脚直接连接MCU的普通I/O口即可,由于MLX90614AAA的输入输出接口是漏级开路(OD)结构,需要加上拉电阻。多个MLX90614可以用于一个系统中,每个MLX90614对应一个不同地址,通过地址的不同而访问不同的MLX90614,最多可以达到127个。图4MLX90614AAA与单片机连接电路4.3软件流程图多个MLX90614可以用于一个系统中,通过地址不同区分器件,器件默认的地址为5AH,因此在多MLX90614系统中,需要给每个MLX90614分配一个不同的地址,在只有一个MLX90614的系统中,MLX90614识别地址00h,即在单个MLX90614系统中,可以使用该地址访问它。发送和接收数据是以字节为单位进行的,程序流程如图7、图8所示。每次发送一个字节(按位发送,发送8个位就是一个字节),然后就判断对方是否有应答,如果有应答,就接着发送下一个字节;如果没有应答,多次重发该字节,直到有应答,就接着发送下一个字节,如果多次重发后,仍然没有应答,就结束。接收数据时,每次接收一个字节(按位接收,接收8个位就是一个字节),然后向对方发送一个应答信号,然后就可以继续接收下一个字节。从MLX90614种读出的数据是16位的,由高8位(DataH)和低8位(DataL)两部分组成,其中RAM地址07H单元存储的是TOBJ1数据,数据范围从0x27AD到0x7FFF,表示的温度范围是-70.01℃到+382.19℃。图7发送字节流程图图8接收字节流程图从MLX90614中读出的数据(DataH:DataL)换算为温度数据(T,单位为℃)如下所示:T=(DataH:DataL)*0.02-273.15式(1)例如:DataH:DataL=0x27AD,代入式(1)中T=-70.01℃C语言程序清单:单片机89S52、MLX90614、LCD1602晶振:12M#includeat89x52.h#includeintrins.h//************************************#defineuintunsignedint#defineucharunsignedchar#defineNack_counter10//**************端口定义**************//LCD控制线接口ucharflag1;sbitRS=P2^7;sbitRW=P2^6;sbitLCDE=P2^5;//mlx90614端口定义sbitSCL=P2^3;//时钟线sbitSDA=P2^2;//数据线//************数据定义****************bdataucharflag;//可位寻址数据sbitbit_out=flag^7;sbitbit_in=flag^0;ucharDataH,DataL,Pecreg;//************函数声明*****************************************voidstart_bit();//MLX90614发起始位子程序voidstop_bit();//MLX90614发结束位子程序ucharrx_byte(void);//MLX90614接收字节子程序voidsend_bit(void);//MLX90614发送位子程序voidtx_byte(uchardat_byte);//MLX90614接收字节子程序voidreceive_bit(void);//MLX90614接收位子程序voiddelay(uintN);//延时程序uintmemread(void);//读温度数据voidinit1602(void);//LCD初始化子程序voidchk_busy_flg(void);//LCD判断忙子程序voiddis_cmd_wrt(ucharcmd);//LCD写命令子程序voiddis_dat_wrt(uchardat);//LCD写数据子程序voiddisplay(uintTem);//显示子程序//*************主函数*******************************************voidmain(){uintTem;//函数部分SCL=1;SDA=1;_nop_();_nop_();_nop_();_nop_();SCL=0;delay(1000);SCL=1;init1602();while(1){Tem=memread();display(Tem);delay(20);}}//*********输入转换并显示*********voiddisplay(uintTem){uintT,a,b;T=Tem*2;dis_cmd_wrt(0x01);//清屏if(T=27315){T=T-27315;a=T/100;b=T-a*100;//---------------------------if(a=100){dis_dat_wrt(0x30+a/100);a=a%100;dis_dat_wrt(0x30+a/10);a=a%10;dis_dat_wrt(0x30+a);}elseif(a=10){dis_dat_wrt(0x30+a/10);a=a%10;dis_dat_wrt(0x30+a);}else{dis_dat_wrt(0x30+a);}dis_dat_wrt(0x2e);//显示点//---------------------------if(b=10){dis_dat_wrt(0x30+b/10);//b=b%10;//dis_dat_wrt(0x30+b);}else{dis_dat_wrt(0x30);//dis_dat_wrt(0x30+b);}}//===========================else{T=27315-T;a=T/100;b=T-a*100;dis_dat_wrt(0x2d);//--------------------------if(a=10){dis_dat_wrt(0x30+a/10);a=a%10;dis_dat_wrt(0x30+a);}else{dis_dat_wrt(0x30+a);}dis_dat_wrt(0x2e);//显示点//--------------------------if(b=10){dis_dat_wrt(0x30+b/10);b=b%10;dis_dat_wrt(0x3