概述
STHS34PF80 是一款非冷卻、工廠校準的紅外運動和存在檢測傳感器,工作波長在 5 μm 至 20 μm 之間。STHS34PF80 傳感器設計用于測量視野內物體發(fā)出的紅外輻射量。該信息由 ASIC 進行數(shù)字處理,可以對其進行編程以監(jiān)控運動、存在或過熱狀況。
本章主要驅動STHS34PF80,進行人體檢測。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
樣品申請
https://www.wjx.top/vm/OhcKxJk.aspx#
視頻教程
https://www.bilibili.com/video/BV18z4y1g7BA/
完整代碼下載
https://download.csdn.net/download/qq_24312945/88216813
參考Demo
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/sths34pf80_STdC/examples/sths34pf80_tmos_data_polling.c
引導
在設備上電后,它會執(zhí)行一個2.5毫秒的引導過程,將校準系數(shù)從嵌入式閃存下載到內部寄存器,并加載AVG_TRIM(10h)、CTRL0(17h)和SENS_DATA(1Dh)寄存器的默認內容。在引導時間內,設備的寄存器不可訪問。
引導完成后,設備會自動配置為電源關閉模式。
在上電后,可以通過將CTRL2(21h)寄存器的BOOT位設置為1,重新啟動引導過程,以重新加載上述寄存器的默認值。不需要切換設備電源線。
在重新啟動時間內,設備的寄存器不可訪問。重新啟動完成后,設備會自動配置為之前的操作模式,并且BOOT位會自動清除為0。
溫度測量濾波方式
首先需要設置AVG_TRIM (10h) 寄存器用于配置溫度平均值濾波的參數(shù),以控制環(huán)境溫度和目標溫度測量的平滑度和穩(wěn)定性。在溫度測量中,可能會受到噪聲和干擾的影響,這可能導致短期內測量值的波動。通過應用平均值濾波,可以平滑這些波動,從而得到更加穩(wěn)定的溫度數(shù)據(jù)。AVG_TRIM 寄存器中的設置會決定平均值濾波的級別,從而影響濾波的時間常數(shù)以及平滑度。
這里默認參數(shù)如下
- 在AVG_TRIM(10h)寄存器中寫入02h // AVG_T = 8,AVG_TMOS = 32
- 在CTRL1(20h)寄存器中寫入07h // ODR = 15 Hz
AVG_T[1:0]: 這個設置位用于選擇環(huán)境溫度的平均值濾波樣本數(shù)。
AVG_TMOS[2:0]: 這個設置位用于選擇目標溫度的平均值濾波樣本數(shù)以及與之相關的噪聲水平。
參考demo中將AVG_TMOS [2:0] 和AVG_T[1:0] 分為了2個函數(shù)進行操作。
修改后操作如下所示。
/**
* @brief Select number of averages for object temperature.[set]
*
* @param ctx read / write interface definitions
* @param val AVG_TMOS_2, AVG_TMOS_8, AVG_TMOS_32, AVG_TMOS_128, AVG_TMOS_256, AVG_TMOS_512, AVG_TMOS_1024, AVG_TMOS_2048,
* @retval interface status (MANDATORY: return 0 - > no Error)
*
*/
uint8_t sths34pf80_avg_tobject_num_set(uint8_t add, sths34pf80_avg_tobject_num_t val)
{
sths34pf80_avg_trim_t avg_trim;
int32_t ret;
ret = sths34pf80_read_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
if (ret == HAL_OK)
{
avg_trim.avg_tmos = ((uint8_t)val & 0x7U);
ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
}
return ret;
}
/**
* @brief Select number of averages for ambient temperature.[set]
*
* @param ctx read / write interface definitions
* @param val AVG_T_8, AVG_T_4, AVG_T_2, AVG_T_1,
* @retval interface status (MANDATORY: return 0 - > no Error)
*
*/
uint8_t sths34pf80_avg_tambient_num_set(uint8_t add, sths34pf80_avg_tambient_num_t val)
{
sths34pf80_avg_trim_t avg_trim;
int32_t ret;
ret = sths34pf80_read_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
if (ret == HAL_OK)
{
avg_trim.avg_t = ((uint8_t)val & 0x3U);
ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&avg_trim, 1);
}
return ret;
}
使用如下所示,這里設置參數(shù)為STHS34PF80_AVG_TMOS_32和STHS34PF80_AVG_T_8。
/* 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);
智能識別算法
STHS34PF80嵌入了智能數(shù)字算法,以支持以下三種檢測模式:
? 存在檢測
? 運動檢測
? 環(huán)境溫度沖擊檢測
這些算法分別使用不同的低通濾波器(LPF_P、LPF_M和LPF_A_T)。此外,存在和運動檢測算法使用另一個共同的低通濾波器(LPF_P_M)。這些濾波器用于生成中間信號(TPRESENCE、TMOTION和TAMB_SHOCK),可以用于對算法本身進行微調。這些濾波器的截止頻率值可以通過它們各自的位范圍進行配置,這些位范圍可以在LPF1(0Ch)和LPF2(0Dh)寄存器中找到,如下所示。
寄存器LPF1 (0Ch)和LPF2 (0Dh)如下所示。
案例中只是對濾波器進行了讀取以及打印。
修改后如下所示。
/* 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);
![在這里插入圖片描述](https://img-blog.csdnimg.cn/5321efc1d74b42098bac6a940073f89b.png)
使用塊數(shù)據(jù)更新(BDU)功能
如果讀取輸出數(shù)據(jù)的時機與數(shù)據(jù)準備信號不同步,強烈建議在CTRL1(20h)寄存器中將BDU(塊數(shù)據(jù)更新)位設置為1。
此功能可以避免讀取與不同采樣相關的寄存器值(輸出數(shù)據(jù)的最高和最低字節(jié))。
案例也是設置了BDU。
BDU在CTRL1 (20h)寄存器中。
修改后的操作如下所示。
/* Set BDU */
sths34pf80_block_data_update_set(STHS34PF80_ADDRESS, 1);
設置ODR速率
初始化完畢之后需要通過CTRL1(20h)寄存器中的ODR[3:0]位范圍選擇其中一種操作模式(連續(xù)模式),或者在CTRL2(21h)寄存器中將ONE_SHOT位設置為1(單次觸發(fā)模式)。
當配置了寄存器LPF1 (0Ch)和LPF2 (0Dh) 的LPF_P、LPF_M和LPF_A_T、LPF_P_M濾波器之后,可以去設置ODR速率。
這里設置速率為30HZ。
/* Set ODR */
sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_30Hz);
狀態(tài)寄存器
初始化完畢之后,可以通過狀態(tài)寄存器STATUS (23h)獲取DRDY標志位。數(shù)據(jù)就緒信號由STATUS寄存器的DRDY位表示。當新的數(shù)據(jù)可用時,此位被設置為1,并在讀取FUNC_STATUS(25h)寄存器后被清除。
主程序中會去獲取改狀態(tài)位,若為1,則代表數(shù)據(jù)已經(jīng)準備完畢,可以進行獲取和打印。
FUNC_STATUS(25h)主要檢測三個標志位:PRES_FLAG、MOT_FLAG 和 TAMB_SHOCK_FLAG,這些標志位用于檢測不同類型的事件。
PRES_FLAG是存在檢測標志位。當存在檢測到人員存在時,此位變?yōu)?。
MOT_FLAG:運動檢測標志位。當檢測到運動時,此位變?yōu)?。
TAMB_SHOCK_FLAG:環(huán)境溫度沖擊檢測標志位。當檢測到環(huán)境溫度沖擊時,此位變?yōu)?。
修改完畢主程序如下所示。
/* 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 */
main.c
/* 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_2048);
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);
/* Set ODR */
sths34pf80_tmos_odr_set(STHS34PF80_ADDRESS, STHS34PF80_TMOS_ODR_AT_1Hz);
int32_t cnt = 0;
/* USER CODE END 2 */
/* 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 */
審核編輯:湯梓紅
-
傳感器
+關注
關注
2545文章
50445瀏覽量
751031 -
模塊
+關注
關注
7文章
2655瀏覽量
47292 -
寄存器
+關注
關注
31文章
5294瀏覽量
119814 -
人體檢測
+關注
關注
1文章
16瀏覽量
11163
發(fā)布評論請先 登錄
相關推薦
評論