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

news2024/11/22 21:22:47

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

  • 概述
  • 样品申请
  • 视频教程
  • 参考程序初始化
  • 省电模式
  • 设置存在阈值
  • 设置存在滞后
  • 设置动作阈值
  • 设置动作滞后
  • 主程序

概述

用于配置和设置 STHS34PF80 传感器的一些参数,以便进行存在检测和运动检测。

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

样品申请

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

视频教程

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

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

参考程序初始化

相对于驱动人体检测demo,新的案例设置了传感器的存在和运动相关的阈值、滞后和中断配置,以实现存在检测和运动检测的功能,并在相关事件发生时触发中断。
在这里插入图片描述

省电模式

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

尽管设备处于关机模式,但它仍保持 I²C / SPI 通信串口处于活动状态,以便能够与设备进行通信和配置设置。关机模式下,配置寄存器的内容被保留,而输出数据寄存器不会更新,这意味着在进入关机模式前,最后一次采样的数据将保留在内存中。
为了进入关机模式并避免在重新进入连续模式时读取错误的输出数据,文本提供了正确的步骤。然而,这些步骤在你的问题中并未提供,因此无法给出完整的步骤。
在这里插入图片描述
上面文档主要对0x25,0x23,0x20寄存器进行操作,其中读取0x25多次,主要功能是对STATUS (23h)的DRDY进行清0。
查看下面表格也可以得知,有多种操作可以对STATUS (23h)的DRDY 清零。
在这里插入图片描述

其中0x20是配置速率寄存器。

在这里插入图片描述

设置存在阈值

存在检测如下所示。
在这里插入图片描述

以设置存在阈值为例,探索设置的步骤。

在这里插入图片描述
这里使用的函数为 sths34pf80_presence_threshold_set(STHS34PF80_ADDRESS, 200)。

/**
  * @brief  Presence threshold.[set]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      presence threshold level
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_presence_threshold_set(uint8_t add, uint16_t val)
{
  sths34pf80_ctrl1_t ctrl1;
  uint8_t odr;
  uint8_t buff[2];
  int32_t ret;

  if ((val & 0x8000U) != 0x0U) {
    /* threshold values are on 15 bits */
    return -1;
  }

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20
  odr = ctrl1.odr;
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0);

  buff[1] = (uint8_t)(val / 256U);
  buff[0] = (uint8_t)(val - (buff[1] * 256U));
  ret += sths34pf80_func_cfg_write(add, STHS34PF80_PRESENCE_THS, &buff[0], 2);//STHS34PF80_PRESENCE_THS->0x20U

  ret += sths34pf80_algo_reset(add);

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

  return ret;
}

最开始读取CTRL1(20h)的数据,同时进行保存到odr变量中。

  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20
  odr = ctrl1.odr;

ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0)这行代码用于在设置存在阈值之前,通过调用 sths34pf80_tmos_odr_check_safe_set 函数来确保在设置新的参数之前传感器的状态是稳定且安全的。该函数如下所示。

/**
  * @brief  Enter to/Exit from power-down in a safe way
  *
  * @param  ctx      read / write interface definitions
  * @param  ctrl1    Value of CTRL1 register
  * @param  odr_new  Value of new odr to be set
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
static uint8_t sths34pf80_tmos_odr_check_safe_set(uint8_t add,sths34pf80_ctrl1_t ctrl1, uint8_t odr_new)
{
  sths34pf80_func_status_t func_status;
  sths34pf80_tmos_drdy_status_t status;
  int32_t ret = 0;

  if (odr_new > HAL_OK) {
    /*
     * Do a clean reset algo procedure everytime odr is changed to an
     * operative state.
     */
    ctrl1.odr = 0;
    ret = sths34pf80_write_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20

    ret += sths34pf80_algo_reset(add);
  } else {
    /* if we need to go to power-down from an operative state
     * perform the safe power-down.
     */
    if ((uint8_t)ctrl1.odr > 0U) {
      /* reset the DRDY bit */
      ret = sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&func_status, 1);//STHS34PF80_FUNC_STATUS->0x25

      /* wait DRDY bit go to '1' */
      do {
        ret += sths34pf80_tmos_drdy_status_get(add, &status);

      } while (status.drdy != 0U);

      /* set ODR to 0 */
      ctrl1.odr = 0;
      ret += sths34pf80_write_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);

      /* reset the DRDY bit */
      ret += sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&func_status, 1);
    }
  }

  ctrl1.odr = (odr_new & 0xfU);
  ret += sths34pf80_write_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);

  return ret;
}

其中下电模式在else中执行。
先是执行sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&func_status, 1),读取0x25主要功能是对STATUS (23h)的DRDY进行清0,之后执行如下代码。

      /* wait DRDY bit go to '1' */
      do {
        ret += sths34pf80_tmos_drdy_status_get(add, &status);

      } while (status.drdy != 0U);

sths34pf80_tmos_drdy_status_get代码主要是对STATUS (23h)的DRDY进行读取,当读取为0,跳出上面的循环。

/**
  * @brief  status of drdy.[get]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      status of drdy bit (TAMB, TOBJ, TAMB_SHOCK, TPRESENCE, TMOTION).
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_tmos_drdy_status_get(uint8_t add, sths34pf80_tmos_drdy_status_t *val)
{
  sths34pf80_status_t status;
  int32_t ret;

  ret = sths34pf80_read_reg(add, STHS34PF80_STATUS, (uint8_t *)&status, 1);//STHS34PF80_STATUS->0x23

  val->drdy = status.drdy;

  return ret;
}

之后重新回到sths34pf80_tmos_odr_check_safe_set函数中,执行如下操作。
主要功能就是将CTRL1(20h)里面的ODR数据清零,同时读取0x25,主要功能是对STATUS (23h)的DRDY进行清0

      /* set ODR to 0 */
      ctrl1.odr = 0;
      ret += sths34pf80_write_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20

      /* reset the DRDY bit */
      ret += sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&func_status, 1);//STHS34PF80_FUNC_STATUS->0x25

然后执行如下代码将ODR数据重新写入CTRL1(20h)寄存器中。

  ctrl1.odr = (odr_new & 0xfU);
  ret += sths34pf80_write_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20

紧接着返回sths34pf80_presence_threshold_set函数中,执行如下操作。
将传入的数据保存到buff数组中,然后执行sths34pf80_func_cfg_write将buff数据传入到PRESENCE_THS (20h - 21h)中。

 buff[1] = (uint8_t)(val / 256U);
  buff[0] = (uint8_t)(val - (buff[1] * 256U));
  ret += sths34pf80_func_cfg_write(add, STHS34PF80_PRESENCE_THS, &buff[0], 2);//STHS34PF80_PRESENCE_THS->0x20U

查看sths34pf80_func_cfg_write函数,如下所示。

/**
  * @brief  Function Configuration write
  *
  * @param  ctx      read / write interface definitions
  * @param  addr     embedded register address
  * @param  data     embedded register data
  * @param  len      embedded register data len
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_func_cfg_write(uint8_t add, uint8_t addr, uint8_t *data, uint8_t len)
{
  sths34pf80_ctrl1_t ctrl1;
  uint8_t odr;
  sths34pf80_page_rw_t page_rw = {0};
  int32_t ret;
  uint8_t i;

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20
  odr = ctrl1.odr;
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0);

  /* Enable access to embedded functions register */
  ret += sths34pf80_mem_bank_set(add, STHS34PF80_EMBED_FUNC_MEM_BANK);

  /* Enable write mode */
  page_rw.func_cfg_write = 1;
  ret += sths34pf80_write_reg(add, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw, 1);

  /* Select register address (it will autoincrement when writing) */
  ret += sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, &addr, 1);

  for (i = 0; i < len; i++)
  {
    /* Write data */
    ret += sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, &data[i], 1);
  }

  /* Disable write mode */
  page_rw.func_cfg_write = 0;
  ret += sths34pf80_write_reg(add, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw, 1);

  /* Disable access to embedded functions register */
  ret += sths34pf80_mem_bank_set(add, STHS34PF80_MAIN_MEM_BANK);

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

  return ret;
}

分析上面代码,其中sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1)为将ODR数据读取出来,接着执行sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0),该函数上面已经讲解,主要是进入一个掉电模式,确保在设置新的参数之前传感器的状态是稳定且安全的,以防止设置参数时出现异常情况。接着执行sths34pf80_mem_bank_set(add, STHS34PF80_EMBED_FUNC_MEM_BANK),该函数具体操作如下所示。

/**
  * @brief  Change memory bank.[set]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      MAIN_MEM_BANK, EMBED_FUNC_MEM_BANK, SENSOR_HUB_MEM_BANK, STRED_MEM_BANK,
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_mem_bank_set(uint8_t add, sths34pf80_mem_bank_t val)
{
  sths34pf80_ctrl2_t ctrl2;
  int32_t ret;

  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&ctrl2, 1);//STHS34PF80_CTRL2->0x21

  if (ret == HAL_OK)
  {
    ctrl2.func_cfg_access = ((uint8_t)val & 0x1U);
    ret = sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&ctrl2, 1);//STHS34PF80_CTRL2->0x21
  }

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


继续返回sths34pf80_func_cfg_write函数,
之后执行如下函数,主要为向寄存器PAGE_RW (11h)的FUNC_CFG_WRITE标志位置为为1,启用嵌入式函数的写过程。
  /* Enable write mode */
  page_rw.func_cfg_write = 1;
  ret += sths34pf80_write_reg(add, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw, 1);

在这里插入图片描述
继续返回sths34pf80_func_cfg_write函数,然后执行如下函数,该函数为写入或者读取嵌入式函数的地址,具体要看PAGE_RW (11h)设置为读或者写,同时写入固定的data指令,当写完之后进入PAGE_RW (11h)关闭读或写操作。

  /* Select register address (it will autoincrement when writing) */
  ret += sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, &addr, 1);
  for (i = 0; i < len; i++)
  {
    /* Write data */
    ret += sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, &data[i], 1);
  }
  /* Disable write mode */
  page_rw.func_cfg_write = 0;
  ret += sths34pf80_write_reg(add, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw, 1);

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

在这里插入图片描述
接着执行sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr),将odr重新写入。

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

到此sths34pf80_func_cfg_write就已经设置完毕,返回sths34pf80_presence_threshold_set函数中,执行sths34pf80_algo_reset操作。

  ret += sths34pf80_algo_reset(add);

该函数具体操作如下所示。

/**
  * @brief  Reset algo
  *
  * @param  ctx      read / write interface definitions
  * @param  val      reset algo structure
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_algo_reset(uint8_t add)
{
  uint8_t tmp;
  int32_t ret;

  tmp = 1;
  ret = sths34pf80_func_cfg_write(add, STHS34PF80_RESET_ALGO, &tmp, 1);//STHS34PF80_RESET_ALGO->0x2A

  return ret;
}

该函数对RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置为位1,执行算法重置操作。默认情况下,这个位的值为 0,表示不进行算法重置。当用户修改了与算法相关的参数时(例如阈值、滞后等),需要将 ALGO_ENABLE_RESET 位设置为 1。重置完成后,ALGO_ENABLE_RESET 位应返回到默认值 0。
在这里插入图片描述

接着执行sths34pf80_tmos_odr_check_safe_set,将刚刚保存的ODR数据重新导入进入。

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

到此,sths34pf80_presence_threshold_set函数就已经执行完毕。

设置存在滞后

这里使用的函数为sths34pf80_presence_hysteresis_set(STHS34PF80_ADDRESS, 20)。

/**
  * @brief  Presence hysteresis.[set]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      Presence hysteresis value
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_presence_hysteresis_set(uint8_t add, uint8_t val)
{
  sths34pf80_ctrl1_t ctrl1;
  uint8_t odr;
  int32_t ret;

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
  odr = ctrl1.odr;
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0);

  ret += sths34pf80_func_cfg_write(add, STHS34PF80_HYST_PRESENCE, &val, 1);

  ret += sths34pf80_algo_reset(add);

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

  return ret;
}

最开始读取CTRL1(20h)的数据,同时进行保存到odr变量中。

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20
  odr = ctrl1.odr;

ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0)这行代码用于在设置存在阈值之前,通过调用 sths34pf80_tmos_odr_check_safe_set 函数来确保在设置新的参数之前传感器的状态是稳定且安全的。
紧接着将传入的数据保存到val数组中,然后执行sths34pf80_func_cfg_write将val数据传入到HYST_PRESENCE (27h)中。

  ret += sths34pf80_func_cfg_write(add, STHS34PF80_HYST_PRESENCE, &val, 1);

这个滞后值有助于避免在边界值附近产生频繁的状态切换。
默认值: 预设的滞后值默认值是 32(0x32)。
在这里插入图片描述
例如,假设 PRESENCE_THS 设置为 200,而 HYST_PRESENCE 设置为 32。当测量值超过 200 时,传感器会认为存在某种状态。然后,要从存在状态切换到非存在状态,传感器必须降低测量值至少到达 200 - 32 = 168。只有当测量值降低到 168 以下时,传感器才会触发状态切换。
通过设置适当的滞后值,可以防止在测量值在阈值附近波动时出现不必要的状态切换,从而提高存在检测的稳定性。
接着执行sths34pf80_algo_reset函数,该函数主要对RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置为位1,执行算法重置操作。

 ret += sths34pf80_algo_reset(add);

接着执行sths34pf80_tmos_odr_check_safe_set,将刚刚保存的ODR数据重新导入进入。

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

到此,sths34pf80_presence_hysteresis_set函数就已经执行完毕。

设置动作阈值

这里使用的函数为sths34pf80_motion_threshold_set(STHS34PF80_ADDRESS, 300)。

/**
  * @brief  Motion threshold.[set]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      motion threshold level
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_motion_threshold_set(uint8_t add,  uint16_t val)
{
  sths34pf80_ctrl1_t ctrl1;
  uint8_t odr;
  uint8_t buff[2];
  int32_t ret;

  if ((val & 0x8000U) != 0x0U) {
    /* threshold values are on 15 bits */
    return -1;
  }

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
  odr = ctrl1.odr;
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0);

  buff[1] = (uint8_t)(val / 256U);
  buff[0] = (uint8_t)(val - (buff[1] * 256U));
  ret += sths34pf80_func_cfg_write(add, STHS34PF80_MOTION_THS, &buff[0], 2);

  ret += sths34pf80_algo_reset(add);

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

  return ret;
}

最开始读取CTRL1(20h)的数据,同时进行保存到odr变量中。

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
  odr = ctrl1.odr;

ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0)这行代码用于在设置存在阈值之前,通过调用 sths34pf80_tmos_odr_check_safe_set 函数来确保在设置新的参数之前传感器的状态是稳定且安全的。

  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0);

接着将传入的数据保存到buff数组中,然后执行sths34pf80_func_cfg_write将buff数据传入到MOTION_THS (22h - 23h)中。

  buff[1] = (uint8_t)(val / 256U);
  buff[0] = (uint8_t)(val - (buff[1] * 256U));
  ret += sths34pf80_func_cfg_write(add, STHS34PF80_MOTION_THS, &buff[0], 2);

MOTION_THS 寄存器(地址范围为 0x22 到 0x23)用于设置运动检测算法的阈值。运动检测算法用于检测是否发生了物体的运动或动作。
以下是这个寄存器的作用:
运动阈值(Motion Threshold): 这是一个用于运动检测算法的阈值。阈值定义了在测量数据中,何时认为发生了物体的运动或动作。阈值是一个 15 位的无符号整数,其取值范围在 0 到 32767 之间。
默认值: 预设的运动阈值默认值是 200(0x00C8)。
例如,如果 MOTION_THS 设置为 300,这意味着当传感器测量的某个特定值超过了 300,传感器会认为发生了运动或动作状态。
通过设置适当的运动阈值,可以根据应用需求来调整运动检测的敏感度。更高的阈值会导致较大的变化才能被视为运动,而较低的阈值则会使传感器更敏感,甚至可能在较小的变化时触发运动检测。
在这里插入图片描述

接着执行sths34pf80_algo_reset函数,该函数主要对RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置为位1,执行算法重置操作。

 ret += sths34pf80_algo_reset(add);

接着执行sths34pf80_tmos_odr_check_safe_set,将刚刚保存的ODR数据重新导入进入。

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

到此,sths34pf80_motion_threshold_set函数就已经执行完毕。

设置动作滞后

这里使用的函数为sths34pf80_motion_hysteresis_set(STHS34PF80_ADDRESS, 30)。

/**
  * @brief  Motion hysteresis threshold.[set]
  *
  * @param  ctx      read / write interface definitions
  * @param  val      Motion hysteresis value
  * @retval          interface status (MANDATORY: return 0 -> no Error)
  *
  */
uint8_t sths34pf80_motion_hysteresis_set(uint8_t add, uint8_t val)
{
  sths34pf80_ctrl1_t ctrl1;
  uint8_t odr;
  int32_t ret;

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);
  odr = ctrl1.odr;
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0);

  ret += sths34pf80_func_cfg_write(add, STHS34PF80_HYST_MOTION, &val, 1);

  ret += sths34pf80_algo_reset(add);

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

  return ret;
}

最开始读取CTRL1(20h)的数据,同时进行保存到odr变量中。

  /* Save current odr and enter PD mode */
  ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&ctrl1, 1);//STHS34PF80_CTRL1->0x20
  odr = ctrl1.odr;

ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0)这行代码用于在设置存在阈值之前,通过调用 sths34pf80_tmos_odr_check_safe_set 函数来确保在设置新的参数之前传感器的状态是稳定且安全的。
紧接着将传入的数据保存到val数组中,然后执行sths34pf80_func_cfg_write将val数据传入到HYST_MOTION (26h)中。

  ret += sths34pf80_func_cfg_write(add, STHS34PF80_HYST_MOTION, &val, 1);

在运动检测算法中,滞后指的是当从运动状态切换到静止状态时,需要等待的时间或条件,以防止在短时间内频繁地切换状态。
默认值: 预设的滞后值默认值是 32(0x32)。
在这里插入图片描述

例如,如果 MOTION_THS 设置为 300,而 HYST_MOTION 设置为 32。当测量值超过 300 时,传感器会认为发生了运动。然后,要从运动状态切换到非运动状态,传感器必须降低测量值至少到达 300 - 32 = 268。只有当测量值降低到 268 以下时,传感器才会触发状态切换。
通过设置适当的运动滞后值,可以避免在测量值在运动状态附近波动时产生不必要的状态切换,从而提高运动检测的稳定性。这类似于存在检测中的概念,但针对的是运动状态。
接着执行sths34pf80_algo_reset函数,该函数主要对RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置为位1,执行算法重置操作。

 ret += sths34pf80_algo_reset(add);

接着执行sths34pf80_tmos_odr_check_safe_set,将刚刚保存的ODR数据重新导入进入。

  /* Set saved odr back */
  ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);

到此,sths34pf80_motion_hysteresis_set函数就已经执行完毕。

主程序

初始化如下。

  /* 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_32);
  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);
	
	sths34pf80_presence_threshold_set(STHS34PF80_ADDRESS, 300);	//设置存在阈值。
  sths34pf80_presence_hysteresis_set(STHS34PF80_ADDRESS, 20);//“存在滞后”(Presence Hysteresis)的函数
  sths34pf80_motion_threshold_set(STHS34PF80_ADDRESS, 300);//设置动作阈值
  sths34pf80_motion_hysteresis_set(STHS34PF80_ADDRESS, 30);	动作滞后”(Motion Hysteresis)的函数
  /* Set ODR */
  sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_30Hz);

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

main函数如下所示。

  /* 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/875396.html

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

相关文章

Java类与对象详解(3)

目录 封装 封装的概念 访问限定符 封装扩展之包 包的概念 导入包中的类 自定义包 基本规则 包的访问权限控制举例 常见的包 static 成员 static 修饰成员变量 static修饰成员方法 static 成员变量的初始化 代码块 代码块的概念及其分类 普通代码块 构造代码块…

旧版本docker未及时更新,导致更新/etc/docker/daemon.json配置文件出现docker重启失败

一、背景 安装完docker和containerd之后&#xff0c;尝试重启docker的时候&#xff0c;报错如下&#xff1a; systemctl restart dockerJob for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “…

Vue学习:创建Vue

一、安装Node.js和NPM 1.安装node.js 从node.js官网下载并安装node.js 网址&#xff1a; Download | Node.js 2.双击” node-v8.1.2-x64.msi”开始安装 至此Node.js已经安装完成&#xff0c;可以先进行下简单的测试安装是否成功了&#xff0c;后面还要进行环境配置在键盘按…

理解 Go 中的切片:append 操作的深入分析(篇1)

理解 Go 语言中 slice 的性质对于编程非常有益。下面&#xff0c;我将通过两个代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 1 篇&#xff0c;当切片的容量 cap 充足时 第一份代码 slice1 的初始长度为 3&#xff0c;容量为 10 func main()…

win10电脑右下角不显示电脑图标,但是能正常上网,怎么解决?

一、问题描述 win10系统更新后&#xff0c;电脑右下角不显示小电脑图标&#xff0c;但是能正常上网&#xff0c;而且用命令测试时显示的是192打头的网址。 二、解决方法 运行命令提示符窗口&#xff0c;在命令提示符中输入&#xff1a;netsh winsock reset&#xff08; 如果提示…

汇编知识点之磁盘文件存取技术

1.文件代号式磁盘存取 &#xff08;1&#xff09;两个重要的表 (2)简要说明&#xff1a; 文件代号式存取方式将有关文件的各种信息都包括在DOS中。 在处理指定文件时必须使用一个完整的路径名&#xff0c;一旦文件的路径名被送入操作系统&#xff0c;就被赋予一个简单的文件…

使用chatGPT规划在北京的生活预算

介绍 通过使用chatGPT大概预算自己的生活支出和收入&#xff0c;搞清楚多少的收入能在一个城市过的比较舒服&#xff0c;更好的去规划自己的职业和未来。本文以一线城市为例。 什么是生活成本指数&#xff1f; 生活成本指数是对居住在某个地点的普通人预期的不同费用成本的广泛…

十秒搞懂ER图中的对应关系

十秒搞懂ER图中的对应关系 ER图是什么实体是什么关系如何确认实体间的关系简单总结 ER图是什么 实体关系图&#xff08;Entity-Relationship Diagram&#xff0c;简称ER图&#xff09;是一种图形化的工具&#xff0c;用于表示数据库中不同实体之间的关系和连接。ER图是数据库设…

Ubuntu系统没有声音

现象 新按转的Ubuntu系统没有声音&#xff0c;怀疑是声卡选择的问题 解决方法 1、在终端输入alsamixer命令 2、按下F6键选择声卡 不要选择NVidia&#xff0c;而是选择HD-Audio 3、将所有音量调到最大&#xff0c;把disable调成enable

2023-08-14 linux 串口终端输入长命令不换行,覆盖前面内容,stty命令设置串口终端行列数

一、linux 串口终端输入长命令不换行&#xff0c;覆盖前面内容&#xff0c;现象如下图&#xff1a; 二、解决方法&#xff1a;用stty 命令设置行列数 stty columns 200 stty rows 10三、参考文章 https://www.cnblogs.com/goloving/p/15170537.html 常用Linux串口设备操作命…

Tomcat多实例部署及nginx+tomcat的负载均衡和动静分离

Tomcat多实例部署 安装 jdk、tomcat&#xff08;流程可看之前博客&#xff09; 配置 tomcat 环境变量 [rootlocalhost ~]# vim /etc/profile.d/tomcat.sh#tomcat1 export CATALINA_HOME1/usr/local/tomcat/tomcat1 export CATALINA_BASE1/usr/local/tomcat/tomcat1 export T…

达梦数据库(dm8) 在Centos7环境 单节点安装

国产数据库-达梦 一、环境详情二、Centos7 参数优化三、创建用户四、开始安装 当前安装 在指定版本环境下 测试&#xff0c;仅供参考 一、环境详情 软件版本 软件版本下载地址Centos 7CentOS Linux release 7.9.2009 (Core) x86达梦数据库dm8_20230418_x86_rh6_64.zip 节点分配…

html2canvas生成图片地址Base64格式转成blob在转成file(二进制)可正常发送(保姆教程,复制粘贴可用)

开始: 最终结果: 1. html2canvas方法生成的图片地址已Base64编码形式放在img标签src中可直接展示生成的图片(注意页面标签获取位置,还有个setTimeout页面渲染需要时间) setTimeout(function () {var result {};v…

最新Anaconda安装-保姆级教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Anaconda下载 二、使用步骤 手动配置环境变量 &#xff08;上面选择just me和默认配置的可以跳过这一步&#xff09; 简要说明五条路径的用途&#xff1a;这五…

Spring(三):Spring中Bean的生命周期和作用域

前言 在 Spring 中&#xff0c;那些组成应用程序的主体及由 Spring IOC 容器所管理的对象&#xff0c;被称之为 bean。简单地讲&#xff0c;bean 就是由 IOC 容器初始化、装配及管理的对象&#xff0c;除此之外&#xff0c;bean 就与应用程序中的其他对象没有什么区别了。而 b…

金蝶云星空和易快报单据接口对接

金蝶云星空和易快报单据接口对接 来源系统:易快报 易快报是敏捷的企业报销费控与聚合消费平台&#xff0c;为企业提供移动报销、聚合消费、全程费控、预算管理、发票管理等一站式解决方案。同时&#xff0c;易快报可集成多家银行及第三方支付平台&#xff0c;打通对公对私付款&…

GD32F103VE使用软件扫描读取多通道AD值

GD32F103VE使用软件扫描读取多通道AD值。 GD32F103的ADC为12位AD转换器,ADC转换结果保存在16位数据寄存器中; 模拟输入通道&#xff1a; 16个外部模拟输入通道; 1个内部温度传感器通道(Vsense) 1个内部参考电压输入通道(VrefInt) ADC的VDDA电源引脚需要接入3.3V; ADC输入模拟…

Algorithem Review 5.2 图论

网络流 设源点为 s s s&#xff0c;汇点为 t t t&#xff0c;每条边 e e e 的流量上限为 c ( e ) c(e) c(e)&#xff0c;流量为 f ( e ) f(e) f(e)。割 指对于某一顶点集合 P ⊂ V P \subset V P⊂V&#xff0c;从 P P P 出发指向 P P P 外部的那些原图中的边的集合&a…

WMS系统出库操作规范:提高效率与准确性的关键

WMS系统出库管理是指通过仓库管理系统&#xff08;Warehouse Management System&#xff0c;简称WMS&#xff09;对仓库中的货物进行出库操作的管理过程。WMS系统是一种利用自动化和数字化技术提高仓库管理效率和准确性的工具&#xff0c;它提供了对仓库内货物的全面控制和可视…

CentOS7源码安装MySQL详细教程

&#x1f60a; 作者&#xff1a; Eric &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_47316183?typeblog &#x1f389; 主题&#xff1a;CentOS7源码安装MySQL详细教程 ⏱️ 创作时间&#xff1a; 2023年08月014日 文章目录 1、安装的四种方式2、源码安装…