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

文章目录

  • 一.概要
  • 二.MLX90614主要技术指标
  • 三.模块参考原理图
  • 四.模块接线说明
  • 五.模块工作原理介绍
  • 六.模块通讯协议介绍
  • 七.STM32单片机与MLX90614模块实现体温测量实验
  • 1.硬件准备
  • 2.软件工程
  • 3.软件主要代码
  • 4.实验效果
  • 八.小结
  • 一.概要

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

    流程参考代码

    	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.软件主要代码

    //读取环境温度,读取物体表面温度
    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函数代码

    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,可以广泛的用在额温枪、门禁等人体温度项目。

    作者:光子物联单片机

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32传感器模块编程实践(七) MLX90614红外测温模块简介及驱动源码

    发表回复