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

107 篇文章 56 订阅
63 篇文章 3 订阅

概述

STHS34PF80是一款高性能的红外(IR)传感器,特别适用于检测存在感和运动。其主要特点是高灵敏度,能在没有透镜的情况下探测到4米远的物体(尺寸为70 x 25厘米),并配有集成的硅红外滤波器。这款传感器能够区分静止和移动物体,并具有80°的视场角。它出厂时已校准,且设计为低功耗,包含用于提高探测效果的智能算法。
其应用范围广泛,不仅包括存在感和接近感应、报警/安全系统、智能家居、智能照明、物联网、智能储物柜和智能墙板,还特别适用于检测人体的存在。由于其高灵敏度和精确度,它能够有效地用于人体检测,如在安保系统中探测潜在的入侵者,或在智能家居系统中监测房间内的人员动态。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。
在这里插入图片描述

视频教学

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

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

样品申请

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

完整代码下载

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

主要特点

高灵敏度探测: 专为探测红外线的存在和运动设计,具有高灵敏度。
探测范围: 能够在没有透镜的情况下,探测到70 x 25厘米大小的物体,最远达4米。
集成硅红外滤波器: 通过滤除非红外波长,确保精确探测。
静态和运动物体探测: 能够检测到静止和移动的物体。
视场角: 提供80°的视场角。
出厂校准: 出厂即校准,保证了即插即用的可靠性和准确性。
低功耗设计: 设计注重能效,确保低能耗。
嵌入式智能算法: 用于提升存在感和运动探测的效果。

在这里插入图片描述

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板:
在这里插入图片描述

接口

STHS34PF80模块接口的示意图如下所示,支持IIC或者SPI通讯。
在这里插入图片描述

最小系统图

在这里插入图片描述

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。
配置时钟树,配置时钟为32M。
在这里插入图片描述

串口配置

查看原理图,PB6和PB7设置为开发板的串口。

在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

在这里插入图片描述

配置IIC为快速模式,速度为400k。
在这里插入图片描述

CS设置

STS34PF80IO设置如下所示。
在IIC模式下CS需要给个高电平。
在这里插入图片描述

官方提供IIC接线如下所示。

在这里插入图片描述
在这里插入图片描述
设置PC0为输出口。
在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB
在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}
/* USER CODE END PFP */

参考案例

https://github.com/STMicroelectronics/sths34pf80-pid

获取ID

参考例程序中对应的获取ID驱动程序,如下所示。

在这里插入图片描述

获取ID可以查看0x0F,读出来的值应该为0xD3。

在这里插入图片描述

对应的获取ID驱动程序,如下所示。

	printf("??????????");
	
	HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);		
	
	uint8_t whoami;
	sths34pf80_lpf_bandwidth_t lpf_m, lpf_p, lpf_p_m, lpf_a_t;

	/* Initialize mems driver interface */
	dev_ctx.write_reg = platform_write;
	dev_ctx.read_reg = platform_read;
	dev_ctx.handle = &SENSOR_BUS;



	/* Wait sensor boot time */
	platform_delay(BOOT_TIME);

	/* Check device ID */
	sths34pf80_device_id_get(&dev_ctx, &whoami);
	printf("STHS34PF80_ID=0x%x,whoamI=0x%x\n",STHS34PF80_ID,whoami);
	if (whoami != STHS34PF80_ID)
		while(1);		

温度测量滤波方式

首先需要设置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]: 这个设置位用于选择目标温度的平均值滤波样本数以及与之相关的噪声水平。

在这里插入图片描述

在这里插入图片描述

对象温度的平均值数量 (sths34pf80_avg_tobject_num_set 函数): 这个函数设置用于测量对象温度的平均值数量。参数 val 可以是多种不同的值,例如 AVG_TMOS_2, AVG_TMOS_8, AVG_TMOS_32, 等等,表示不同的平均值数量。这些设置影响传感器输出的平滑程度和响应速度,高的平均值数量会增加输出数据的平滑度,但也可能增加响应时间。

环境温度的平均值数量 (sths34pf80_avg_tambient_num_set 函数): 类似地,这个函数设置环境温度测量的平均值数量。参数 val 可以是 AVG_T_8, AVG_T_4, AVG_T_2, AVG_T_1 等,用于设置不同的平均值数量。这也会影响传感器输出的平滑程度和响应速度。

在你提供的代码段中,使用了 STHS34PF80_AVG_TMOS_32 和 STHS34PF80_AVG_T_8 作为参数,分别用于设置对象温度和环境温度的平均值数量。这意味着传感器会对对象温度使用32个数据点的平均值,对环境温度使用8个数据点的平均值。这样的设置有助于在传感器的测量中实现一定程度的数据平滑和过滤噪声,同时保持适当的响应速度。

  /* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
  sths34pf80_avg_tobject_num_set(&dev_ctx, STHS34PF80_AVG_TMOS_32);
  sths34pf80_avg_tambient_num_set(&dev_ctx, 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(&dev_ctx, &lpf_m);
  sths34pf80_lpf_p_bandwidth_get(&dev_ctx, &lpf_p);
  sths34pf80_lpf_p_m_bandwidth_get(&dev_ctx, &lpf_p_m);
  sths34pf80_lpf_a_t_bandwidth_get(&dev_ctx, &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);

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

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。
连续更新模式(BDU = ‘0’):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。
块数据更新(BDU)模式(BDU = ‘1’):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。
简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。

在这里插入图片描述

案例也是设置了BDU。
BDU在CTRL1 (20h)寄存器中。

在这里插入图片描述

  /* Set BDU */
  sths34pf80_block_data_update_set(&dev_ctx, 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速率。

在这里插入图片描述

这里设置速率为8Hz。

  /* Set ODR */
  sths34pf80_odr_set(&dev_ctx, STHS34PF80_ODR_AT_8Hz);	

获取状态

STATUS (地址为0x23U) 用于表示传感器的状态。
drdy(1位):这个位用于指示数据就绪(Data Ready)状态。当传感器有新的数据可供读取时,这个位会被设置。

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_drdy_status_t status;
  sths34pf80_func_status_t func_status;

  sths34pf80_drdy_status_get(&dev_ctx, &status);
  if (status.drdy)
  {
    sths34pf80_func_status_get(&dev_ctx, &func_status);

    printf("TAmbient Shock: %d - Presence: %d - Motion: %d\r\n",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
 }		

    /* USER CODE END WHILE */

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

测试结果

在未有人的情况下。

在这里插入图片描述

在人体纯在情况下。

在这里插入图片描述

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
S32K144UART是一种常见的串行通信接口,它支持中断接收功能。在使用S32K144UART中断接收时,需要进行以下步骤: 1. 初始化UART:首先,需要对S32K144UART进行初始化,包括设置波特率、数据位、停止位、校验位等参数。可以使用相关的寄存器来配置UART的控制寄存器和状态寄存器。 2. 使能中断:在初始化完UART后,需要使能中断功能。通过设置相关的中断使能寄存器,可以选择开启接收中断。 3. 编写中断服务程序:接下来,需要编写中断服务程序来处理接收中断。当UART接收到数据时,会触发接收中断,此时中断服务程序会被执行。在中断服务程序中,可以通过相关的寄存器来获取接收到的数据,并进行后续的处理操作。 4. 清除中断标志:在中断服务程序中,需要及时清除接收中断的标志位,以便下一次接收中断正确触发。可以通过相关的寄存器来清除接收中断的标志位。 5. 中断优先级设置:如果系统中存在多个中断,需要设置不同中断的优先级,以确保高优先级中断能够及时响应。可以通过设置相关的中断优先级寄存器来进行设置。 总结:使用S32K144UART中断接收,需要先进行UART的初始化配置,然后使能中断功能,并编写中断服务程序来处理接收中断。同时,需要注意清除中断标志位和设置中断优先级,以确保中断的正确触发和响应。这样,就可以实现S32K144UART的中断接收功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值