0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32CUBEMX驅(qū)動(dòng)TMOS模塊STHS34PF80(3)----修改檢測(cè)閾值

嵌入式單片機(jī)MCU開發(fā) ? 來(lái)源:嵌入式單片機(jī)MCU開發(fā) ? 作者:嵌入式單片機(jī)MCU開 ? 2023-12-01 15:30 ? 次閱讀

概述

用于配置和設(shè)置 STHS34PF80 傳感器的一些參數(shù),以便進(jìn)行存在檢測(cè)和運(yùn)動(dòng)檢測(cè)。

最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請(qǐng):615061293 。

在這里插入圖片描述

樣品申請(qǐng)

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

視頻教程

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

完整代碼下載

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

參考程序初始化

相對(duì)于驅(qū)動(dòng)人體檢測(cè)demo,新的案例設(shè)置了傳感器的存在和運(yùn)動(dòng)相關(guān)的閾值、滯后和中斷配置,以實(shí)現(xiàn)存在檢測(cè)和運(yùn)動(dòng)檢測(cè)的功能,并在相關(guān)事件發(fā)生時(shí)觸發(fā)中斷。
在這里插入圖片描述

省電模式

下面文本描述了關(guān)機(jī)模式的使用和功能。關(guān)機(jī)模式是一種休眠模式,用于將傳感器設(shè)備置于休眠狀態(tài),從而節(jié)省功耗。在關(guān)機(jī)模式下,設(shè)備停止數(shù)據(jù)采集,并且大部分內(nèi)部模塊都被關(guān)閉,以最小化電流消耗。這使得傳感器在供電的情況下能夠?qū)崿F(xiàn)最低的功耗水平。

盡管設(shè)備處于關(guān)機(jī)模式,但它仍保持 I2C / SPI 通信串口處于活動(dòng)狀態(tài),以便能夠與設(shè)備進(jìn)行通信和配置設(shè)置。關(guān)機(jī)模式下,配置寄存器的內(nèi)容被保留,而輸出數(shù)據(jù)寄存器不會(huì)更新,這意味著在進(jìn)入關(guān)機(jī)模式前,最后一次采樣的數(shù)據(jù)將保留在內(nèi)存中。
為了進(jìn)入關(guān)機(jī)模式并避免在重新進(jìn)入連續(xù)模式時(shí)讀取錯(cuò)誤的輸出數(shù)據(jù),文本提供了正確的步驟。然而,這些步驟在你的問(wèn)題中并未提供,因此無(wú)法給出完整的步驟。
在這里插入圖片描述
上面文檔主要對(duì)0x25,0x23,0x20寄存器進(jìn)行操作,其中讀取0x25多次,主要功能是對(duì)STATUS (23h)的DRDY進(jìn)行清0。
查看下面表格也可以得知,有多種操作可以對(duì)STATUS (23h)的DRDY 清零。
在這里插入圖片描述

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

在這里插入圖片描述

設(shè)置存在閾值

存在檢測(cè)如下所示。
在這里插入圖片描述

以設(shè)置存在閾值為例,探索設(shè)置的步驟。

在這里插入圖片描述
這里使用的函數(shù)為 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)的數(shù)據(jù),同時(shí)進(jìn)行保存到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)這行代碼用于在設(shè)置存在閾值之前,通過(guò)調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來(lái)確保在設(shè)置新的參數(shù)之前傳感器的狀態(tài)是穩(wěn)定且安全的。該函數(shù)如下所示。

/**
  * @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中執(zhí)行。
先是執(zhí)行sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&func_status, 1),讀取0x25主要功能是對(duì)STATUS (23h)的DRDY進(jìn)行清0,之后執(zhí)行如下代碼。

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

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

sths34pf80_tmos_drdy_status_get代碼主要是對(duì)STATUS (23h)的DRDY進(jìn)行讀取,當(dāng)讀取為0,跳出上面的循環(huán)。

/**
  * @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函數(shù)中,執(zhí)行如下操作。
主要功能就是將CTRL1(20h)里面的ODR數(shù)據(jù)清零,同時(shí)讀取0x25,主要功能是對(duì)STATUS (23h)的DRDY進(jìn)行清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

然后執(zhí)行如下代碼將ODR數(shù)據(jù)重新寫入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函數(shù)中,執(zhí)行如下操作。
將傳入的數(shù)據(jù)保存到buff數(shù)組中,然后執(zhí)行sths34pf80_func_cfg_write將buff數(shù)據(jù)傳入到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函數(shù),如下所示。

/**
  * @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數(shù)據(jù)讀取出來(lái),接著執(zhí)行sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0),該函數(shù)上面已經(jīng)講解,主要是進(jìn)入一個(gè)掉電模式,確保在設(shè)置新的參數(shù)之前傳感器的狀態(tài)是穩(wěn)定且安全的,以防止設(shè)置參數(shù)時(shí)出現(xiàn)異常情況。接著執(zhí)行sths34pf80_mem_bank_set(add, STHS34PF80_EMBED_FUNC_MEM_BANK),該函數(shù)具體操作如下所示。

/**
  * @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)如下所示,對(duì)FUNC_CFG_ACCESS設(shè)置為1主要是開啟訪問(wèn)內(nèi)嵌函數(shù)寄存器。


繼續(xù)返回sths34pf80_func_cfg_write函數(shù),
之后執(zhí)行如下函數(shù),主要為向寄存器PAGE_RW (11h)的FUNC_CFG_WRITE標(biāo)志位置為為1,啟用嵌入式函數(shù)的寫過(guò)程。
/* Enable write mode */
  page_rw.func_cfg_write = 1;
  ret += sths34pf80_write_reg(add, STHS34PF80_PAGE_RW, (uint8_t *)&page_rw, 1);

在這里插入圖片描述
繼續(xù)返回sths34pf80_func_cfg_write函數(shù),然后執(zhí)行如下函數(shù),該函數(shù)為寫入或者讀取嵌入式函數(shù)的地址,具體要看PAGE_RW (11h)設(shè)置為讀或者寫,同時(shí)寫入固定的data指令,當(dāng)寫完之后進(jìn)入PAGE_RW (11h)關(guān)閉讀或?qū)懖僮鳌?/p>

/* 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,這是個(gè)15位的寄存器,PRESENCE_THS 寄存器(地址范圍為 0x20 到 0x21)主要用于存在檢測(cè)算法的存在閾值設(shè)置。存在檢測(cè)算法用于判斷是否存在某種狀態(tài)或條件,通常與傳感器測(cè)量數(shù)據(jù)相關(guān)。
具體解釋如下:
存在閾值(Presence Threshold): 這是一個(gè)用于存在檢測(cè)算法的閾值。閾值定義了在測(cè)量數(shù)據(jù)中何時(shí)認(rèn)為存在某種條件。在這里,閾值是一個(gè) 15 位的無(wú)符號(hào)整數(shù)(范圍在 0 到 32767 之間)。
默認(rèn)值: 預(yù)設(shè)的存在閾值默認(rèn)值是 200(0x00C8)。

在這里插入圖片描述
接著執(zhí)行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就已經(jīng)設(shè)置完畢,返回sths34pf80_presence_threshold_set函數(shù)中,執(zhí)行sths34pf80_algo_reset操作。

ret += sths34pf80_algo_reset(add);

該函數(shù)具體操作如下所示。

/**
  * @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;
}

該函數(shù)對(duì)RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。默認(rèn)情況下,這個(gè)位的值為 0,表示不進(jìn)行算法重置。當(dāng)用戶修改了與算法相關(guān)的參數(shù)時(shí)(例如閾值、滯后等),需要將 ALGO_ENABLE_RESET 位設(shè)置為 1。重置完成后,ALGO_ENABLE_RESET 位應(yīng)返回到默認(rèn)值 0。
在這里插入圖片描述

接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導(dǎo)入進(jìn)入。

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

到此,sths34pf80_presence_threshold_set函數(shù)就已經(jīng)執(zhí)行完畢。

設(shè)置存在滯后

這里使用的函數(shù)為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)的數(shù)據(jù),同時(shí)進(jìn)行保存到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)這行代碼用于在設(shè)置存在閾值之前,通過(guò)調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來(lái)確保在設(shè)置新的參數(shù)之前傳感器的狀態(tài)是穩(wěn)定且安全的。
緊接著將傳入的數(shù)據(jù)保存到val數(shù)組中,然后執(zhí)行sths34pf80_func_cfg_write將val數(shù)據(jù)傳入到HYST_PRESENCE (27h)中。

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

這個(gè)滯后值有助于避免在邊界值附近產(chǎn)生頻繁的狀態(tài)切換。
默認(rèn)值: 預(yù)設(shè)的滯后值默認(rèn)值是 32(0x32)。
在這里插入圖片描述
例如,假設(shè) PRESENCE_THS 設(shè)置為 200,而 HYST_PRESENCE 設(shè)置為 32。當(dāng)測(cè)量值超過(guò) 200 時(shí),傳感器會(huì)認(rèn)為存在某種狀態(tài)。然后,要從存在狀態(tài)切換到非存在狀態(tài),傳感器必須降低測(cè)量值至少到達(dá) 200 - 32 = 168。只有當(dāng)測(cè)量值降低到 168 以下時(shí),傳感器才會(huì)觸發(fā)狀態(tài)切換。
通過(guò)設(shè)置適當(dāng)?shù)臏笾?,可以防止在測(cè)量值在閾值附近波動(dòng)時(shí)出現(xiàn)不必要的狀態(tài)切換,從而提高存在檢測(cè)的穩(wěn)定性。
接著執(zhí)行sths34pf80_algo_reset函數(shù),該函數(shù)主要對(duì)RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。

ret += sths34pf80_algo_reset(add);

接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導(dǎo)入進(jìn)入。

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

到此,sths34pf80_presence_hysteresis_set函數(shù)就已經(jīng)執(zhí)行完畢。

設(shè)置動(dòng)作閾值

這里使用的函數(shù)為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)的數(shù)據(jù),同時(shí)進(jìn)行保存到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)這行代碼用于在設(shè)置存在閾值之前,通過(guò)調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來(lái)確保在設(shè)置新的參數(shù)之前傳感器的狀態(tài)是穩(wěn)定且安全的。

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

接著將傳入的數(shù)據(jù)保存到buff數(shù)組中,然后執(zhí)行sths34pf80_func_cfg_write將buff數(shù)據(jù)傳入到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)用于設(shè)置運(yùn)動(dòng)檢測(cè)算法的閾值。運(yùn)動(dòng)檢測(cè)算法用于檢測(cè)是否發(fā)生了物體的運(yùn)動(dòng)或動(dòng)作。
以下是這個(gè)寄存器的作用:
運(yùn)動(dòng)閾值(Motion Threshold): 這是一個(gè)用于運(yùn)動(dòng)檢測(cè)算法的閾值。閾值定義了在測(cè)量數(shù)據(jù)中,何時(shí)認(rèn)為發(fā)生了物體的運(yùn)動(dòng)或動(dòng)作。閾值是一個(gè) 15 位的無(wú)符號(hào)整數(shù),其取值范圍在 0 到 32767 之間。
默認(rèn)值: 預(yù)設(shè)的運(yùn)動(dòng)閾值默認(rèn)值是 200(0x00C8)。
例如,如果 MOTION_THS 設(shè)置為 300,這意味著當(dāng)傳感器測(cè)量的某個(gè)特定值超過(guò)了 300,傳感器會(huì)認(rèn)為發(fā)生了運(yùn)動(dòng)或動(dòng)作狀態(tài)。
通過(guò)設(shè)置適當(dāng)?shù)倪\(yùn)動(dòng)閾值,可以根據(jù)應(yīng)用需求來(lái)調(diào)整運(yùn)動(dòng)檢測(cè)的敏感度。更高的閾值會(huì)導(dǎo)致較大的變化才能被視為運(yùn)動(dòng),而較低的閾值則會(huì)使傳感器更敏感,甚至可能在較小的變化時(shí)觸發(fā)運(yùn)動(dòng)檢測(cè)。
在這里插入圖片描述

接著執(zhí)行sths34pf80_algo_reset函數(shù),該函數(shù)主要對(duì)RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。

ret += sths34pf80_algo_reset(add);

接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導(dǎo)入進(jìn)入。

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

到此,sths34pf80_motion_threshold_set函數(shù)就已經(jīng)執(zhí)行完畢。

設(shè)置動(dòng)作滯后

這里使用的函數(shù)為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)的數(shù)據(jù),同時(shí)進(jìn)行保存到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)這行代碼用于在設(shè)置存在閾值之前,通過(guò)調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來(lái)確保在設(shè)置新的參數(shù)之前傳感器的狀態(tài)是穩(wěn)定且安全的。
緊接著將傳入的數(shù)據(jù)保存到val數(shù)組中,然后執(zhí)行sths34pf80_func_cfg_write將val數(shù)據(jù)傳入到HYST_MOTION (26h)中。

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

在運(yùn)動(dòng)檢測(cè)算法中,滯后指的是當(dāng)從運(yùn)動(dòng)狀態(tài)切換到靜止?fàn)顟B(tài)時(shí),需要等待的時(shí)間或條件,以防止在短時(shí)間內(nèi)頻繁地切換狀態(tài)。
默認(rèn)值: 預(yù)設(shè)的滯后值默認(rèn)值是 32(0x32)。
在這里插入圖片描述

例如,如果 MOTION_THS 設(shè)置為 300,而 HYST_MOTION 設(shè)置為 32。當(dāng)測(cè)量值超過(guò) 300 時(shí),傳感器會(huì)認(rèn)為發(fā)生了運(yùn)動(dòng)。然后,要從運(yùn)動(dòng)狀態(tài)切換到非運(yùn)動(dòng)狀態(tài),傳感器必須降低測(cè)量值至少到達(dá) 300 - 32 = 268。只有當(dāng)測(cè)量值降低到 268 以下時(shí),傳感器才會(huì)觸發(fā)狀態(tài)切換。
通過(guò)設(shè)置適當(dāng)?shù)倪\(yùn)動(dòng)滯后值,可以避免在測(cè)量值在運(yùn)動(dòng)狀態(tài)附近波動(dòng)時(shí)產(chǎn)生不必要的狀態(tài)切換,從而提高運(yùn)動(dòng)檢測(cè)的穩(wěn)定性。這類似于存在檢測(cè)中的概念,但針對(duì)的是運(yùn)動(dòng)狀態(tài)。
接著執(zhí)行sths34pf80_algo_reset函數(shù),該函數(shù)主要對(duì)RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。

ret += sths34pf80_algo_reset(add);

接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導(dǎo)入進(jìn)入。

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

到此,sths34pf80_motion_hysteresis_set函數(shù)就已經(jīng)執(zhí)行完畢。

主程序

初始化如下。

/* 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);	//設(shè)置存在閾值。
  sths34pf80_presence_hysteresis_set(STHS34PF80_ADDRESS, 20);//“存在滯后”(Presence Hysteresis)的函數(shù)
  sths34pf80_motion_threshold_set(STHS34PF80_ADDRESS, 300);//設(shè)置動(dòng)作閾值
  sths34pf80_motion_hysteresis_set(STHS34PF80_ADDRESS, 30);	////動(dòng)作滯后”(Motion Hysteresis)的函數(shù)
  /* Set ODR */
  sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_30Hz);

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

main函數(shù)如下所示。

/* 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("-- >環(huán)境溫度沖擊檢測(cè)標(biāo)志位 %d - 存在檢測(cè)標(biāo)志位 %d - 運(yùn)動(dòng)檢測(cè)標(biāo)志位 %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 */

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2541

    文章

    49941

    瀏覽量

    747429
  • 人體感應(yīng)
    +關(guān)注

    關(guān)注

    3

    文章

    64

    瀏覽量

    16921
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    278

    瀏覽量

    14618
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于STM32CUBEMX驅(qū)動(dòng)TMOS模塊STHS34PF80(1)----獲取ID

    STHS34PF80 是一款非冷卻、工廠校準(zhǔn)的紅外運(yùn)動(dòng)和存在檢測(cè)傳感器,工作波長(zhǎng)在 5 μm 至 20 μm 之間。
    的頭像 發(fā)表于 12-01 15:28 ?7740次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>TMOS</b><b class='flag-5'>模塊</b><b class='flag-5'>STHS34PF80</b>(1)----獲取ID

    基于STM32CUBEMX驅(qū)動(dòng)TMOS模塊STHS34PF80(2)----驅(qū)動(dòng)STHS34PF80進(jìn)行人體檢測(cè)

    ASIC 進(jìn)行數(shù)字處理,可以對(duì)其進(jìn)行編程以監(jiān)控運(yùn)動(dòng)、存在或過(guò)熱狀況。 本章主要驅(qū)動(dòng)STHS34PF80,進(jìn)行人體檢測(cè)。
    的頭像 發(fā)表于 12-01 15:29 ?615次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>TMOS</b><b class='flag-5'>模塊</b><b class='flag-5'>STHS34PF80</b>(2)----<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>STHS34PF80</b>進(jìn)行人體<b class='flag-5'>檢測(cè)</b>

    基于STM32CUBEMX驅(qū)動(dòng)TMOS模塊STHS34PF80(4)----中斷獲取信號(hào)

    SHS34PF80的數(shù)據(jù)準(zhǔn)備信號(hào)提供了一種機(jī)制,允許設(shè)備在新的測(cè)量數(shù)據(jù)可讀取時(shí)通知系統(tǒng),并觸發(fā)同步操作,通過(guò)正確配置相關(guān)寄存器,可以確保系統(tǒng)及時(shí)捕獲和處理來(lái)自設(shè)備的新數(shù)據(jù),從而提高整體性能和響應(yīng)能力。
    的頭像 發(fā)表于 12-01 15:31 ?5397次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>TMOS</b><b class='flag-5'>模塊</b><b class='flag-5'>STHS34PF80</b>(4)----中斷獲取信號(hào)

    基于STM32CUBEMX驅(qū)動(dòng)TMOS模塊STHS34PF80(5)----配置嵌入式函數(shù)

    STHS34PF80傳感器項(xiàng)目種修改 Arduino 腳本,重新移植到STM32的MCU中。
    的頭像 發(fā)表于 12-01 15:33 ?640次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>TMOS</b><b class='flag-5'>模塊</b><b class='flag-5'>STHS34PF80</b>(5)----配置嵌入式函數(shù)

    基于STM32CUBEMX驅(qū)動(dòng)TMOS模塊STHS34PF80(6)----獲取狀態(tài)數(shù)據(jù)

    STHS34PF80傳感器項(xiàng)目種修改 Arduino 腳本,重新移植到STM32的MCU中。 該項(xiàng)目基于STHS34PF80 IR溫度傳感器,能夠
    的頭像 發(fā)表于 12-01 15:39 ?543次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>TMOS</b><b class='flag-5'>模塊</b><b class='flag-5'>STHS34PF80</b>(6)----獲取狀態(tài)數(shù)據(jù)

    通過(guò)STEVAL-MKI109V3在unico上識(shí)別不到STHS34PF80是為什么?怎么處理?

    TMOS測(cè)試:通過(guò)STEVAL-MKI109V3在unico上識(shí)別不到STHS34PF80。
    發(fā)表于 03-26 08:31

    stm32cubemx教程

    stm32cubemx教程,需要學(xué)習(xí)的看看,免積分
    發(fā)表于 11-02 10:16 ?0次下載

    STM32CubeMX 窗口及工具介紹

    STM32CubeMX 系列教程之 STM32CubeMX 窗口及 STM32PackCreator 工具介紹,內(nèi)附詳細(xì)圖文介紹。
    發(fā)表于 12-14 18:51 ?26次下載
    <b class='flag-5'>STM32CubeMX</b> 窗口及工具介紹

    使用stm32cubemx的usb-host-cdc庫(kù)驅(qū)動(dòng)EC20模塊

    使用stm32cubemx的usb-host-cdc庫(kù)驅(qū)動(dòng)EC20模塊開發(fā)環(huán)境:實(shí)現(xiàn)功能:開始1、使用STM32CubeMX配置工程,生成基礎(chǔ)代碼2、
    發(fā)表于 12-28 19:48 ?41次下載
    使用<b class='flag-5'>stm32cubemx</b>的usb-host-cdc庫(kù)<b class='flag-5'>驅(qū)動(dòng)</b>EC20<b class='flag-5'>模塊</b>

    STM32CubeMX | STM32基于HAL實(shí)現(xiàn)USB模擬U盤

    STM32CubeMX | STM32基于HAL實(shí)現(xiàn)USB模擬U盤目錄STM32CubeMX | STM32基于HAL實(shí)現(xiàn)USB模擬U盤(1)工程配置(2)代碼
    發(fā)表于 12-28 20:04 ?36次下載
    <b class='flag-5'>STM32CubeMX</b> | <b class='flag-5'>STM32</b>基于HAL實(shí)現(xiàn)USB模擬U盤

    意法半導(dǎo)體發(fā)布新型人體存在和移動(dòng)檢測(cè)芯片

    ????????意法半導(dǎo)體發(fā)布新型人體存在和移動(dòng)檢測(cè)芯片。STHS34PF80是一款帶有微加工熱敏晶體管(TMOS)的高集成度、超低功耗的紅外(IR)傳感器,可取代傳統(tǒng)的被動(dòng)紅外(PIR)傳感技術(shù),提升安保監(jiān)視系統(tǒng)、家庭自動(dòng)化設(shè)
    的頭像 發(fā)表于 07-28 15:13 ?789次閱讀

    意法半導(dǎo)發(fā)布了新型人體存在和移動(dòng)檢測(cè)芯片:STHS34PF80

    近期,意法半導(dǎo)發(fā)布了新型人體存在和移動(dòng)檢測(cè)芯片:STHS34PF80,它是一款帶有微加工熱敏晶體管(TMOS)的高集成度、超低功耗的紅外(IR)傳感器,可取代傳統(tǒng)的被動(dòng)紅外(PIR)傳感技術(shù),提升安保監(jiān)視系統(tǒng)、家庭自動(dòng)化設(shè)備和物
    的頭像 發(fā)表于 07-30 09:47 ?1555次閱讀

    ST TMOS熱敏紅外傳感器: 精準(zhǔn)檢測(cè)人員存在和移動(dòng)

    意法半導(dǎo)發(fā)布新型人體存在和移動(dòng)檢測(cè)芯片。STHS34PF80是一款帶有微加工熱敏晶體管(TMOS)的高集成度、超低功耗的紅外(IR)傳感器,可取代傳統(tǒng)的被動(dòng)紅外(PIR)傳感技術(shù),提升安保監(jiān)視系統(tǒng)、家庭自動(dòng)化設(shè)備和物聯(lián)網(wǎng)設(shè)備等場(chǎng)
    發(fā)表于 08-08 14:48 ?482次閱讀

    STHS34PF80人體存在傳感器(1)----獲取人體存在狀態(tài)

    STHS34PF80是一款高性能的紅外(IR)傳感器,特別適用于檢測(cè)存在感和運(yùn)動(dòng)。其主要特點(diǎn)是高靈敏度,能在沒有透鏡的情況下探測(cè)到4米遠(yuǎn)的物體(尺寸為70 x 25厘米),并配有集成的硅紅外濾波器
    的頭像 發(fā)表于 01-09 15:51 ?486次閱讀
    <b class='flag-5'>STHS34PF80</b>人體存在傳感器(1)----獲取人體存在狀態(tài)

    基于ST 紅外傳感器STHS34PF80 搭配菲涅爾透鏡針對(duì)投影機(jī)應(yīng)用方案

    STHS34PF80 是一款紅外線感測(cè)器,可用于偵測(cè)靜止和移動(dòng)物體的存及超溫條件。它采用獨(dú)特的 TMOS 技術(shù)測(cè)量物體的紅外線輻射,當(dāng)物體位于視野內(nèi)時(shí)檢測(cè)其存在或移動(dòng)。
    的頭像 發(fā)表于 01-30 14:16 ?683次閱讀
    基于ST 紅外傳感器<b class='flag-5'>STHS34PF80</b> 搭配菲涅爾透鏡針對(duì)投影機(jī)應(yīng)用方案