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

2023-08-16 12:10:37

概述

STHS34PF80传感器项目种修改 Arduino 脚本,重新移植到STM32的MCU中。
该项目基于STHS34PF80 IR温度传感器,能够检测环境和物体温度,并且在最大4米范围内检测存在和运动。有一个Arduino脚本,显示如何为基本环境和物体温度测量配置传感器,并如何配置嵌入式功能算法,并使用它们检测存在和运动。脚本允许连续或一次性模式,允许更改低通滤波器和检测阈值以实现各种检测行为。脚本利用内嵌的中断引擎来检测温度数据的就绪状态,以及通知存在和运动事件。
总的来说,这是一个有趣的项目,使用STHS34PF80 IR温度传感器进行存在和运动检测,适用于各种应用,从环境和物体温度监测到人员和动物计数。该项目已经有一个功能强大的Arduino脚本作为起点,适合任何有兴趣使用这个传感器的人进一步开发和测试。
传感器的内置智能数字算法。该传感器具有三种不同的检测模式:存在检测、运动检测和环境温度冲击检测,通过配置嵌入式函数寄存器,来实现嵌入式函数的参数调整。
最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。
在这里插入图片描述

视频教学

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

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

样品申请

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

视频教程

参考Demo

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

参考Demo

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

完整代码下载

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

内嵌函数地址

STHS34PF80传感器中的内嵌功能寄存器。这些寄存器可用于配置内嵌算法,用于补偿物体温度中的环境温度变化,以及内嵌的智能数字算法。

在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。
在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

在这个应用中,STS34PF80模块通过I2C(IIC)接口与主控器通信。具体来说,STS34PF80模块的I2C引脚连接到主控器的PB6(引脚B6)和PB7(引脚B7)两个IO口。
在这里插入图片描述

配置IIC为普通模式,速度为100k。

在这里插入图片描述

IO口设置

STS34PF80IO设置如下所示。
在IIC模式下CS需要给个高电平。
在这里插入图片描述
官方提供IIC接线如下所示。
在这里插入图片描述
在这里插入图片描述
需要把PA8配置为输出模式,默认高电平,配置PA7为输入模式。
在这里插入图片描述

串口重定向

打开魔术棒,勾选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 */

参考程序初始化

在这里插入图片描述

IIC写函数

STHS34PF80地址为101 1010(0x5A),如果是写操作,那么具体的地址为1011 0100(0xB4)。

/**
  * @brief  读取数据
  *
  * @param  add   模块地址
  * @param  reg   寄存器地址
  * @param  data  buffer 缓冲区
  * @param  len   读取长度
  * @retval ret   正常返回HAL_OK
  *
  */
uint8_t sths34pf80_read_reg(uint8_t add,uint8_t reg,  uint8_t * data, uint8_t len)
{
	uint8_t ret;
	ret=HAL_I2C_Mem_Read(&hi2c1 ,(add<<1)|1,reg,I2C_MEMADD_SIZE_8BIT,data,len,0xffff);

	return ret;
}

IIC读函数

STHS34PF80地址为101 1010(0x5A),如果是读操作,那么具体的地址为1011 0101(0xB5)。

/**
  * @brief  写入数据
  *
  * @param  add   模块地址
  * @param  reg   寄存器地址
  * @param  data  buffer 缓冲区
  * @param  len   写入长度
  * @retval ret   正常返回HAL_OK
  *
  */
uint8_t sths34pf80_write_reg(uint8_t add,uint8_t reg, uint8_t * data, uint8_t len)
{
		uint8_t ret;
		HAL_I2C_Mem_Write(&hi2c1 ,(add<<1)|0,reg,I2C_MEMADD_SIZE_8BIT,data,len,0xffff);
	return ret;

}

获取ID

参考例程序中对应的获取ID驱动程序,如下所示。
在这里插入图片描述

获取ID可以查看0x0F,读出来的值应该为0xD3。
在这里插入图片描述

读取函数如下所示。

/**
  * @brief  获取设备ID
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */

uint8_t STHS34PF80_getChipID(uint8_t add)
{
  uint8_t temp[1]={0};
	sths34pf80_read_reg(add,STHS34PF80_WHO_AM_I,temp,1);
  return temp[0];
}

驱动如下所示。

	uint8_t STHS34PF80_ID = STHS34PF80_getChipID(STHS34PF80_ADDRESS);  // Read CHIP_ID register for STHS34PF80
	printf("STHS34PF80_ID=0x%x\n",STHS34PF80_ID);	

设备的自动引导过程和关机模式配置

在设备上电后,它会执行一个2.5毫秒的引导过程,将校准系数从嵌入式闪存下载到内部寄存器,并加载AVG_TRIM(10h)、CTRL0(17h)和SENS_DATA(1Dh)寄存器的默认内容。在引导过程中,设备的寄存器是不可访问的。
在这里插入图片描述

引导完成后,设备会自动配置为关机模式。在上电后,通过将CTRL2(21h)寄存器的BOOT位设置为1,可以重新启动引导过程,以重新加载上述寄存器的默认值。无需对设备的电源线进行切换操作。
在重新引导过程中,设备的寄存器是不可访问的。重新引导完成后,设备会自动配置为先前的工作模式,并且BOOT位会自动清零为0。

在这里插入图片描述
在这里插入图片描述
修改后如下所示。

/**
  * @brief  传感器重置
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */

uint8_t STHS34PF80_reset(uint8_t add)
{
  uint8_t temp = 0;
	int32_t  ret;
	//STHS34PF80_CTRL2->0x21
	ret=sths34pf80_read_reg(add,STHS34PF80_CTRL2,  (uint8_t *)&temp, 1);
	if (ret == HAL_OK)
  {
		temp=temp | 0x80;
		ret = sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);// set bit 7 to force device reset, wait 2.5 ms for reboot
	
	}
	HAL_Delay(3);
  return ret;	
}

省电模式

下面文本描述了关机模式的使用和功能。关机模式是一种休眠模式,用于将传感器设备置于休眠状态,从而节省功耗。在关机模式下,设备停止数据采集,并且大部分内部模块都被关闭,以最小化电流消耗。这使得传感器在供电的情况下能够实现最低的功耗水平。

尽管设备处于关机模式,但它仍保持 I²C / SPI 通信串口处于活动状态,以便能够与设备进行通信和配置设置。关机模式下,配置寄存器的内容被保留,而输出数据寄存器不会更新,这意味着在进入关机模式前,最后一次采样的数据将保留在内存中。
为了进入关机模式并避免在重新进入连续模式时读取错误的输出数据,文本提供了正确的步骤。然而,这些步骤在你的问题中并未提供,因此无法给出完整的步骤。

在这里插入图片描述
上面文档主要对0x25,0x23,0x20寄存器进行操作,其中读取0x25多次,主要功能是对STATUS (23h)的DRDY进行清0。
查看下面表格也可以得知,有多种操作可以对STATUS (23h)的DRDY 清零,其中读取FUNC_STATUS (25h)可以清零DRDY。
在这里插入图片描述

其中0x20是配置速率寄存器。
在这里插入图片描述
参考文档提供的关闭电源代码如下所示。
在这里插入图片描述

修改后如下。

void STHS34PF80_powerDown(uint8_t add)
{

	uint8_t stat = 0;
	//STHS34PF80_FUNC_STATUS->0x25
	STHS34PF80_ReadByte(add,STHS34PF80_FUNC_STATUS);	// This is done to reset the DRDY bit of the STATUS (23h) register to 0

		
	//STHS34PF80_STATUS->0x23	
	stat=STHS34PF80_ReadByte(add,STHS34PF80_STATUS);	
  while( (stat & 0x04) )
  {
		stat=STHS34PF80_ReadByte(add,STHS34PF80_STATUS);	
    HAL_Delay(1);
  } // wait for STATUS DR bit --> 0	
	uint8_t temp=0;
	//STHS34PF80_CTRL1->0x20
	temp=STHS34PF80_ReadByte(add,STHS34PF80_CTRL1);	
	STHS34PF80_WriteByte(add,STHS34PF80_CTRL1, temp & ~(0x07));//  set bits 0 - 3 to 0 to power downt
 	//STHS34PF80_FUNC_STATUS->0x25
	STHS34PF80_ReadByte(add,STHS34PF80_FUNC_STATUS);	// reset DR bit of STATUS to 

}

温度数据的灵敏度值

τ 表示光学系统在操作波长范围内的透射率(取值范围从0到1),SENSITIVITY DEFAULT 是对象温度数据的默认灵敏度值(通常约为2000 LSB/°C)。默认的灵敏度值是通过使用黑体覆盖传感器的全视场而无需光学元件(即,τ = 1)进行每个单元的校准获得的。
透射率的变化可能会影响传感器的读数,因此在有光学元件的情况下使用传感器时,可能需要根据透射率调整或考虑灵敏度。
在这里插入图片描述

可以读取SENS_DATA (1Dh)寄存器进行获取。
在这里插入图片描述
参考代码如下所示。
在这里插入图片描述

修改后如下。

/**
  * @brief  获取设备灵敏度
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */


int16_t  STHS34PF80_readSenseData(uint8_t add)
{
   uint8_t temp = 0;
	int32_t  ret;	
	//STHS34PF80_SENS_DATA->0x1D
	ret = sths34pf80_read_reg(add, STHS34PF80_SENS_DATA, (uint8_t *)&temp, 1);

	return (int16_t)((int16_t)temp << 8 | 0x00);
}

主程序打印保存的数值。

   // 获取设备灵敏度
		ObjSense = (STHS34PF80_readSenseData(STHS34PF80_ADDRESS) / 16) + 2048;
		printf("Object Sense Data (LSB/oC) =%d \n",ObjSense)

设置低通滤波器

配置低通滤波器可以通过LPF1 (0Ch)和LPF2 (0Dh)进行配置。
在这里插入图片描述

STHS34PF80内置嵌入式算法,设备具有三种嵌入式的检测模式,包括存在检测、运动检测和环境温度冲击检测。
每种算法使用不同的低通滤波器 (LPF_P, LPF_M 和 LPF_A_T)。存在和运动检测算法还共同使用另一个低通滤波器 (LPF_P_M)。这些滤波器用于生成中间信号 (TPRESENCE, TMOTION 和 TAMB_SHOCK),可以用来微调算法本身。
在这里插入图片描述
下面分别是存在检测和运动检测的框图。
在这里插入图片描述
在这里插入图片描述

参考文档设置如下所示。

在这里插入图片描述

修改如下。

/**
  * @brief  设置低通滤波器
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */
uint8_t STHS34PF80_setLowpassFilters(uint8_t add,uint8_t lpf_P, uint8_t lpf_M, uint8_t lpf_PM, uint8_t lpf_Tshock)
{
	int32_t  ret;	
	uint8_t LPF1,LPF2;
	LPF1=lpf_PM << 3 | lpf_M;
	LPF2=lpf_P  << 3 | lpf_Tshock;
	//STHS34PF80_LPF1->0x0C
	ret = sths34pf80_write_reg(add, STHS34PF80_LPF1, (uint8_t *)&LPF1, 1);
	if(ret==HAL_OK)
	{	//STHS34PF80_LPF2->0x0D
		ret=sths34pf80_write_reg(add, STHS34PF80_LPF2, (uint8_t *)&LPF2, 1);
	
	}		
	return ret;	 

 }

温度测量滤波方式

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

在这里插入图片描述

之后需要去设置温度范围,CTRL0 (17h)主要用于配置设备的增益,以适应不同的操作温度范围。具体的增益设置将决定设备可以工作的温度范围。
值000表示宽模式(wide mode)。
值111表示默认增益模式(default gain mode)。

在这里插入图片描述

查看下表得知,当房间和传感器温度差别不大时候,可以设置默认增益模式。
在这里插入图片描述
设置中断可以通过CTRL3 (22h)寄存器来配置。
这个寄存器为系统提供了有关设备当前状态的关键信息,可以用于驱动其他逻辑或触发相应的操作,如中断服务例程。例如,PRES_FLAG可用于确定是否有人进入了一个区域,MOT_FLAG可以用于检测人体是否运动,TAMB_SHOCK_FLAG可能用于环境监控系统以捕捉突然的温度变化。

在这里插入图片描述
通过查看FUNC_STATUS (25h)可以得知,PRES_FLAG为存在检测,MOT_FLAG为运动检测,TAMB_SHOCK_FLAG为环境温度冲击检测标志。

在这里插入图片描述

通过配置CTRL3 (22h)寄存器的IEN[1:0] 可以设置输出模式。
IEN[1:0]位在CTRL3寄存器中,它定义了应该将哪种信号路由到INT管脚(即中断输出):
00:INT管脚处于高阻态。
01:将DRDY(数据已准备好的信号)路由到INT管脚。
10:将INT_OR信号路由到INT管脚。
参考程序配置如下。

在这里插入图片描述

修改后如下所示。

/**
  * @brief  设置温度测量滤波方式
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */


uint8_t STHS34PF80_config(uint8_t add,uint8_t avgt, uint8_t avgtmos,  uint8_t gain, bool functions)
{
	int32_t	ret;
	uint8_t temp;
	uint8_t	AVG_TRIM;
	AVG_TRIM	= avgt << 4 |  avgtmos;
	//STHS34PF80_AVG_TRIM->0x10//设置滤波样本数
	ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&AVG_TRIM, 1);	
		
	if(ret==HAL_OK)
	{//STHS34PF80_CTRL0->0x17//设置温度增益
		sths34pf80_read_reg(add, STHS34PF80_CTRL0, (uint8_t *)&temp, 1);	
		temp=temp | gain << 4;
		ret = sths34pf80_write_reg(add, STHS34PF80_CTRL0, (uint8_t *)&temp, 1);	
		// Configure interrupt behavior
		// select active HIGH (bit 7 == 0), push-pull (bit 6 == 0), pulsed mode (bit 2 == 0)	
		temp=0x01;//STHS34PF80_CTRL3->0x22
		ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&temp, 1);	
		temp=0x3A;//0011 1010
//  if(functions) _i2c_bus->writeByte(STHS34PF80_ADDRESS, STHS34PF80_CTRL3, 0x32 ); // configure INT_OR for either Presence or Motion detection
		if(functions)
			ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&temp, 1);		
		
	}
	return ret;	 	
}

写入嵌入式函数

嵌入式函数写操作如下所示。
在这里插入图片描述

案例实现如下。

在这里插入图片描述

CTRL2 (21h)如下所示,对FUNC_CFG_ACCESS设置为1主要是开启访问内嵌函数寄存器。

在这里插入图片描述
寄存器PAGE_RW (11h)的FUNC_CFG_WRITE标志位置为为1,启用嵌入式函数的写过程。
在这里插入图片描述

	/************开启嵌入式函数读写************/	
	uint8_t temp ;	//STHS34PF80_CTRL2->0x21
	sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);		 
	temp = 	temp | 0x10;//STHS34PF80_CTRL2->0x21 //开启嵌入式函数访问
	sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);//允许访问嵌入式函数寄存器
	temp = 	0x40;	//STHS34PF80_FUNC_PAGE_RW->0x11 //开启嵌入式函数写操作
	sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);	//允许写入嵌入函数寄存器	

寄存器FUNC_CFG_ADDR (08h)为配置嵌入式函数的地址,FUNC_CFG_DATA (09h)为传入数据到嵌入式函数中。

在这里插入图片描述

这里传入的地址addr为STHS34PF80_PRESENCE_THS,这是个15位的寄存器,PRESENCE_THS 寄存器(地址范围为 0x20 到 0x21)主要用于存在检测算法的存在阈值设置。存在检测算法用于判断是否存在某种状态或条件,通常与传感器测量数据相关。
具体解释如下:
存在阈值(Presence Threshold): 这是一个用于存在检测算法的阈值。阈值定义了在测量数据中何时认为存在某种条件。在这里,阈值是一个 15 位的无符号整数(范围在 0 到 32767 之间)。
默认值: 预设的存在阈值默认值是 200(0x00C8)。
在这里插入图片描述

	/************设置存在阈值************/
	temp = 	STHS34PF80_PRESENCE_THS_L;//STHS34PF80_FUNC_CFG_ADDR->0x08	嵌入式地址PRESENCE_THS (20h - 21h) 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为PRESENCE_THS_L
	temp =presence_ths ;//STHS34PF80_FUNC_CFG_DATA->0x09
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入低字节	 
	temp = 	STHS34PF80_PRESENCE_THS_H;//STHS34PF80_FUNC_CFG_ADDR->0x08  嵌入式地址PRESENCE_THS (20h - 21h)			 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为PRESENCE_THS_H
	temp = presence_ths>>8;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入高字节	 	 

MOTION_THS (22h - 23h) 这个寄存器用于设置运动检测算法的阈值。在实际应用中,你可能需要读取或设置这个寄存器,以调整或查看运动检测算法的阈值。如果值过高,可能会导致运动检测不灵敏;而值过低则可能会导致误报。这个值的范围从0到32767。默认值是200。
在这里插入图片描述

	/************设置运动阈值************/	 
	temp = 	STHS34PF80_MOTION_THS_L;//嵌入式地址MOTION_THS (22h - 23h)	 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为MOTION_THS_L
	temp = 	motion_ths ;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入低字节	 
	temp = 	STHS34PF80_MOTION_THS_H;//嵌入式地址MOTION_THS (22h - 23h)		 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为MOTION_THS_H
	temp = 	motion_ths >>8;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入高字节	 

TAMB_SHOCK_THS (24h - 25h)这个寄存器是用来设置环境温度震荡检测算法的阈值。简而言之,当环境温度突然变化到某一程度时(超过这个设定的阈值),系统可能会认为发生了一个"温度震荡"事件。这是一个15位的无符号整数。这意味着它的范围是0到32767。
在这里插入图片描述

	/************设置环境温度冲击阈值************/	 
	temp = 	STHS34PF80_TAMB_SHOCK_THS_L;//嵌入式地址TAMB_SHOCK_THS (24h - 25h) 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为TAMB_SHOCK_THS_L
	temp = 	tamb_shock_ths ;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入低字节	 
	temp = 	STHS34PF80_TAMB_SHOCK_THS_H;//嵌入式地址TAMB_SHOCK_THS (24h - 25h)		 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为TAMB_SHOCK_THS_H
	temp = 	tamb_shock_ths >>8;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入高字节	 

HYST_PRESENCE (27h)这个寄存器是用来设置存在检测算法的滞后配置值。滞后(hysteresis)在很多传感器应用中是一个重要的概念,它可以帮助减少由于小的或暂时的输入变化而导致的输出频繁切换。简而言之,滞后会为传感器的读数提供一定的"容差",只有当输入值超过了这个容差范围时,输出才会发生变化。这是一个8位的无符号整数,所以它的范围是0到255,默认值是32。

在这里插入图片描述

	/************设置存在滞后值************/	 
	temp = 	STHS34PF80_HYST_PRESENCE;//嵌入式地址HYST_PRESENCE (27h)
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为HYST_PRESNCE
	temp = 	presence_hyst;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入1字节	

HYST_MOTION (26h)这个寄存器用于设置运动检测算法的滞后配置值。这是一个8位的无符号整数,所以它的范围是0到255,默认值是32。

在这里插入图片描述

	/************设置运动滞后值************/	 
	temp = 	STHS34PF80_HYST_MOTION;//嵌入式地址HYST_MOTION (26h)
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为HYST_MOTION
	temp = 	motion_hyst;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入1字节	

ALGO_CONFIG (28h)寄存器用于配置和调整算法的行为,包括中断脉冲模式、温度补偿和存在检测算法的绝对值选择。适当的配置可以使算法更适合特定应用的需求。
INT_PULSED: 当设置为1时,算法产生的标志会在INT引脚上脉冲输出(高电平持续ODR定义的时间)。默认值为0。
0: 锁存模式
1: 脉冲模式
COMP_TYPE: 启用内置线性算法,用于在物体温度中补偿环境温度变化。默认值为0。
0: 禁用
1: 启用
SEL_ABS: 在存在检测算法中选择绝对值。默认值为0。
0: 不应用绝对值
1: 应用绝对值

在这里插入图片描述
这里设置为脉冲输出模式,将算法中断设置为脉冲模式(位3 = 1)。

// set algorithm interrupt to pulsed mode (bit 3 = 1) or latch mode (bit 3 = 0)	
	/************设置脉冲模式************/	
	temp = 	STHS34PF80_ALGO_CONFIG;//嵌入式地址ALGO_CONFIG (28h)
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为ALGO_CONFIG
	temp = 	0x08;		
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//写入0x08(位3)使能脉冲模式

最后关闭嵌入式写操作。

	/************关闭嵌入式函数读写************/	
	temp = 	0x00;//STHS34PF80_FUNC_PAGE_RW->0x11 //关闭嵌入式函数写
	sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为STHS34PF80_FUNC_PAGE_RW
	//STHS34PF80_CTRL2->0x21 //读取CTRL2 (21h)
	sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);		
	temp = temp & ~(0x10);		//STHS34PF80_CTRL2->0x21 //清除FUNC_CFG_ACCESS
	sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);

读取嵌入式函数

嵌入式函数读操作如下所示。
在这里插入图片描述
案例实现如下。
在这里插入图片描述

CTRL2 (21h)如下所示,对FUNC_CFG_ACCESS设置为1主要是开启访问内嵌函数寄存器。

在这里插入图片描述
寄存器PAGE_RW (11h)的FUNC_CFG_READ标志位置为为1,启用嵌入式函数的读过程。

在这里插入图片描述

  uint8_t rawData[2] = {0, 0};  // register data stored here	
	uint8_t temp ;	//STHS34PF80_CTRL2->0x21
	sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);	
	temp = 	temp | 0x10;//STHS34PF80_CTRL2->0x21 //开启嵌入式函数访问
	sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);//允许访问嵌入式函数寄存器	
	temp = 	0x20;	//STHS34PF80_FUNC_PAGE_RW->0x11 //开启嵌入式函数读操作
	sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);	//允许写入嵌入函数寄存器

寄存器FUNC_CFG_ADDR (08h)为配置嵌入式函数的地址,FUNC_CFG_DATA (09h)为传入数据到嵌入式函数中。
在这里插入图片描述

这里传入的地址addr为STHS34PF80_PRESENCE_THS,这是个15位的寄存器,PRESENCE_THS 寄存器(地址范围为 0x20 到 0x21)主要用于存在检测算法的存在阈值设置。存在检测算法用于判断是否存在某种状态或条件,通常与传感器测量数据相关。
在这里插入图片描述

	/************读取存在阈值************/
	temp = 	STHS34PF80_PRESENCE_THS_L;//嵌入式地址PRESENCE_THS (20h - 21h)		 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为PRESENCE_THS_L
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);	
	temp = 	STHS34PF80_PRESENCE_THS_H;//嵌入式地址PRESENCE_THS (20h - 21h)	
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为PRESENCE_THS_H	
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);		
	dest[0]  =  (uint16_t)(((uint16_t)rawData[1]) << 8 | rawData[0]);

MOTION_THS (22h - 23h) 这个寄存器用于设置运动检测算法的阈值。在实际应用中,你可能需要读取或设置这个寄存器,以调整或查看运动检测算法的阈值。如果值过高,可能会导致运动检测不灵敏;而值过低则可能会导致误报。这个值的范围从0到32767。默认值是200。
在这里插入图片描述

/************读取运动阈值************/	 
	temp = 	STHS34PF80_MOTION_THS_L;//嵌入式地址MOTION_THS (22h - 23h)	 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为MOTION_THS_L
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);	
	temp = 	STHS34PF80_MOTION_THS_H;//嵌入式地址MOTION_THS (22h - 23h)		 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为MOTION_THS_H
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);		
  dest[1]  =  (uint16_t)(((uint16_t)rawData[1]) << 8 | rawData[0]);

TAMB_SHOCK_THS (24h - 25h)这个寄存器是用来设置环境温度震荡检测算法的阈值。简而言之,当环境温度突然变化到某一程度时(超过这个设定的阈值),系统可能会认为发生了一个"温度震荡"事件。这是一个15位的无符号整数。这意味着它的范围是0到32767。

在这里插入图片描述

	/************读取环境温度冲击阈值************/	 
	temp = 	STHS34PF80_TAMB_SHOCK_THS_L;//嵌入式地址TAMB_SHOCK_THS (24h - 25h) 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为TAMB_SHOCK_THS_L
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);	
	temp = 	STHS34PF80_TAMB_SHOCK_THS_H;	//嵌入式地址TAMB_SHOCK_THS (24h - 25h) 		 
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为TAMB_SHOCK_THS_H
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);	
	dest[2]  =  (uint16_t)(((uint16_t)rawData[1]) << 8 | rawData[0]);

HYST_MOTION (26h)这个寄存器用于设置运动检测算法的滞后配置值。这是一个8位的无符号整数,所以它的范围是0到255,默认值是32。

在这里插入图片描述

	/************读取运动滞后值************/	 
	temp = 	STHS34PF80_HYST_MOTION;//嵌入式地址HYST_MOTION (26h)
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为HYST_MOTION
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);	

HYST_PRESENCE (27h)这个寄存器是用来设置存在检测算法的滞后配置值。滞后(hysteresis)在很多传感器应用中是一个重要的概念,它可以帮助减少由于小的或暂时的输入变化而导致的输出频繁切换。简而言之,滞后会为传感器的读数提供一定的"容差",只有当输入值超过了这个容差范围时,输出才会发生变化。这是一个8位的无符号整数,所以它的范围是0到255,默认值是32。

在这里插入图片描述

	/************读取存在滞后值************/	 
	temp = 	STHS34PF80_HYST_PRESENCE;//嵌入式地址HYST_PRESENCE (27h)
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为HYST_PRESNCE
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);	 
  dest[3]  =  (uint16_t)(((uint16_t)rawData[1]) << 8 | rawData[0]);  

ALGO_CONFIG (28h)寄存器用于配置和调整算法的行为,包括中断脉冲模式、温度补偿和存在检测算法的绝对值选择。适当的配置可以使算法更适合特定应用的需求。
INT_PULSED: 当设置为1时,算法产生的标志会在INT引脚上脉冲输出(高电平持续ODR定义的时间)。默认值为0。
0: 锁存模式
1: 脉冲模式
COMP_TYPE: 启用内置线性算法,用于在物体温度中补偿环境温度变化。默认值为0。
0: 禁用
1: 启用
SEL_ABS: 在存在检测算法中选择绝对值。默认值为0。
0: 不应用绝对值
1: 应用绝对值

在这里插入图片描述

这里设置为脉冲输出模式,将算法中断设置为脉冲模式(位3 = 1)。

// set algorithm interrupt to pulsed mode (bit 3 = 1) or latch mode (bit 3 = 0)	
	/************读取脉冲模式************/	
	temp = 	STHS34PF80_ALGO_CONFIG;//嵌入式地址ALGO_CONFIG (28h)
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为ALGO_CONFIG
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);	

HYST_TAMB_SHOCK (29h)寄存器用于设置环境温度突变检测算法的滞后配置值。滞后(hysteresis)在传感器应用中很常见,用于防止小范围、暂时的信号变化而导致的输出频繁切换。通过为传感器的读数提供一个“容差”,滞后确保只有当输入值超出这个容差范围时,输出才会发生变化。这是一个8位的无符号整数,意味着它的范围是0到255。

在这里插入图片描述

	/************读取环境温度滞后值************/	 
	temp = 	STHS34PF80_HYST_TAMB_SHOCK;//嵌入式地址HYST_TAMB_SHOCK (29h)
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为HYST_TAMB_SHOCK
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);	
  dest[4]  =  (uint16_t)(((uint16_t)rawData[1]) << 8 | rawData[0]);

最后关闭嵌入式写操作。

	/************设置中断模式************/	
	temp = 	0x00;//STHS34PF80_FUNC_PAGE_RW->0x11 //关闭嵌入式函数写
	sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为STHS34PF80_FUNC_PAGE_RW
	//STHS34PF80_CTRL2->0x21 //读取CTRL2 (21h)
	sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);		
	temp = temp & ~(0x10);		//STHS34PF80_CTRL2->0x21 //清除BOOT和ONE_SHOT
	sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);

重置模块

当更改与算法相关的参数或滤波器的截止频率,或当启用/禁用嵌入式补偿算法时,需要按照上述步骤重置算法。这个过程涉及进入掉电模式、更改算法配置、启用和禁用嵌入式功能寄存器的访问和写操作,并在最后的步骤中设置所需的输出数据速率或触发单次采集。
在这里插入图片描述
在这里插入图片描述

/**
  * @brief  重置STHS34PF80传感器内置的算法
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */ 
void STHS34PF80_resetAlgo(uint8_t add)
{
	uint8_t temp ;	 //STHS34PF80_CTRL2->0x21 //读取CTRL2 (21h)
	sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);		 
	temp= temp | 0x10;//STHS34PF80_CTRL2->0x21 //开启嵌入式函数访问
	sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);//允许访问嵌入式函数寄存器	 
	temp = 	0x40;	//STHS34PF80_FUNC_PAGE_RW->0x11 //开启嵌入式函数写操作
	sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);	//允许写入嵌入函数寄存器	 	 

	temp = 	STHS34PF80_RESET_ALGO;//嵌入式地址STHS34PF80_RESET_ALGO (2Ah)	
	sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);	//设置嵌入式寄存器地址为STHS34PF80_RESET_ALGO
	temp = 0x01;
	sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//设置ALGO_ENABLE_RESET位	

	temp = 	0x00;//STHS34PF80_FUNC_PAGE_RW->0x11 //关闭嵌入式函数写
	sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);//设置嵌入式寄存器地址为STHS34PF80_FUNC_PAGE_RW
	//STHS34PF80_CTRL2->0x21 //读取CTRL2 (21h)
	sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);		
	temp = temp & ~(0x10);		//STHS34PF80_CTRL2->0x21 //清除FUNC_CFG_ACCESS
	sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);	

 }

最后第九步需要设置BDU速率。

在这里插入图片描述

/**
  * @brief  关闭低功耗,进入正常模式,设置ODR
  *
  * @param  add      设备地址
  * @param  val      设备ID.
  * @retval ret   		正常返回HAL_OK
  *
  */
uint8_t STHS34PF80_powerUp(uint8_t add,uint8_t odr) 
{
	uint8_t temp = 0;	
	int32_t  ret;		//STHS34PF80_CTRL1->0x20
	ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&temp, 1);
	temp=temp | 0x10 | odr;//  set bdu = 1 (bit 4 == 1) and odr
	if(ret==HAL_OK)
		ret = sths34pf80_write_reg(add, STHS34PF80_CTRL1, (uint8_t *)&temp, 1);
	return ret; 

}

清零DRDY

可以通过读取0x25,主要功能是对STATUS (23h)的DRDY进行清0。
查看下面表格也可以得知,有多种操作可以对STATUS (23h)的DRDY 清零。

在这里插入图片描述

/**
  * @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;
  }
更多推荐

【案例教学】华为云API对话机器人的魅力—体验AI垃圾分类机器人

云服务、API、SDK,调试,查看,我都行阅读短文您可以学习到:人工智能AI自言语言的情感分析、文本分词、文本翻译1IntelliJIDEA之API插件介绍API插件支持VSCodeIDE、IntelliJIDEA等平台、以及华为云自研CodeArtsIDE,基于华为云服务提供的能力,帮助开发者更高效、便捷的搭建应用。

现在全国融资融券两融利率最低是多少?哪家证券公司券商费率低?

融资融券是指投资者通过向券商借入资金(融资)或借入证券(融券),以达到获得更高收益、降低交易风险、提高资金利用效率的目的。通过融资,投资者可以用借入的资金买入更多的证券;通过融券,投资者可以借入证券卖出并借入现金,以期待股票或证券价格下跌后再回购并归还借入的证券,获得差价收益。融资融券是证券市场中的一种融资方式和交易策

SpringMVC学习|JSON讲解、Controller返回JSON数据、Jackson、JSON乱码处理、FastJson

JSON讲解JSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。在JavaS

【案例教学】华为云API图像搜索ImageSearch的快捷性—AI帮助您快速归类图片

云服务、API、SDK,调试,查看,我都行阅读短文您可以学习到:人工智能AI同类型的相片合并归类1IntelliJIDEA之API插件介绍API插件支持VSCodeIDE、IntelliJIDEA等平台、以及华为云自研CodeArtsIDE,基于华为云服务提供的能力,帮助开发者更高效、便捷的搭建应用。API插件关联华为

区块链(2):区块链的应用分类和诞生的故事

1区块链的应用分类第一类:数字资产第一类是数字资产,分为一般数字资产和主打匿名应用场景的匿名数字资产。一般数字资产包括我们非常熟悉的比特币【https://bitcoin.org】、莱特币,在前面我们已经学习过,除此之外还有新经币NEM(NewEconomyMovement)、Decred(中文名暂无)、狗狗币Doge

Redis群集

1、redis群集三种模式redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,下面会讲解一下三种模式的工作方式,以及如何搭建cluster群集●主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的

redisson使用过程常见问题汇总

文章目录常见报错1.配置方式使用错误2.版本差异报错3.配置文件中配置了密码或者配置错误4.字符集和序列化方式配置问题5.Redisson的序列化问题6.连接池问题:7.Redisson的高可用性问题:8.Redisson的并发问题9.Redisson的性能问题2.参考文档常见报错1.配置方式使用错误Redisson提

redis设计规范

部分内容参考:阿里redis开发规范同时,结合shigen在实习中的实践经验总结。key的名称设计可读性和管理性业务名:表名:idpro:user:1001简洁性控制key的长度,可以用缩写transaction->tras拒绝bigkey防止网卡流量、慢查询,string类型控制在10KB以内,hash、list、s

Redis 高性能设计之epoll和IO多路复用深度解析

I/O多路复用模型是什么I/O:网络I/O多路:多个客户端连接(连接就是套接字描述符,即socket或者channel),指的是多条TCP连接复用:用一个进程来处理多条的连接,使用单进程就能的够实现同时处理多个客户端的连接一句话:实现了用一个进程来处理大量的用户连接,IO多路复用类似一个规范和接口落地实现:可以分sel

深度对话|Sui在商业技术堆栈中的地位

近日,我们采访了MystenLabs的商业产品总监LolaOyelayo-Pearson,共同探讨了区块链技术如何为企业提供商业服务,以及为什么Sui特别适合这些用例。1.请您简要介绍一下自己、您的角色以及您是如何开始涉足Web3领域的?目前,我领导MystenLabs的商业产品团队。通常来说,商业涵盖了一切,它可能是

山石网科国产化入侵防御系统,打造全生命周期的安全防护

随着互联网的普及和网络安全的威胁日益增加,botnet感染成为了企业面临的重要问题之一。botnet是一种由分散的客户端(或肉鸡)组成的网络,这些客户端被植入了bot程序,受控于攻击者。攻击者通过这些客户端的bot程序,利用C&C服务器对这些客户端进行管理和控制,以达到非法牟利的目的。被感染攻击的企业不仅会面临公司和个

热文推荐