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

news2024/11/16 21:54:24

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

  • 概述
  • 视频教学
  • 样品申请
  • 参考Demo
  • 参考程序获取数据
  • 获取数据标志位
  • 使用数据准备就绪信号
  • 嵌入式智能数字算法的输出数据
  • 主程序

概述

STHS34PF80传感器项目种修改 Arduino 脚本,重新移植到STM32的MCU中。
该项目基于STHS34PF80 IR温度传感器,能够检测环境和物体温度,并且在最大4米范围内检测存在和运动。有一个Arduino脚本,显示如何为基本环境和物体温度测量配置传感器,并如何配置嵌入式功能算法,并使用它们检测存在和运动。脚本允许连续或一次性模式,允许更改低通滤波器和检测阈值以实现各种检测行为。脚本利用内嵌的中断引擎来检测温度数据的就绪状态,以及通知存在和运动事件。
本节将在上节代码中继续配置,通过获取模块的状态标志位来检测是否有人体存在。
最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。
在这里插入图片描述

视频教学

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

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

样品申请

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

参考Demo

hthttps://github.com/kriswiner/STHS34PF80/tree/main

参考程序获取数据

在这里插入图片描述

获取数据标志位

使用状态寄存器(STATUS,地址为23h)来检查何时有新的数据集可用。这里的数据集可能包括多种数据输出:物体温度、环境温度,以及可能的其他几个由嵌入式智能算法生成的输出(如存在检测、动作检测和环境温度冲击检测)。

在这里插入图片描述

参考文档设置如下所示。

在这里插入图片描述

修改如下。

/**
  * @brief  获取DRDY
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */	
	
uint8_t STHS34PF80_getDataReadyStatus(uint8_t add)
{
	uint8_t temp = 0;//STHS34PF80_STATUS->0x23
	sths34pf80_read_reg(add, STHS34PF80_STATUS, (uint8_t *)&temp, 1);

   return temp;
  }	

使用数据准备就绪信号

FUNC_STATUS 寄存器(地址为25h)是一个只读寄存器,它包含了设备的嵌入式智能算法的状态标志。

在这里插入图片描述

PRES_FLAG: 这是一个存在检测标志。当检测到存在时,此位变为1;当没有检测到存在时,此位变回0。默认值为0。
(0: 没有检测到存在;1: 检测到存在)
MOT_FLAG: 这是一个运动检测标志。当检测到运动时,此位变为1;当没有检测到运动时,此位变回0。默认值为0。
(0: 没有检测到运动;1: 检测到运动)
TAMB_SHOCK_FLAG: 这是一个环境温度冲击检测标志。当检测到环境温度冲击时,此位变为1;当没有检测到环境温度冲击时,此位变回0。默认值为0。
(0: 没有检测到环境温度冲击;1: 检测到环境温度冲击)

在这里插入图片描述

参考文档设置如下所示。

在这里插入图片描述

获取代码如下所示。

/**
  * @brief  清零DRDY
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */
uint8_t STHS34PF80_getFuncStatus(uint8_t add)
{
	uint8_t temp = 0;//STHS34PF80_FUNC_STATUS->0x25
	sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&temp, 1);

   return temp;
  }

嵌入式智能数字算法的输出数据

在4.5.4节中,描述了嵌入式智能数字算法的输出数据。这些数据包括存在检测、运动检测和环境冲击检测的输出数据,分别发送到TPRESENCE_H (3Bh) 和 TPRESENCE_L (3Ah) 寄存器,TMOTION_H (3Dh) 和 TMOTION_L (3Ch) 寄存器,以及 TAMB_SHOCK_H (3Fh) 和 TAMB_SHOCK_L (3Eh) 寄存器。
这些数据没有内在的物理意义,只是嵌入式智能数字算法用来断言相应的标志。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
获取代码如下所示。

/**
  * @brief  					嵌入式智能数字算法产生的存在检测输出数据
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */	
	

int16_t STHS34PF80_readPresence(uint8_t add)
{
	uint8_t rawData[2];  //STHS34PF80_TPRESENCE_L->0x3A
	sths34pf80_read_reg(add, STHS34PF80_TPRESENCE_L, (uint8_t *)&rawData[0], 2);	

	return (int16_t)(((int16_t)rawData[1]) << 8 | rawData[0]);			
  }

/**
  * @brief  					嵌入式智能数字算法产生的运动检测输出数据
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */	
int16_t STHS34PF80_readMotion(uint8_t add)
{
	uint8_t rawData[2];  //STHS34PF80_TMOTION_L->0x3C
	sths34pf80_read_reg(add, STHS34PF80_TMOTION_L, (uint8_t *)&rawData[0], 2);	

	return (int16_t)(((int16_t)rawData[1]) << 8 | rawData[0]);				

  }

/**
  * @brief  					嵌入式智能数字算法产生的环境冲击输出数据
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */	
int16_t STHS34PF80_readAmbShock(uint8_t add)
{
	uint8_t rawData[2]; //STHS34PF80_TAMB_SHOCK_L->0x3E
	sths34pf80_read_reg(add, STHS34PF80_TAMB_SHOCK_L, (uint8_t *)&rawData[0], 2);	

	return (int16_t)(((int16_t)rawData[1]) << 8 | rawData[0]);			

  }	

4.5.3节中提供了一个简单的例子,展示了如何从传感器获取物体温度数据(以最低有效位LSB表示)并将其转换为摄氏度°C。
该例子的过程也适用于获取环境温度数据。

在这里插入图片描述

代码如下所示。

/**
  * @brief  
  *
  * @param  add      视场内对象发出的红外辐射量(未补偿)
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */	
int16_t STHS34PF80_readObjTemp(uint8_t add)
{
	uint8_t rawData[2];  //STHS34PF80_TOBJECT_L->0x26
	sths34pf80_read_reg(add, STHS34PF80_TOBJECT_L, (uint8_t *)&rawData[0], 2);	

	return (int16_t)(((int16_t)rawData[1]) << 8 | rawData[0]);	
  }

4.5.2节描述了如何获取环境温度数据,并在哪些寄存器中这些数据可以被找到。
寄存器存储:环境温度数据被发送到TAMBIENT_H(29h)和TAMBIENT_L(28h)寄存器中。其中,TAMBIENT_H存储了环境温度值的最高有效字节(MSB),而TAMBIENT_L存储了最低有效字节(LSB)。
数据格式:通过拼接TAMBIENT_H和TAMBIENT_L,可以得到完整的环境温度输出数据。这个值被表示为一个16位的有符号二进制补码数字。
单位转换:每个环境温度输出样本可以通过一个灵敏度值(在这个例子里是100 LSB/°C)来转换成摄氏度。公式如下:

在这里插入图片描述

应用场景:环境温度数据代表了与设备热耦合的环境的实际温度。这些数据可用于校正由于与传感器热耦合的环境温度变化而导致的物体温度输出数据的变化(详见4.6节)。

在这里插入图片描述

代码如下所示。

/**
  * @brief  
  *
  * @param  add      环境温度数据
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */		
	
	
int16_t STHS34PF80_readAmbTemp(uint8_t add)
{
	uint8_t rawData[2];//STHS34PF80_TAMBIENT_L->0x28
	sths34pf80_read_reg(add, STHS34PF80_TAMBIENT_L, (uint8_t *)&rawData[0], 2);	

   return (int16_t)(((int16_t)rawData[1]) << 8 | rawData[0]);
}

补偿后的物体温度数据存储在TOBJ_COMP_L(38h)和TOBJ_COMP_H(39h)寄存器中。其中,TOBJ_COMP_H包含最高有效字节(MSB),TOBJ_COMP_L包含最低有效字节(LSB)。
需要注意的是,即使补偿算法处于活动状态,26h和27h寄存器中仍然包含原始物体温度数据。如果补偿没有激活,38h和39h寄存器会与26h和27h寄存器对齐。
补偿后的物体温度数据(以LSB为单位)与使用的光学系统的透射率成比例。您可以通过实际的灵敏度值来转换这些补偿后的数据,以获得相应的摄氏度值。不过,这些补偿后的数据并不实际代表视场内物体的温度。
如果启用了增益减小功能(见第4.7节),则不能启用嵌入式补偿算法。

在这里插入图片描述

代码如下所示。

/**
  * @brief  					嵌入式智能数字算法产生的视场内物体发射的红外辐射量输出数据(已经经过环境温度补偿)
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */		
int16_t STHS34PF80_readCompObjTemp(uint8_t add)
{
	uint8_t rawData[2];//STHS34PF80_TOBJ_COMP_L->0x38
	sths34pf80_read_reg(add, STHS34PF80_TOBJ_COMP_L, (uint8_t *)&rawData[0], 2);	

	return (int16_t)(((int16_t)rawData[1]) << 8 | rawData[0]);		
  }	
	

主程序

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
//		printf("PA7=%d",HAL_GPIO_ReadPin  ( GPIOA, GPIO_PIN_7));
//		if(HAL_GPIO_ReadPin  ( GPIOA, GPIO_PIN_7))
//		{
		
			status = STHS34PF80_getDataReadyStatus(STHS34PF80_ADDRESS);		
		
			if(FUNCTIONS) 
			{		
				funcstatus = STHS34PF80_getFuncStatus(STHS34PF80_ADDRESS);				
				if(funcstatus & 0x04) printf("(存在)Presence detected !\n");
				if(funcstatus & 0x02) printf("(运动)Motion detected !\n");
				if(funcstatus & 0x01) printf("(环境温度冲击)T Shock detected !\n");				
			}
		
			if(status & 0x04)   // when data ready		
			{
				Presence = STHS34PF80_readPresence(STHS34PF80_ADDRESS);//嵌入式智能数字算法产生的存在检测输出数据
				Motion =   STHS34PF80_readMotion(STHS34PF80_ADDRESS); // 嵌入式智能数字算法产生的运动检测输出数据
				AmbTemp =  STHS34PF80_readAmbTemp(STHS34PF80_ADDRESS);//环境温度数据
				ObjTemp =  STHS34PF80_readObjTemp(STHS34PF80_ADDRESS);//视场内对象发出的红外辐射量(未补偿)
				CompObjTemp =  STHS34PF80_readCompObjTemp(STHS34PF80_ADDRESS);//嵌入式智能数字算法产生的视场内物体发射的红外辐射量输出数据(已经经过环境温度补偿)				
				AmbShock = STHS34PF80_readAmbShock(STHS34PF80_ADDRESS);//嵌入式智能数字算法产生的环境冲击输出数据

				printf("(原始数据)Raw counts\n");
				printf("(视场内对象发出的红外辐射量(未补偿))STHS34PF80 ObjTemp = %d\n",ObjTemp);  
				printf("(视场内物体发射的红外辐射量输出(经过环境温度补偿))STHS34PF80 Compensated ObjTemp = %d\n",CompObjTemp);  				
				printf("(环境温度)STHS34PF80 AmbTemp = %d\n",AmbTemp);  
				printf("(存在检测)STHS34PF80 Presence = %d\n",Presence);  
				printf("(运动检测输出)STHS34PF80 Motion = %d\n",Motion);  
				printf("(环境冲击输出)STHS34PF80 AmbShock = %d\n",AmbShock);  

				printf("(环境温度)STHS34PF80 Ambient Temperature = %.2f\n",(float)(AmbTemp) / 100.0f); //环境温度数据
				printf("(对象温度)STHS34PF80 Object Temperature = %.2f\n",((float)(ObjTemp) / (float)(ObjSense) ) ); 
	
			}
		
//		}			
		
		
		HAL_Delay(1000);		
				
    /* USER CODE END WHILE */

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

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

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

相关文章

PAT 1127 ZigZagging on a Tree

个人学习记录&#xff0c;代码难免不尽人意。 Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine t…

Experience Design(XD)软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Experience Design&#xff08;XD&#xff09;是Adobe公司开发的一款用户体验设计工具&#xff0c;广泛应用于网页设计、移动应用设计、交互设计等领域。以下是XD软件的主要特点和功能&#xff1a; 界面设计&#xff1a;XD提供…

android2022配置opencv4android480

1&#xff0c;安装android studio2022。 2&#xff0c;下载OPENCV4ANDROID&#xff0c;解压到任意盘中。 3&#xff0c;File->New->New Project&#xff0c;选择Empty Views Activity。再选择语言&#xff0c;本文选择JAVA。 4&#xff0c;File->New->Import Modu…

白嫖idea

白嫖idea 地址 https://www.jetbrains.com/toolbox-app/

Spark中join和cogroup

笔者最近在复习spark&#xff0c;发现对cogroup算子掌握不牢固。因此写下这篇博客&#xff0c;方便以后学习。 join算子 join算子相当于将两个rdd进行内连接&#xff0c;在join的结果中&#xff0c;返回值是key和元组 cogroup算子 cogroup算子相当于将两个rdd中 相同键的每…

LeetCode538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树 文章目录 [538. 把二叉搜索树转换为累加树](https://leetcode.cn/problems/convert-bst-to-greater-tree/)一、题目二、题解方法一&#xff1a;递归&#xff08;中序遍历与节点更新&#xff09;方法二&#xff1a;反向中序遍历与累加更新&#x…

作业人员护目镜佩戴自动识别

作业人员护目镜佩戴自动识别通过pythonyolo深度学习算法模型&#xff0c;作业人员护目镜佩戴自动识别利用布设摄像头并结合图像算法能够实时监测作业人员是否佩戴护目镜。一旦发现未佩戴的情况立即发出警告&#xff0c;并及时记录异常情况。在YOLOv1提出之前&#xff0c;R-CNN系…

iPhone手机如何删除照片应用程序的文稿与数据

场景&#xff1a;iPhone使用多年&#xff08;穷没钱换新的&#xff09;照片视频一直没有删除&#xff0c;最近打开微信提示空间不足&#xff0c;删除100多G照片后&#xff0c;照片应用程序的文稿与数据仍然100G没有变化。 不想重置手机&#xff0c;处理方法如下&#xff0c;PC端…

.netcore发布独立版部署

.NetCore 在发布独立版时会打包独立环境&#xff0c;就算服务没有安装环境也能运行&#xff0c;这就是.NetCore跨平台的特性之一。 按照微软的传统配套&#xff0c;c#开发的项目一般都是发布打包程序部署在iis&#xff0c;但是.netcore 跨平台的&#xff0c;就是说当发布独立版…

全栈之前端 | 2.CSS3基础知识之选择器学习

关注回复【学习交流群】加入【安全开发运维】答疑交流群 请朋友们【多多点击文中的广告】&#xff0c;支持作者更新更多文章。 目录: 0x00 前言简述 Q: 选择器是什么&#xff1f; 你也许已经见过选择器了。CSS 选择器是 CSS 规则的第一部分。它是元素和其他部分组合起来告诉浏览…

Sping源码(七)— 后置处理器(自定义后置处理器)

上一篇中简单介绍了Spring中invokeBeanFactoryPostProcessors方法的执行流程&#xff0c;以及BFPP和BDRPP类的介绍&#xff0c;这篇文章我们来自定义实现一个类的后置处理器。 自定义PostProcessor 自定义PostProcessor的方式一共两种&#xff0c;都是根据invokeBeanFactoryPo…

SM2(国密)非对称(公钥私钥)在线加密解密

SM2(国密)非对称(公钥私钥)在线加密/解密/生成密钥对

【mq】如何保证消息可靠性

文章目录 mq由哪几部分组成rocketmqkafka 为什么需要这几部分nameserver/zookeeper可靠性 broker可靠性 生产者消费者 mq由哪几部分组成 rocketmq kafka 这里先不讨论Kafka Raft模式 比较一下&#xff0c;kafka的结构和rocketmq的机构基本上一样&#xff0c;都需要一个注册…

2023 江苏省研究生数学建模 A 题思路

2023年江苏省研究生数学建模科研创新实践大赛A题新型抗癌药物研究模型探索靶向治疗是治疗肿瘤疾病的一种重要方法&#xff0c;它具有针对性强、疗效显著等特点。现有的靶向药物通常针对特定的基因突变靶点&#xff0c;容易出现耐药性。目前&#xff0c;一种由癌症诱发的血管新生…

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介…

Go 使用 Gorm 将操作信息集成到链路跟踪 Jaeger,进行增删改查使用举例,并做可视化UI界面展示(附源码)

Go 使用 Gorm 将操作信息集成到链路跟踪 Jaeger,进行增删改查使用举例(附源码)。 为了增强程序的可观测性,方便问题定位,在发起数据库操作请求时我们也可以调用代码统一集成链路跟踪的能力,Jaeger 是当今比较流行的选择。使用 Gorm 来将操作信息集成到 Jaeger 中。 全面…

Gazebo GPU加速【gzserver running in GPU】

文章目录 Gazebo GPU加速1. 问题2. 解决办法2.1 本机运行 2.2 headless3. 补充3.1 如何确定的Gazebo为OpenGL渲染3.2 显卡驱动--no-opengl-files3.3 nouveau Gazebo GPU加速 1. 问题 Gazebo仿真帧率极低&#xff0c;fps在10以下&#xff0c;同时显卡驱动已安装&#xff0c;但…

WebRTC之FEC前向纠错协议

FEC前向纠错用于丢包恢复&#xff0c;对媒体包进行异或或其他算法生成冗余包进行发送。如果接收端出现丢包&#xff0c;可以通过冗余包恢复出原始的媒体包。FEC的代价是增加码率带宽&#xff0c;所以一般会根据网络状况、丢包率来动态调整FEC冗余系数&#xff0c;也会结合NACK/…

mtk8175添加一款camera(GC5035)流程

说明&#xff1a; 在MTK平台添加一款新的Camera IC 需要如下三个步骤&#xff1a; device目录下面添加相关宏定义。 kernel目录下面添加dts配置&#xff0c;即硬件管脚、时钟、电源、I2C等的配置和 添加相关的驱动。 vendor 目录下面添加相关的效果文件。 下面是自己在MTK…

在Java8的forEach()中使用break/continue

今天在开发中&#xff0c;使用forEach()来遍历元素执行业务操作&#xff0c;发现如果判断不符合某个条件时就要continue&#xff0c;不能继续向后执行了。但是在forEach()中不能使用for循环中的continue和break&#xff0c;那改如何退出呢&#xff1f; 答案是&#xff1a;使用…