概述
用于配置和設(shè)置 STHS34PF80 傳感器的一些參數(shù),以便進行存在檢測和運動檢測。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
樣品申請
https://www.wjx.top/vm/OhcKxJk.aspx#
視頻教程
https://www.bilibili.com/video/BV1Qm4y1p79X/
完整代碼下載
https://download.csdn.net/download/qq_24312945/88216813
參考程序初始化
相對于驅(qū)動人體檢測demo,新的案例設(shè)置了傳感器的存在和運動相關(guān)的閾值、滯后和中斷配置,以實現(xiàn)存在檢測和運動檢測的功能,并在相關(guān)事件發(fā)生時觸發(fā)中斷。
省電模式
下面文本描述了關(guān)機模式的使用和功能。關(guān)機模式是一種休眠模式,用于將傳感器設(shè)備置于休眠狀態(tài),從而節(jié)省功耗。在關(guān)機模式下,設(shè)備停止數(shù)據(jù)采集,并且大部分內(nèi)部模塊都被關(guān)閉,以最小化電流消耗。這使得傳感器在供電的情況下能夠?qū)崿F(xiàn)最低的功耗水平。
盡管設(shè)備處于關(guān)機模式,但它仍保持 I2C / SPI 通信串口處于活動狀態(tài),以便能夠與設(shè)備進行通信和配置設(shè)置。關(guān)機模式下,配置寄存器的內(nèi)容被保留,而輸出數(shù)據(jù)寄存器不會更新,這意味著在進入關(guān)機模式前,最后一次采樣的數(shù)據(jù)將保留在內(nèi)存中。
為了進入關(guān)機模式并避免在重新進入連續(xù)模式時讀取錯誤的輸出數(shù)據(jù),文本提供了正確的步驟。然而,這些步驟在你的問題中并未提供,因此無法給出完整的步驟。
上面文檔主要對0x25,0x23,0x20寄存器進行操作,其中讀取0x25多次,主要功能是對STATUS (23h)的DRDY進行清0。
查看下面表格也可以得知,有多種操作可以對STATUS (23h)的DRDY 清零。
其中0x20是配置速率寄存器。
設(shè)置存在閾值
存在檢測如下所示。
以設(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ù),同時進行保存到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è)置存在閾值之前,通過調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來確保在設(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主要功能是對STATUS (23h)的DRDY進行清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代碼主要是對STATUS (23h)的DRDY進行讀取,當讀取為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ù)清零,同時讀取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
然后執(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ù)讀取出來,接著執(zhí)行sths34pf80_tmos_odr_check_safe_set(add, ctrl1, 0),該函數(shù)上面已經(jīng)講解,主要是進入一個掉電模式,確保在設(shè)置新的參數(shù)之前傳感器的狀態(tài)是穩(wěn)定且安全的,以防止設(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)如下所示,對FUNC_CFG_ACCESS設(shè)置為1主要是開啟訪問內(nèi)嵌函數(shù)寄存器。
繼續(xù)返回sths34pf80_func_cfg_write函數(shù),
之后執(zhí)行如下函數(shù),主要為向寄存器PAGE_RW (11h)的FUNC_CFG_WRITE標志位置為為1,啟用嵌入式函數(shù)的寫過程。
/* 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è)置為讀或者寫,同時寫入固定的data指令,當寫完之后進入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,這是個15位的寄存器,PRESENCE_THS 寄存器(地址范圍為 0x20 到 0x21)主要用于存在檢測算法的存在閾值設(shè)置。存在檢測算法用于判斷是否存在某種狀態(tài)或條件,通常與傳感器測量數(shù)據(jù)相關(guān)。
具體解釋如下:
存在閾值(Presence Threshold): 這是一個用于存在檢測算法的閾值。閾值定義了在測量數(shù)據(jù)中何時認為存在某種條件。在這里,閾值是一個 15 位的無符號整數(shù)(范圍在 0 到 32767 之間)。
默認值: 預設(shè)的存在閾值默認值是 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ù)對RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。默認情況下,這個位的值為 0,表示不進行算法重置。當用戶修改了與算法相關(guān)的參數(shù)時(例如閾值、滯后等),需要將 ALGO_ENABLE_RESET 位設(shè)置為 1。重置完成后,ALGO_ENABLE_RESET 位應(yīng)返回到默認值 0。
接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導入進入。
/* 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ù),同時進行保存到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è)置存在閾值之前,通過調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來確保在設(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);
這個滯后值有助于避免在邊界值附近產(chǎn)生頻繁的狀態(tài)切換。
默認值: 預設(shè)的滯后值默認值是 32(0x32)。
例如,假設(shè) PRESENCE_THS 設(shè)置為 200,而 HYST_PRESENCE 設(shè)置為 32。當測量值超過 200 時,傳感器會認為存在某種狀態(tài)。然后,要從存在狀態(tài)切換到非存在狀態(tài),傳感器必須降低測量值至少到達 200 - 32 = 168。只有當測量值降低到 168 以下時,傳感器才會觸發(fā)狀態(tài)切換。
通過設(shè)置適當?shù)臏笾?,可以防止在測量值在閾值附近波動時出現(xiàn)不必要的狀態(tài)切換,從而提高存在檢測的穩(wěn)定性。
接著執(zhí)行sths34pf80_algo_reset函數(shù),該函數(shù)主要對RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。
ret += sths34pf80_algo_reset(add);
接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導入進入。
/* Set saved odr back */
ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);
到此,sths34pf80_presence_hysteresis_set函數(shù)就已經(jīng)執(zhí)行完畢。
設(shè)置動作閾值
這里使用的函數(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ù),同時進行保存到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è)置存在閾值之前,通過調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來確保在設(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è)置運動檢測算法的閾值。運動檢測算法用于檢測是否發(fā)生了物體的運動或動作。
以下是這個寄存器的作用:
運動閾值(Motion Threshold): 這是一個用于運動檢測算法的閾值。閾值定義了在測量數(shù)據(jù)中,何時認為發(fā)生了物體的運動或動作。閾值是一個 15 位的無符號整數(shù),其取值范圍在 0 到 32767 之間。
默認值: 預設(shè)的運動閾值默認值是 200(0x00C8)。
例如,如果 MOTION_THS 設(shè)置為 300,這意味著當傳感器測量的某個特定值超過了 300,傳感器會認為發(fā)生了運動或動作狀態(tài)。
通過設(shè)置適當?shù)倪\動閾值,可以根據(jù)應(yīng)用需求來調(diào)整運動檢測的敏感度。更高的閾值會導致較大的變化才能被視為運動,而較低的閾值則會使傳感器更敏感,甚至可能在較小的變化時觸發(fā)運動檢測。
接著執(zhí)行sths34pf80_algo_reset函數(shù),該函數(shù)主要對RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。
ret += sths34pf80_algo_reset(add);
接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導入進入。
/* Set saved odr back */
ret += sths34pf80_tmos_odr_check_safe_set(add, ctrl1, odr);
到此,sths34pf80_motion_threshold_set函數(shù)就已經(jīng)執(zhí)行完畢。
設(shè)置動作滯后
這里使用的函數(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ù),同時進行保存到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è)置存在閾值之前,通過調(diào)用 sths34pf80_tmos_odr_check_safe_set 函數(shù)來確保在設(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);
在運動檢測算法中,滯后指的是當從運動狀態(tài)切換到靜止狀態(tài)時,需要等待的時間或條件,以防止在短時間內(nèi)頻繁地切換狀態(tài)。
默認值: 預設(shè)的滯后值默認值是 32(0x32)。
例如,如果 MOTION_THS 設(shè)置為 300,而 HYST_MOTION 設(shè)置為 32。當測量值超過 300 時,傳感器會認為發(fā)生了運動。然后,要從運動狀態(tài)切換到非運動狀態(tài),傳感器必須降低測量值至少到達 300 - 32 = 268。只有當測量值降低到 268 以下時,傳感器才會觸發(fā)狀態(tài)切換。
通過設(shè)置適當?shù)倪\動滯后值,可以避免在測量值在運動狀態(tài)附近波動時產(chǎn)生不必要的狀態(tài)切換,從而提高運動檢測的穩(wěn)定性。這類似于存在檢測中的概念,但針對的是運動狀態(tài)。
接著執(zhí)行sths34pf80_algo_reset函數(shù),該函數(shù)主要對RESET_ALGO (2Ah)的ALGO_ENABLE_RESET 置為位1,執(zhí)行算法重置操作。
ret += sths34pf80_algo_reset(add);
接著執(zhí)行sths34pf80_tmos_odr_check_safe_set,將剛剛保存的ODR數(shù)據(jù)重新導入進入。
/* 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è)置動作閾值
sths34pf80_motion_hysteresis_set(STHS34PF80_ADDRESS, 30); ////動作滯后”(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)境溫度沖擊檢測標志位 %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 */
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2551文章
51097瀏覽量
753524 -
人體感應(yīng)
+關(guān)注
關(guān)注
3文章
64瀏覽量
16988 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14807
發(fā)布評論請先 登錄
相關(guān)推薦
評論