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

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

3天内不再提示

基于STM32CUBEMX驱动TMOS模块STHS34PF80(2)----驱动STHS34PF80进行人体检测

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-12-01 15:29 次阅读

概述

STHS34PF80 是一款非冷却、工厂校准的红外运动和存在检测传感器,工作波长在 5 µm 至 20 µm 之间。STHS34PF80 传感器设计用于测量视野内物体发出的红外辐射量。该信息ASIC 进行数字处理,可以对其进行编程以监控运动、存在或过热状况。
本章主要驱动STHS34PF80,进行人体检测。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。
在这里插入图片描述

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

视频教程

https://www.bilibili.com/video/BV18z4y1g7BA/

完整代码下载

https://download.csdn.net/download/qq_24312945/88216813

参考Demo

https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/sths34pf80_STdC/examples/sths34pf80_tmos_data_polling.c

引导

在设备上电后,它会执行一个2.5毫秒的引导过程,将校准系数从嵌入式闪存下载到内部寄存器,并加载AVG_TRIM(10h)、CTRL0(17h)和SENS_DATA(1Dh)寄存器的默认内容。在引导时间内,设备的寄存器不可访问。
引导完成后,设备会自动配置为电源关闭模式。
在上电后,可以通过将CTRL2(21h)寄存器的BOOT位设置为1,重新启动引导过程,以重新加载上述寄存器的默认值。不需要切换设备电源线。
在重新启动时间内,设备的寄存器不可访问。重新启动完成后,设备会自动配置为之前的操作模式,并且BOOT位会自动清除为0。

在这里插入图片描述

温度测量滤波方式

首先需要设置AVG_TRIM (10h) 寄存器用于配置温度平均值滤波的参数,以控制环境温度和目标温度测量的平滑度和稳定性。在温度测量中,可能会受到噪声和干扰的影响,这可能导致短期内测量值的波动。通过应用平均值滤波,可以平滑这些波动,从而得到更加稳定的温度数据。AVG_TRIM 寄存器中的设置会决定平均值滤波的级别,从而影响滤波的时间常数以及平滑度。
这里默认参数如下

  1. 在AVG_TRIM(10h)寄存器中写入02h // AVG_T = 8,AVG_TMOS = 32
  2. 在CTRL1(20h)寄存器中写入07h // ODR = 15 Hz
    在这里插入图片描述

AVG_T[1:0]: 这个设置位用于选择环境温度的平均值滤波样本数。
AVG_TMOS[2:0]: 这个设置位用于选择目标温度的平均值滤波样本数以及与之相关的噪声水平。
在这里插入图片描述

参考demo中将AVG_TMOS [2:0] 和AVG_T[1:0] 分为了2个函数进行操作。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

修改后操作如下所示。

/**
  * @brief  Select number of averages for object temperature.[set]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      AVG_TMOS_2, AVG_TMOS_8, AVG_TMOS_32, AVG_TMOS_128, AVG_TMOS_256, AVG_TMOS_512, AVG_TMOS_1024, AVG_TMOS_2048,
  * @retval          interface status (MANDATORY: return 0 - > no Error)
  *
  */
uint8_t sths34pf80_avg_tobject_num_set(uint8_t add, sths34pf80_avg_tobject_num_t val)
{
  sths34pf80_avg_trim_t avg_trim;
  int32_t ret;
  ret = sths34pf80_read_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);

  if (ret == HAL_OK)
  {
    avg_trim.avg_tmos = ((uint8_t)val & 0x7U);
    ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
  }

  return ret;
}
/**
  * @brief  Select number of averages for ambient temperature.[set]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      AVG_T_8, AVG_T_4, AVG_T_2, AVG_T_1,
  * @retval          interface status (MANDATORY: return 0 - > no Error)
  *
  */
uint8_t sths34pf80_avg_tambient_num_set(uint8_t add, sths34pf80_avg_tambient_num_t val)
{
  sths34pf80_avg_trim_t avg_trim;
  int32_t ret;
  ret = sths34pf80_read_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
  if (ret == HAL_OK)
  {
    avg_trim.avg_t = ((uint8_t)val & 0x3U);
    ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);		
	}		


  return ret;
}

使用如下所示,这里设置参数为STHS34PF80_AVG_TMOS_32和STHS34PF80_AVG_T_8。

/* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
  sths34pf80_avg_tobject_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_TMOS_32);
  sths34pf80_avg_tambient_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_T_8);

智能识别算法

STHS34PF80嵌入了智能数字算法,以支持以下三种检测模式:
• 存在检测
• 运动检测
• 环境温度冲击检测
这些算法分别使用不同的低通滤波器(LPF_P、LPF_M和LPF_A_T)。此外,存在和运动检测算法使用另一个共同的低通滤波器(LPF_P_M)。这些滤波器用于生成中间信号(TPRESENCE、TMOTION和TAMB_SHOCK),可以用于对算法本身进行微调。这些滤波器的截止频率值可以通过它们各自的位范围进行配置,这些位范围可以在LPF1(0Ch)和LPF2(0Dh)寄存器中找到,如下所示。
在这里插入图片描述

寄存器LPF1 (0Ch)和LPF2 (0Dh)如下所示。

在这里插入图片描述

案例中只是对滤波器进行了读取以及打印。
在这里插入图片描述

修改后如下所示。

/* read filters */
  sths34pf80_lpf_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_m);
  sths34pf80_lpf_p_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p);
  sths34pf80_lpf_p_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p_m);
  sths34pf80_lpf_a_t_bandwidth_get(STHS34PF80_ADDRESS, &lpf_a_t);

printf("lpf_m: %02d, lpf_p: %02d, lpf_p_m: %02d, lpf_a_t: %02drn", lpf_m, lpf_p, lpf_p_m, lpf_a_t);
	![在这里插入图片描述](https://img-blog.csdnimg.cn/5321efc1d74b42098bac6a940073f89b.png)

使用块数据更新(BDU)功能

如果读取输出数据的时机与数据准备信号不同步,强烈建议在CTRL1(20h)寄存器中将BDU(块数据更新)位设置为1。
此功能可以避免读取与不同采样相关的寄存器值(输出数据的最高和最低字节)。
在这里插入图片描述

案例也是设置了BDU。
在这里插入图片描述

BDU在CTRL1 (20h)寄存器中。
在这里插入图片描述

修改后的操作如下所示。

/* Set BDU */
  sths34pf80_block_data_update_set(STHS34PF80_ADDRESS, 1);

设置ODR速率

初始化完毕之后需要通过CTRL1(20h)寄存器中的ODR[3:0]位范围选择其中一种操作模式(连续模式),或者在CTRL2(21h)寄存器中将ONE_SHOT位设置为1(单次触发模式)。
在这里插入图片描述

当配置了寄存器LPF1 (0Ch)和LPF2 (0Dh) 的LPF_P、LPF_M和LPF_A_T、LPF_P_M滤波器之后,可以去设置ODR速率。
在这里插入图片描述

这里设置速率为30HZ。

/* Set ODR */
  sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_30Hz);

状态寄存器

初始化完毕之后,可以通过状态寄存器STATUS (23h)获取DRDY标志位。数据就绪信号由STATUS寄存器的DRDY位表示。当新的数据可用时,此位被设置为1,并在读取FUNC_STATUS(25h)寄存器后被清除。
在这里插入图片描述

主程序中会去获取改状态位,若为1,则代表数据已经准备完毕,可以进行获取和打印。
在这里插入图片描述

FUNC_STATUS(25h)主要检测三个标志位:PRES_FLAG、MOT_FLAG 和 TAMB_SHOCK_FLAG,这些标志位用于检测不同类型的事件。
PRES_FLAG是存在检测标志位。当存在检测到人员存在时,此位变为1。
MOT_FLAG:运动检测标志位。当检测到运动时,此位变为1。
TAMB_SHOCK_FLAG:环境温度冲击检测标志位。当检测到环境温度冲击时,此位变为1。

在这里插入图片描述

修改完毕主程序如下所示。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    sths34pf80_tmos_drdy_status_get(STHS34PF80_ADDRESS, &status);
    if (status.drdy)
    {
      sths34pf80_tmos_func_status_get(STHS34PF80_ADDRESS, &func_status);
			printf("-- >环境温度冲击检测标志位 %d - 存在检测标志位 %d - 运动检测标志位 %drn",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
   }
			HAL_Delay(1000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

main.c

/* USER CODE BEGIN 2 */
  sths34pf80_lpf_bandwidth_t lpf_m, lpf_p, lpf_p_m, lpf_a_t;	
  sths34pf80_tmos_drdy_status_t status;	
  sths34pf80_tmos_func_status_t func_status;	
	
	
	
	
			HAL_Delay(200);	
	printf("123");
	uint8_t STHS34PF80_ID =STHS34PF80_getChipID(STHS34PF80_ADDRESS);
	printf("STHS34PF80_ID=0x%xn",STHS34PF80_ID);	
	if (STHS34PF80_ID != 0xD3)
    while(1);
/* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
  sths34pf80_avg_tobject_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_TMOS_2048);
  sths34pf80_avg_tambient_num_set(STHS34PF80_ADDRESS, STHS34PF80_AVG_T_8);

  /* read filters */
  sths34pf80_lpf_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_m);
  sths34pf80_lpf_p_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p);
  sths34pf80_lpf_p_m_bandwidth_get(STHS34PF80_ADDRESS, &lpf_p_m);
  sths34pf80_lpf_a_t_bandwidth_get(STHS34PF80_ADDRESS, &lpf_a_t);

printf("lpf_m: %02d, lpf_p: %02d, lpf_p_m: %02d, lpf_a_t: %02drn", lpf_m, lpf_p, lpf_p_m, lpf_a_t);
	
	  /* Set BDU */
  sths34pf80_block_data_update_set(STHS34PF80_ADDRESS, 1);

  /* Set ODR */
  sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_1Hz);

    int32_t cnt = 0;
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    sths34pf80_tmos_drdy_status_get(STHS34PF80_ADDRESS, &status);
    if (status.drdy)
    {
      sths34pf80_tmos_func_status_get(STHS34PF80_ADDRESS, &func_status);
			printf("-- >环境温度冲击检测标志位 %d - 存在检测标志位 %d - 运动检测标志位 %drn",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
   }
			HAL_Delay(1000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

审核编辑:汤梓红

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

    关注

    2545

    文章

    50411

    浏览量

    750792
  • 模块
    +关注

    关注

    7

    文章

    2654

    浏览量

    47282
  • 寄存器
    +关注

    关注

    31

    文章

    5284

    浏览量

    119780
  • 人体检测
    +关注

    关注

    1

    文章

    16

    浏览量

    11163
收藏 人收藏

    评论

    相关推荐

    基于STM32CUBEMX驱动TMOS模块STHS34PF80(1)----获取ID

    STHS34PF80 是一款非冷却、工厂校准的红外运动和存在检测传感器,工作波长在 5 µm 至 20 µm 之间。
    的头像 发表于 12-01 15:28 8061次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(1)----获取ID

    基于STM32CUBEMX驱动TMOS模块STHS34PF80(3)----修改检测阈值

    用于配置和设置 STHS34PF80 传感器的一些参数,以便进行存在检测和运动检测
    的头像 发表于 12-01 15:30 649次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(3)----修改<b class='flag-5'>检测</b>阈值

    基于STM32CUBEMX驱动TMOS模块STHS34PF80(4)----中断获取信号

    SHS34PF80的数据准备信号提供了一种机制,允许设备在新的测量数据可读取时通知系统,并触发同步操作,通过正确配置相关寄存器,可以确保系统及时捕获和处理来自设备的新数据,从而提高整体性能和响应能力。
    的头像 发表于 12-01 15:31 6208次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(4)----中断获取信号

    基于STM32CUBEMX驱动TMOS模块STHS34PF80(5)----配置嵌入式函数

    STHS34PF80传感器项目种修改 Arduino 脚本,重新移植到STM32的MCU中。
    的头像 发表于 12-01 15:33 716次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(5)----配置嵌入式函数

    基于STM32CUBEMX驱动TMOS模块STHS34PF80(6)----获取状态数据

    STHS34PF80传感器项目种修改 Arduino 脚本,重新移植到STM32的MCU中。 该项目基于STHS34PF80 IR温度传感器,能够检测环境和物体温度,并且在最大4米范
    的头像 发表于 12-01 15:39 588次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(6)----获取状态数据

    STHS34PF80高灵敏度红外感应器(2)----InfraredPD存在感应检测

    InfraredPD 主要作用是通过与 STHS34PF80 红外传感器配合,提供对存在感应和运动检测的支持,同时对传感器获取的物体温度数据进行环境温度变化补偿。InfraredPD库通过
    的头像 发表于 10-14 11:10 709次阅读
    <b class='flag-5'>STHS34PF80</b>高灵敏度红外感应器(<b class='flag-5'>2</b>)----InfraredPD存在感应<b class='flag-5'>检测</b>

    通过STEVAL-MKI109V3在unico上识别不到STHS34PF80是为什么?怎么处理?

    TMOS测试:通过STEVAL-MKI109V3在unico上识别不到STHS34PF80
    发表于 03-26 08:31

    意法半导体发布新型人体存在和移动检测芯片

    ‍‍‍‍‍‍‍‍意法半导体发布新型人体存在和移动检测芯片。STHS34PF80是一款带有微加工热敏晶体管(TMOS)的高集成度、超低功耗的红外(IR)传感器,可取代传统的被动红外(PI
    的头像 发表于 07-28 15:13 846次阅读

    意法半导发布了新型人体存在和移动检测芯片:STHS34PF80

    近期,意法半导发布了新型人体存在和移动检测芯片:STHS34PF80,它是一款带有微加工热敏晶体管(TMOS)的高集成度、超低功耗的红外(IR)传感器,可取代传统的被动红外(PIR)传
    的头像 发表于 07-30 09:47 1648次阅读

    ST TMOS热敏红外传感器: 精准检测人员存在和移动

    意法半导发布新型人体存在和移动检测芯片。STHS34PF80是一款带有微加工热敏晶体管(TMOS)的高集成度、超低功耗的红外(IR)传感器,可取代传统的被动红外(PIR)传感技术,提升
    发表于 08-08 14:48 564次阅读

    ST最新一代高灵敏度 STHS34PF80人体感应检测方案

    ST TMOS传感器在人体检测方面的优势,给智能产品带来了那些创新和解决了现有产品的哪些技术痛点,以及它的技术原理和应用。 TMOS传感器是基于ST专有的MEMS技术,用于测量5~20um红外波长
    的头像 发表于 12-06 15:33 1095次阅读
    ST最新一代高灵敏度 <b class='flag-5'>STHS34PF80</b><b class='flag-5'>人体</b>感应<b class='flag-5'>检测</b>方案

    STHS34PF80人体存在传感器(1)----获取人体存在状态

    STHS34PF80是一款高性能的红外(IR)传感器,特别适用于检测存在感和运动。其主要特点是高灵敏度,能在没有透镜的情况下探测到4米远的物体(尺寸为70 x 25厘米),并配有集成的硅红外滤波器
    的头像 发表于 01-09 15:51 546次阅读
    <b class='flag-5'>STHS34PF80</b><b class='flag-5'>人体</b>存在传感器(1)----获取<b class='flag-5'>人体</b>存在状态

    e2studio开发STHS34PF80人体存在传感器(1)----获取人体存在状态

    STHS34PF80是一款高性能的红外(IR)传感器,特别适用于检测存在感和运动。其主要特点是高灵敏度,能在没有透镜的情况下探测到4米远的物体(尺寸为70 x 25厘米),并配有集成的硅红外滤波器
    的头像 发表于 01-09 16:00 530次阅读
    e<b class='flag-5'>2</b>studio开发<b class='flag-5'>STHS34PF80</b><b class='flag-5'>人体</b>存在传感器(1)----获取<b class='flag-5'>人体</b>存在状态

    基于ST 红外传感器STHS34PF80 搭配菲涅尔透镜针对投影机应用方案

    STHS34PF80 是一款红外线感测器,可用于侦测静止和移动物体的存及超温条件。它采用独特的 TMOS 技术测量物体的红外线辐射,当物体位于视野内时检测其存在或移动。
    的头像 发表于 01-30 14:16 817次阅读
    基于ST 红外传感器<b class='flag-5'>STHS34PF80</b> 搭配菲涅尔透镜针对投影机应用方案

    STHS34PF80高灵敏度红外感应器(1)----获取人体存在状态

    STHS34PF80是一款高性能的红外(IR)传感器,特别适用于检测存在感和运动。其主要特点是高灵敏度,能在没有透镜的情况下探测到4米远的物体(尺寸为70 x 25厘米),并配有集成的硅红外滤波器
    的头像 发表于 10-14 10:36 216次阅读
    <b class='flag-5'>STHS34PF80</b>高灵敏度红外感应器(1)----获取<b class='flag-5'>人体</b>存在状态