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

news2024/12/24 0:06:25

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

  • 概述
  • 样品申请
  • 视频教程
  • 参考Demo
  • 引导
  • 温度测量滤波方式
  • 智能识别算法
  • 使用块数据更新(BDU)功能
  • 设置ODR速率
  • 状态寄存器
  • main.c

概述

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

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

样品申请

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

视频教程

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

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

参考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: %02d\r\n", 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 - 运动检测标志位 %d\r\n",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%x\n",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: %02d\r\n", 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 - 运动检测标志位 %d\r\n",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 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875243.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:异常处理:捕获异常,记录异常并响应合话的信息给用户;捕获异常,尝试重新修复

异常处理 1、埔获异常,记录异常并响应合话的信息给用户 public static void main(String[ ] args){ try {test1(); }catch (FileNotFoundException e) {system.out.println("您要找的文件不存在!! ");e.printstackTrace();//打印出这个异常对象的信息。记…

如何运用小程序技术闭环运营链路?

如何通过线上小程序获取用户线索,提高企业抗风险能力,建立有效的营销数字化系统一直是困扰每一个小程序开发者与运营者的问题。 当我们选择使用小程序设计自己的运营流程时,从「推广」到「转化」,再到最终的「留存」都是运营过程…

Grafana Loki

Loki是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。项目受 Prometheus 启发&a…

可组装的模块化开源掌机GameShell,组装起了万千极客的童年

对于热衷于复古游戏及开源掌机的极客玩家来说,开源硬件的普及,让更多极客可以有机会体验到亲手DIY掌机的乐趣,属于开源掌机的圈子也由此应运而生。 由一群复古游戏爱好者组成的Clockwork团队希望更进一步拓展开源掌机的拓展性和自定义性&…

AEM网络助手NSA升级更新-版本大更新

关注过或者使用AEM线缆认证测试的朋友,对于这款8类线认证测试仪不会陌生。 3.0-4.0是一个重大的版本变更,下面我们重点看看那些部分做了升级改动。 1,操作主界面部分,最大的变化的是,颜色对比度大为改动。界面更加协…

rabbitmq的消息应答

消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成 了部分突然它挂掉了,会发生什么情况。RabbitMQ 一旦向消费者传递了一条消息,便立即将该消 息标记为删除。在这种情况下,突然有个消费者挂掉了…

如何保证数据库的数据和Redis的数据一致性

实际项目中有可能会使用Redis缓存数据,那么在更新数据的时候如何保证数据库中的数据和Redis缓存的数据一致,缓存同步策略的选择是一个很重要的问题。网上有各种说法,大概总结有以下几种,看看每种方案是否可行以及存在的问题和适用…

思维导图模板下载网站有哪些?这6个网站优质模板任你选!

信息时代,有效的信息组织和知识管理变得尤其重要。思维导图,作为一种强大的视觉化工具,可以帮助我们整理和理解复杂的信息,提高工作和学习效率。 好的思维导图模板能帮助我们拓展思路、提升美观度、更快地完成思维导图的绘制。今…

【小梦C嘎嘎——启航篇】string介绍以及日常使用的接口演示

【小梦C嘎嘎——启航篇】string 使用😎 前言🙌C语言中的字符串标准库中的string类string 比较常使用的接口对上述函数和其他函数的测试代码演示: 总结撒花💞 😎博客昵称:博客小梦 😊最喜欢的座右…

好用的安卓手机投屏到mac分享

工具推荐:scrcpy github地址:https://github.com/Genymobile/scrcpy/tree/master mac使用方式 安装环境,打开terminal,执行以下命令,没有brew的先安装brew brew install scrcpy brew install android-platform-too…

Mybatis 源码 ① :开篇

文章目录 一、前言二、项目搭建三、自动装配四、总结 一、前言 Mybatis 官网 以及 本系列文章地址: Mybatis 源码 ① :开篇Mybatis 源码 ② :流程分析Mybatis 源码 ③ :SqlSessionMybatis 源码 ④ :TypeHandlerMybat…

ubuntu1804系统ROS1和ROS2一键装机

备忘一下ROS1和ROS2的一键装机 原网址:小鱼的一键安装系列 指令: wget http://fishros.com/install -O fishros && . fishros如果想同时安装ROS1和ROS2, 运行两次. fishros, 工具会自动将ROS1和ROS2放在不同的文件目录下 安装完每次打开终端时, 会提示选择ROS1还是RO…

【Linux】应用层协议

【Linux】应用层协议 文章目录 【Linux】应用层协议1、协议作用1.1 应用层需求1.2 协议分类 2、HTTP & HTTPS2.1 HTTP/HTTPS 简介2.2 HTTP工作原理2.3 HTTPS工作原理2.4 区别 3、URL3.1 编码解码3.2 URI & URL 4、HTTP 消息结构4.1 HTTP请求方法4.2 HTTP请求头信息 5、…

思维导图在线制作,10款好用的思维导图在线制作网站推荐!

思维导图的强大作用在于它以直观、易理解的图形方式展现信息,让复杂的内容变得简单明了,极大地提升了我们的学习和工作效率。与传统的手绘思维导图相比,在线思维导图制作工具更具有灵活性和实用性,它们提供了丰富的功能&#xff0…

00|Java中常见错误或不清楚

00. 多变量声明并初始化 同时声明同类型的多变量 String a "Hello", c "hello"; int x 5, y 5;01. 变量类型 01.0 浮点类型 默认是double类型,如果需要指定float类型,可以float f 1.0F; 01.1 类型装换 如果将大的类型转为…

立秋至 | 共建智慧城,秋日硕果时

一缕缕阳光洒向大地 一股股热浪迎面拂来 一声声虫鸣清脆悦耳 一片片黄叶轻声而落 一份份清凉沁入心间 一个个硕果接踵而至 跟随我们一起来回顾下 往期铭控小伙伴们 在助力建设智慧城市 做了哪些努力呢 都做了哪些项目呢 得到了多少客户的认可呢 Part 1 智慧消防 消防…

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式

关于网络入侵检测领域使用Spark/Flink等计算框架做分布式 0、引言1 基于LightGBM的网络入侵检测研究2 基于互信息法的智能化运维系统入侵检测Spark实现3 基于Spark的车联网分布式组合深度学习入侵检测方法4 基于Flink的分布式在线集成学习框架研究5 基于Flink的分布式并行逻辑回…

【AHB】初识 AHB 总线

AHB 与 APB、ASB同属于 AMBA 总线架构规范,该总线规范由 ARM 公司提出。 目录 一、AHB 总线 二、AHB 总线组成 三、AHB 主从通信过程 一、AHB 总线 AHB(Advanced High Performance Bus),意为高级高性能总线,能将微控制器&…

excel 下载方法封装

1.首先需要拿到后端返回的URL下载地址 2.写个下载方法 // url 接口返回的下载地址。例如:https://cancer-research.oss-cn-beijing.aliyuncs.com/yuance-platform-permission/校内共享数据导入模板.xlsx // name 文件名称 例如: 校内共享数据导入模板 /…

Pytorch安装教程:最新保姆级教程

目录 概述 重要的事情说三遍:不需要装cuda、不需要装cuda、不需要装cuda 1.查看自己NVIDIA版本 2.创建一个conda 环境 3.安装pytorch 本文意在帮助即将步入深入学习领域的学子 在这之前首先你需要安装好anaconda,不懂的可以下面这篇文章 最新Anaco…