STM32传感器模块编程实践(七) MLX90614红外测温模块简介及驱动源码

文章目录

一.概要

一般来说,测温方式可分为接触式和非接触式,接触式测温只能测量被测物体与测温传感器达到热平衡后的温度,所以响应时间长,且极易受环境温度的影响;而红外测温是根据被测物体的红外辐射能量来确定物体的温度,不与被测物体接触,具有不影响被测物体温度分布场,温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点,近年来在家庭自动化、汽车电子、航空和军事上得到越来越广泛的应用。

MLX90614 是一款红外非接触温度计。TO-39 金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片。由于集成了低噪声放大器、17位模数转换器和强大的数字信号处理单元,使得高精度和高分辨度的温度计得以实现。温度计具备出厂校准化,有数字PWM和SMBus(系统管理总线)输出模式。

二.MLX90614主要技术指标

1.宽温度范围内的出厂校准设置:

传感器温度范围-40...+125 ˚C

物体温度范围-70...+380 ˚C

2.Ta和To 由0到+50°C 温度范围内,精度可达到0.5°C,Ta(芯片测量的环境温度) ,To(物体表面温度),体温需要有环境温度跟表面温度这两个温度才能计算

3.(医用) 高精度校准

4.测量辨析度可达 0.02°C

5.兼容SMBus数字接口

6.客户定制的PWM连续读数输出

7.3V和 5V 电源电压

8.节能工作模式

9.适用于不同应用领域的多种封装方式和测量方式

10.车用级别标准

三.模块参考原理图

MLX90614模块参考原理图如下,主要通过SMBus总线跟单片机进行通讯。

四.模块接线说明

模块插针如图所示:

复制代码
传感器模块MX90614与板子用杜邦线相连
  板子3.3V<->模块VIN
  板子GND<->模块GND
  板子PB10<->模块SCL
  板子PB11<->模块SDA

五.模块工作原理介绍

传感器内部框图如下所示

目标温度和环境温度由81101内置的热电偶测定测量,从81101中输出的两路温度信号分别经内部MLX90302 器件上高性能、低噪声的斩波稳态放大器放大再经一个17-bit的模数转换器(ADC)和强大的数字信号处理(DSP)单元后输出。通过SMBus 编程可以更改模块 EEPROM 内的预设值并按照应用要求进行配置,并可以读出EEPROM内的配置信息;还可以读出模块RAM内温度等数据。

六.模块通讯协议介绍

SMBus总线读取模块数据格式,MLX90614设备地址00h。

读取RAM地址为07H的时序

读数据流程:

1.开始

2.发送SlaveAddress

3.发送Ram地址

4.读取数据的低字节Data Byte Low

5.读取数据的高字节Data Byte High

6.读取校验字节

7.发送结束位

流程参考代码

c 复制代码
	SMBus_StartBit();//起始信号
	if(SMBus_SendByte(0x00))//发送MLX90614地址
	  continue;
	if(SMBus_SendByte(0x06))//发送读MLX90614 RAM地址
	  continue;
	SMBus_StartBit();//重新启动
	if(SMBus_SendByte(0x01))//发送数据采集命令
	  continue;
	TempL=SMBus_ReceiveByte(ACK);//读取低位数据
	TempH=SMBus_ReceiveByte(ACK);//读取高位数据
	Pec=SMBus_ReceiveByte(NACK);//读取校验位
	SMBus_StopBit();//停止信号
	arr[5]= 0x00;
	arr[4]= 0x06;
	arr[3]= 0x01;
	arr[2]= TempL;
	arr[1]= TempH;
	arr[0]= 0;
	PecReg=PEC_Calculation(arr);//计算CRC校验

环境温度和物体温度的计算

环境温度Ta(输出分辨率为0.02 ˚C,在RAM 06H地址中)

物体温度 To (输出结果分辨率为 0.02 ˚C,并存于RAM)

七.STM32单片机与MLX90614模块实现体温测量实验

1.硬件准备

STLINK接STM32F103C8T6开发板,STLINK接电脑USB口。

复制代码
传感器模块MX90614与板子用杜邦线相连
  板子3.3V<->模块VIN
  板子GND<->模块GND
  板子PB10<->模块SCL
  板子PB11<->模块SDA

2.软件工程

打开STM32CubeMX软件,新建工程

Part Number处输入STM32F103C8,再双击就创建新的工程

配置下载口引脚

配置外部晶振引脚

配置系统主频

配置工程文件名,保存路径,KEIL5工程输出方式

生成工程

用Keil5打开工程

添加代码


3.软件主要代码

c 复制代码
//读取环境温度,读取物体表面温度
float SMBus_ReadTemp(void)
{   
	DataTemp=MLX906_ReadInterTemp();//读取环境温度
	DataTemp*=0.02;
	DataTemp-=273.15;//换算成温度值
	WenduZhi=SMBus_ReadMemory(SA, RAM_ACCESS|RAM_TOBJ1)*0.02-273.15;//读取物体表面温度值
	  return (WenduZhi);
}
//ta为环境温度,tf为额温,TBody 为体温,通过额温,环境温度,计算体温
void TF_to_Tbody(void)
{

		float tf_low, tf_high = 0;
		float ta;//环境温度
		float tf;//物体表面温度
		
		ta=DataTemp;
		tf=	WenduZhi;
        if(ta <= TA_LEVEL)
        {
                 tf_low  = 32.66 + 0.186*(ta-TA_LEVEL);
                 tf_high = 34.84 + 0.148*(ta-TA_LEVEL);
        }
        else
        {
                 tf_low  = 32.66 + 0.086*(ta-TA_LEVEL);
                 tf_high = 34.84 + 0.1*(ta-TA_LEVEL);
        }

        if((tf_low <= tf) && (tf <= tf_high))
        {
                 TBody = 36.3 + 0.5/(tf_high - tf_low)*(tf - tf_low);//计算体温
        }

        else if(tf > tf_high)
        {
                 TBody = 36.8 + (0.829321 + 0.002364*ta)*(tf-tf_high);//计算体温
        }

        else if(tf < tf_low)
        {
                 TBody =  36.3 + (0.551658 + 0.021525*ta)*(tf-tf_low);//计算体温
        }
}

main函数代码

c 复制代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,系统主频72M

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
	MX_GPIO_Init();//初始化时钟
	SMBus_Init();//IIC总线引脚初始化
	/* USER CODE BEGIN 2 */
	OLED_Init();//OLED初始化  
	OLED_Clear();//清屏
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		SMBus_ReadTemp();//读取环境温度,表面温度
		TF_to_Tbody();//温度转换成体温
		OLED_Clear();//清屏
   	    OLED_ShowCHinese(18,0,0);//光
		OLED_ShowCHinese(36,0,1);//子
		OLED_ShowCHinese(54,0,2);//物
		OLED_ShowCHinese(72,0,3);//联
		OLED_ShowCHinese(90,0,4);//网
		OLED_ShowCHinese(8,3,5);//红
		OLED_ShowCHinese(24,3,6);//外
		OLED_ShowCHinese(40,3,7);//测
		OLED_ShowCHinese(56,3,8);//温
		OLED_ShowString(80,3,"TEST");//显示字符串
		
    	OLED_ShowCHinese(8,6,8);//温
		OLED_ShowCHinese(24,6,9);//度
		OLED_ShowCHinese(40,6,10);//值
		OLED_ShowString(56,6,":");
		wenduzhengshu=TBody;
		wenduXiaoshu=TBody*10;
		wenduXiaoshu=(wenduXiaoshu)%10;
		OLED_ShowNum(72,6,wenduzhengshu,2,16);//显示整数位
		OLED_ShowString(88,6,".");
		OLED_ShowNum(96,6,wenduXiaoshu,1,16);//显示小数位
		HAL_Delay(1000);//等待1秒
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

4.实验效果

用手指对准红外测温模块,能看到温度上升到体温附近

八.小结

MLX90614红外测温模块,通过探测物体红外辐射能量的大小和波长的分布来检测物体的表面温度。学会用STM32驱动MLX90614,可以广泛的用在额温枪、门禁等人体温度项目。

相关推荐
No0d1es3 小时前
202506 电子学会青少年等级考试机器人五级器人理论真题
单片机·嵌入式硬件·青少年编程·机器人·电子学会·五级·理论综合
范纹杉想快点毕业5 小时前
C 语言主控开发与显控开发能力体系及技术栈详解,STM32、QT、嵌入式、边缘系统显示
stm32·单片机·tcp/ip·microsoft·fpga开发·51单片机·wpf
不会先思考5 小时前
C5.3:发射极偏置和LED驱动电路
嵌入式硬件·模拟电路·三极管·发射极偏置电路·bjt
LJWWD7 小时前
AI小智单片机esps32-s3烧录教程
单片机·嵌入式硬件
szxinmai主板定制专家10 小时前
基于FPGA的热电偶测温数据采集系统,替代NI的产品(二)总体设计方案
arm开发·人工智能·嵌入式硬件·fpga开发
鸭鸭鸭进京赶烤12 小时前
EI检索-学术会议 | 人工智能、虚拟现实、可视化
人工智能·物联网·5g·信息可视化·云计算·vr·信号处理
herderl12 小时前
【无标题】命名管道(Named Pipe)是一种在操作系统中用于**进程间通信(IPC)** 的机制
java·linux·服务器·嵌入式硬件·php
K神14 小时前
Go之封装Http请求和日志
后端·物联网
智者知已应修善业14 小时前
【51单片机数码管循环显示3位数字】2022-10-26
c语言·经验分享·笔记·嵌入式硬件·算法·51单片机
TDengine (老段)15 小时前
TDengine IDMP 基本功能(1.界面布局和操作)
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据