概述
HS34PF80的數(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)能力。
檢測(cè)人體的存在和動(dòng)作,并通過(guò)特定的通信接口發(fā)送檢測(cè)結(jié)果。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請(qǐng):615061293 。
樣品申請(qǐng)
https://www.wjx.top/vm/OhcKxJk.aspx#
視頻教程
https://www.bilibili.com/video/BV1NF41117S6/
參考Demo
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/sths34pf80_STdC/examples/sths34pf80_tmos_data_polling.c
完整代碼下載
https://download.csdn.net/download/qq_24312945/88219177
參考程序中斷
中斷生成
STHS34PF80具有一個(gè)可配置的內(nèi)置中斷生成塊,允許基于溫度數(shù)據(jù)樣本和嵌入式智能數(shù)字算法的輸出標(biāo)志生成中斷事件。
STHS34PF80提供了一個(gè)專門的INT引腳,用于通知數(shù)據(jù)是否準(zhǔn)備好。您可以通過(guò)配置相關(guān)寄存器,將數(shù)據(jù)準(zhǔn)備好的信號(hào)(DRDY信號(hào))路由到這個(gè)INT引腳。當(dāng)新的測(cè)量數(shù)據(jù)可讀取時(shí),這個(gè)引腳會(huì)被觸發(fā),從而允許系統(tǒng)知道數(shù)據(jù)已經(jīng)準(zhǔn)備好并可供進(jìn)一步的處理和讀取。
設(shè)置中斷
設(shè)置中斷可以通過(guò)CTRL3 (22h)寄存器來(lái)配置。
這個(gè)寄存器為系統(tǒng)提供了有關(guān)設(shè)備當(dāng)前狀態(tài)的關(guān)鍵信息,可以用于驅(qū)動(dòng)其他邏輯或觸發(fā)相應(yīng)的操作,如中斷服務(wù)例程。例如,PRES_FLAG可用于確定是否有人進(jìn)入了一個(gè)區(qū)域,MOT_FLAG可以用于檢測(cè)人體是否運(yùn)動(dòng),TAMB_SHOCK_FLAG可能用于環(huán)境監(jiān)控系統(tǒng)以捕捉突然的溫度變化。
通過(guò)查看FUNC_STATUS (25h)可以得知,PRES_FLAG為存在檢測(cè),MOT_FLAG為運(yùn)動(dòng)檢測(cè),TAMB_SHOCK_FLAG為環(huán)境溫度沖擊檢測(cè)標(biāo)志。
開(kāi)啟存在檢測(cè)中斷輸出
sths34pf80_tmos_int_or_set 的主要目的是配置STHS34PF80設(shè)備的中斷輸出。它是用于設(shè)置和管理中斷標(biāo)志,其中STHS34PF80_TMOS_INT_PRESENCE為0x4,就是使能INT_MSK2為1,開(kāi)啟PRES_FLAG存在檢測(cè)。
/* Set interrupt */
sths34pf80_tmos_int_or_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_PRESENCE);
具體操作函數(shù)如下所示。
/**
* @brief Selects interrupts output.[set]
*
* @param ctx read / write interface definitions
* @param val TMOS_INT_NONE, TMOS_INT_TSHOCK, TMOS_INT_MOTION, TMOS_INT_TSHOCK_MOTION, TMOS_INT_PRESENCE, TMOS_INT_TSHOCK_PRESENCE, TMOS_INT_MOTION_PRESENCE, TMOS_INT_ALL,
* @retval interface status (MANDATORY: return 0 - > no Error)
*
*/
uint8_t sths34pf80_tmos_int_or_set(uint8_t add, sths34pf80_tmos_int_or_t val)
{
sths34pf80_ctrl3_t ctrl3;
int32_t ret;
ret = sths34pf80_read_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);
if (ret == HAL_OK)
{
ctrl3.int_msk = ((uint8_t)val & 0x7U);
ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);
}
return ret;
}
配置中斷管腳
通過(guò)配置CTRL3 (22h)寄存器的IEN[1:0] 可以設(shè)置輸出模式。
IEN[1:0]位在CTRL3寄存器中,它定義了應(yīng)該將哪種信號(hào)路由到INT管腳(即中斷輸出):
00:INT管腳處于高阻態(tài)。
01:將DRDY(數(shù)據(jù)已準(zhǔn)備好的信號(hào))路由到INT管腳。
10:將INT_OR信號(hào)路由到INT管腳。
這里通過(guò)將CTRL3(22h)寄存器的IEN[1:0]位范圍設(shè)置為10,可以將STATUS(23h)寄存器的DRDY位的值驅(qū)動(dòng)到INT引腳,操作如下所示。
sths34pf80_tmos_route_int_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_OR);
具體的操作函數(shù)如下所示。這個(gè)函數(shù)基本上對(duì)應(yīng)之前提到的IEN[1:0]位的功能,它允許用戶選擇要路由到中斷輸出管腳的特定中斷信號(hào)。
/**
* @defgroup Interrupt PINs
* @brief Interrupt PINs
* @{/
*
*/
/**
* @brief Selects interrupts to be routed.[set]
*
* @param ctx read / write interface definitions
* @param val TMOS_INT_HIZ, TMOS_INT_DRDY, TMOS_INT_OR,
* @retval interface status (MANDATORY: return 0 - > no Error)
*
*/
uint8_t sths34pf80_tmos_route_int_set(uint8_t add, sths34pf80_tmos_route_int_t val)
{
sths34pf80_ctrl3_t ctrl3;
int32_t ret;
ret = sths34pf80_read_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);
if (ret == HAL_OK)
{
ctrl3.ien = ((uint8_t)val & 0x3U);
if (val == STHS34PF80_TMOS_INT_OR) {
ctrl3.int_latched = 0; /* guarantee that latched is zero in INT_OR case */
}
ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&ctrl3, 1);
}
return ret;
}
主程序
初始化如下。
/* 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_tmos_route_int_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_OR);
sths34pf80_presence_threshold_set(STHS34PF80_ADDRESS, 20); //設(shè)置存在閾值。
sths34pf80_presence_hysteresis_set(STHS34PF80_ADDRESS, 2);//“存在滯后”(Presence Hysteresis)的函數(shù)
sths34pf80_motion_threshold_set(STHS34PF80_ADDRESS, 30);//設(shè)置動(dòng)作閾值
sths34pf80_motion_hysteresis_set(STHS34PF80_ADDRESS, 3); ////動(dòng)作滯后”(Motion Hysteresis)的函數(shù)
/* Set interrupt */
sths34pf80_tmos_int_or_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_PRESENCE);
sths34pf80_tmos_route_int_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_INT_OR);
/* 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);
// }
printf("PA7=%d",HAL_GPIO_ReadPin ( GPIOA, GPIO_PIN_7));
sths34pf80_tmos_func_status_t func_status;
uint8_t motion;
uint8_t presence;
/* handle event in a "thread" alike code */
if(HAL_GPIO_ReadPin ( GPIOA, GPIO_PIN_7))
{
motion = 0;
presence = 0;
do {
sths34pf80_tmos_func_status_get(STHS34PF80_ADDRESS, &func_status);
if (func_status.pres_flag != presence)
{
presence = func_status.pres_flag;
if (presence) {
printf("Start of Presencern");
} else {
printf("End of Presencern");
}
}
if (func_status.mot_flag != motion)
{
motion = func_status.mot_flag;
if (motion) {
printf("Motion Detected!rn");
}
}
} while (func_status.pres_flag);
}
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
測(cè)試結(jié)果
在未有人的情況下。
在人體純?cè)谇闆r下。
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2551文章
51097瀏覽量
753527 -
模塊
+關(guān)注
關(guān)注
7文章
2706瀏覽量
47468 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41495 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14807
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論