0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-12-01 15:30 次阅读

概述

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

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

样品申请

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

视频教程

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

完整代码下载

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

参考程序初始化

相对于驱动人体检测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%xn",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: %02drn", 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 - 运动检测标志位 %drn",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 */

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2526

    文章

    48093

    浏览量

    740053
  • 人体感应
    +关注

    关注

    3

    文章

    61

    浏览量

    16800
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
收藏 人收藏

    评论

    相关推荐

    基于STM32CUBEMX驱动TMOS模块STHS34PF80(1)----获取ID

    STHS34PF80 是一款非冷却、工厂校准的红外运动和存在检测传感器,工作波长在 5 µm 至 20 µm 之间。
    的头像 发表于 12-01 15:28 4427次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(1)----获取ID

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

    由 ASIC 进行数字处理,可以对其进行编程以监控运动、存在或过热状况。 本章主要驱动STHS34PF80,进行人体检测
    的头像 发表于 12-01 15:29 393次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(2)----<b class='flag-5'>驱动</b><b class='flag-5'>STHS34PF80</b>进行人体<b class='flag-5'>检测</b>

    基于STM32CUBEMX驱动TMOS模块STHS34PF80(4)----中断获取信号

    SHS34PF80的数据准备信号提供了一种机制,允许设备在新的测量数据可读取时通知系统,并触发同步操作,通过正确配置相关寄存器,可以确保系统及时捕获和处理来自设备的新数据,从而提高整体性能和响应能力。
    的头像 发表于 12-01 15:31 3866次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(4)----中断获取信号

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

    STHS34PF80传感器项目种修改 Arduino 脚本,重新移植到STM32的MCU中。
    的头像 发表于 12-01 15:33 378次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(5)----配置嵌入式函数

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

    STHS34PF80传感器项目种修改 Arduino 脚本,重新移植到STM32的MCU中。 该项目基于STHS34PF80 IR温度传感器,能够
    的头像 发表于 12-01 15:39 328次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TMOS</b><b class='flag-5'>模块</b><b class='flag-5'>STHS34PF80</b>(6)----获取状态数据

    通过STEVAL-MKI109V3在unico上识别不到STHS34PF80是为什么?怎么处理?

    TMOS测试:通过STEVAL-MKI109V3在unico上识别不到STHS34PF80
    发表于 03-26 08:31

    stm32cubemx教程

    stm32cubemx教程,需要学习的看看,免积分
    发表于 11-02 10:16 0次下载

    STM32CubeMX和HAL驱动库的嵌入式系统设计浅谈

    课程 | 基于STM32CubeMX和HAL驱动库的嵌入式系统设计
    的头像 发表于 01-09 13:59 3729次阅读

    STM32cubeMX I2S DMA双缓冲配置

    STM32cubeMX I2S DMA双缓冲配置开发测试环境cubeMX配置方法1,配置I2S模块;我的是录音模块,所以master RX模式;修改
    发表于 12-03 09:06 35次下载
    <b class='flag-5'>STM32cubeMX</b> I2S DMA双缓冲配置

    使用stm32cubemx的usb-host-cdc库驱动EC20模块

    使用stm32cubemx的usb-host-cdc库驱动EC20模块开发环境:实现功能:开始1、使用STM32CubeMX配置工程,生成基础代码2、
    发表于 12-28 19:48 40次下载
    使用<b class='flag-5'>stm32cubemx</b>的usb-host-cdc库<b class='flag-5'>驱动</b>EC20<b class='flag-5'>模块</b>

    意法半导发布了新型人体存在和移动检测芯片:STHS34PF80

    近期,意法半导发布了新型人体存在和移动检测芯片:STHS34PF80,它是一款带有微加工热敏晶体管(TMOS)的高集成度、超低功耗的红外(IR)传感器,可取代传统的被动红外(PIR)传感技术,提升安保监视系统、家庭自动化设备和物
    的头像 发表于 07-30 09:47 1215次阅读

    ST TMOS热敏红外传感器: 精准检测人员存在和移动

    意法半导发布新型人体存在和移动检测芯片。STHS34PF80是一款带有微加工热敏晶体管(TMOS)的高集成度、超低功耗的红外(IR)传感器,可取代传统的被动红外(PIR)传感技术,提升安保监视系统、家庭自动化设备和物联网设备等场
    发表于 08-08 14:48 329次阅读

    STM8CubeMXSTM32CubeMX功能一样吗?

    STM8CubeMXSTM32CubeMX功能一样吗?
    的头像 发表于 10-31 16:59 1195次阅读
    STM8<b class='flag-5'>CubeMX</b>和<b class='flag-5'>STM32CubeMX</b>功能一样吗?

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

    STHS34PF80是一款高性能的红外(IR)传感器,特别适用于检测存在感和运动。其主要特点是高灵敏度,能在没有透镜的情况下探测到4米远的物体(尺寸为70 x 25厘米),并配有集成的硅红外滤波器
    的头像 发表于 01-09 15:51 212次阅读
    <b class='flag-5'>STHS34PF80</b>人体存在传感器(1)----获取人体存在状态

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

    STHS34PF80是一款高性能的红外(IR)传感器,特别适用于检测存在感和运动。其主要特点是高灵敏度,能在没有透镜的情况下探测到4米远的物体(尺寸为70 x 25厘米),并配有集成的硅红外滤波器
    的头像 发表于 01-09 16:00 239次阅读
    e2studio开发<b class='flag-5'>STHS34PF80</b>人体存在传感器(1)----获取人体存在状态