概述
STHS34PF80是一款高性能的紅外(IR)傳感器,特別適用于檢測(cè)存在感和運(yùn)動(dòng)。其主要特點(diǎn)是高靈敏度,能在沒(méi)有透鏡的情況下探測(cè)到4米遠(yuǎn)的物體(尺寸為70 x 25厘米),并配有集成的硅紅外濾波器。這款傳感器能夠區(qū)分靜止和移動(dòng)物體,并具有80°的視場(chǎng)角。它出廠時(shí)已校準(zhǔn),且設(shè)計(jì)為低功耗,包含用于提高探測(cè)效果的智能算法。
其應(yīng)用范圍廣泛,不僅包括存在感和接近感應(yīng)、報(bào)警/安全系統(tǒng)、智能家居、智能照明、物聯(lián)網(wǎng)、智能儲(chǔ)物柜和智能墻板,還特別適用于檢測(cè)人體的存在。由于其高靈敏度和精確度,它能夠有效地用于人體檢測(cè),如在安保系統(tǒng)中探測(cè)潛在的入侵者,或在智能家居系統(tǒng)中監(jiān)測(cè)房間內(nèi)的人員動(dòng)態(tài)。
最近在弄ST的課程,需要樣片的可以加群申請(qǐng):615061293 。
視頻教學(xué)
[https://www.bilibili.com/video/BV1om4ae5EBR/]
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#]
完整代碼下載
[https://download.csdn.net/download/qq_24312945/89741150]
主要特點(diǎn)
高靈敏度探測(cè): 專為探測(cè)紅外線的存在和運(yùn)動(dòng)設(shè)計(jì),具有高靈敏度。
探測(cè)范圍: 能夠在沒(méi)有透鏡的情況下,探測(cè)到70 x 25厘米大小的物體,最遠(yuǎn)達(dá)4米。
集成硅紅外濾波器: 通過(guò)濾除非紅外波長(zhǎng),確保精確探測(cè)。
靜態(tài)和運(yùn)動(dòng)物體探測(cè): 能夠檢測(cè)到靜止和移動(dòng)的物體。
視場(chǎng)角: 提供80°的視場(chǎng)角。
出廠校準(zhǔn): 出廠即校準(zhǔn),保證了即插即用的可靠性和準(zhǔn)確性。
低功耗設(shè)計(jì): 設(shè)計(jì)注重能效,確保低能耗。
嵌入式智能算法: 用于提升存在感和運(yùn)動(dòng)探測(cè)的效果。
硬件準(zhǔn)備
首先需要準(zhǔn)備一個(gè)開發(fā)板,這里我準(zhǔn)備的是自己繪制的開發(fā)板,需要的可以進(jìn)行申請(qǐng)。
主控為STM32H503CB,TMOS為STHS34PF80。
接口
STHS34PF80模塊接口的示意圖如下所示,支持IIC或者SPI通訊。
最大速率可以達(dá)到1M。
最小系統(tǒng)圖
生成STM32CUBEMX
用STM32CUBEMX生成例程,這里使用MCU為STM32H503CB。 配置時(shí)鐘樹,配置時(shí)鐘為250M。
串口配置
查看原理圖,PA9和PA10設(shè)置為開發(fā)板的串口。
配置串口,速率為2000000。
IIC配置
STHS34PF80配置IIC速度為400k
CS設(shè)置
STS34PF80IO設(shè)置如下所示。 在IIC模式下CS需要給個(gè)高電平。
官方提供IIC接線如下所示。
設(shè)置PB8為輸出口。
串口重定向
打開魔術(shù)棒,勾選MicroLIB
在main.c中,添加頭文件,若不添加會(huì)出現(xiàn) identifier "FILE" is undefined報(bào)錯(cuò)。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
函數(shù)聲明和串口重定向:
/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
參考案例
[https://github.com/STMicroelectronics/sths34pf80-pid]
獲取ID
參考例程序中對(duì)應(yīng)的獲取ID驅(qū)動(dòng)程序,如下所示。
獲取ID可以查看0x0F,讀出來(lái)的值應(yīng)該為0xD3。
對(duì)應(yīng)的獲取ID驅(qū)動(dòng)程序,如下所示。
printf("HELLO!n");
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
HAL_Delay(100);
stmdev_ctx_t dev_ctx;
uint8_t whoami;
sths34pf80_lpf_bandwidth_t lpf_m, lpf_p, lpf_p_m, lpf_a_t;
sths34pf80_drdy_status_t status;
sths34pf80_func_status_t func_status;
/* Initialize mems driver interface */
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
dev_ctx.mdelay = platform_delay;
dev_ctx.handle = &SENSOR_BUS;
/* Initialize platform specific hardware */
// platform_init();
/* Wait sensor boot time */
platform_delay(BOOT_TIME);
/* Check device ID */
sths34pf80_device_id_get(&dev_ctx, &whoami);
printf("STHS34PF80_ID=0x%x,whoamI=0x%xn",STHS34PF80_ID,whoami);
if (whoami != STHS34PF80_ID)
while(1);
溫度測(cè)量濾波方式
首先需要設(shè)置AVG_TRIM (10h) 寄存器用于配置溫度平均值濾波的參數(shù),以控制環(huán)境溫度和目標(biāo)溫度測(cè)量的平滑度和穩(wěn)定性。在溫度測(cè)量中,可能會(huì)受到噪聲和干擾的影響,這可能導(dǎo)致短期內(nèi)測(cè)量值的波動(dòng)。通過(guò)應(yīng)用平均值濾波,可以平滑這些波動(dòng),從而得到更加穩(wěn)定的溫度數(shù)據(jù)。AVG_TRIM 寄存器中的設(shè)置會(huì)決定平均值濾波的級(jí)別,從而影響濾波的時(shí)間常數(shù)以及平滑度。
這里默認(rèn)參數(shù)如下
- 在AVG_TRIM(10h)寄存器中寫入02h // AVG_T = 8,AVG_TMOS = 32
- 在CTRL1(20h)寄存器中寫入07h // ODR = 15 Hz
AVG_T[1:0]: 這個(gè)設(shè)置位用于選擇環(huán)境溫度的平均值濾波樣本數(shù)。
AVG_TMOS[2:0]: 這個(gè)設(shè)置位用于選擇目標(biāo)溫度的平均值濾波樣本數(shù)以及與之相關(guān)的噪聲水平。
對(duì)象溫度的平均值數(shù)量 (sths34pf80_avg_tobject_num_set 函數(shù)): 這個(gè)函數(shù)設(shè)置用于測(cè)量對(duì)象溫度的平均值數(shù)量。參數(shù) val 可以是多種不同的值,例如 AVG_TMOS_2, AVG_TMOS_8, AVG_TMOS_32, 等等,表示不同的平均值數(shù)量。這些設(shè)置影響傳感器輸出的平滑程度和響應(yīng)速度,高的平均值數(shù)量會(huì)增加輸出數(shù)據(jù)的平滑度,但也可能增加響應(yīng)時(shí)間。
環(huán)境溫度的平均值數(shù)量 (sths34pf80_avg_tambient_num_set 函數(shù)): 類似地,這個(gè)函數(shù)設(shè)置環(huán)境溫度測(cè)量的平均值數(shù)量。參數(shù) val 可以是 AVG_T_8, AVG_T_4, AVG_T_2, AVG_T_1 等,用于設(shè)置不同的平均值數(shù)量。這也會(huì)影響傳感器輸出的平滑程度和響應(yīng)速度。
在你提供的代碼段中,使用了 STHS34PF80_AVG_TMOS_32 和 STHS34PF80_AVG_T_8 作為參數(shù),分別用于設(shè)置對(duì)象溫度和環(huán)境溫度的平均值數(shù)量。這意味著傳感器會(huì)對(duì)對(duì)象溫度使用32個(gè)數(shù)據(jù)點(diǎn)的平均值,對(duì)環(huán)境溫度使用8個(gè)數(shù)據(jù)點(diǎn)的平均值。這樣的設(shè)置有助于在傳感器的測(cè)量中實(shí)現(xiàn)一定程度的數(shù)據(jù)平滑和過(guò)濾噪聲,同時(shí)保持適當(dāng)?shù)捻憫?yīng)速度。
/* Set averages (AVG_TAMB = 8, AVG_TMOS = 32) */
sths34pf80_avg_tobject_num_set(&dev_ctx, STHS34PF80_AVG_TMOS_32);
sths34pf80_avg_tambient_num_set(&dev_ctx, STHS34PF80_AVG_T_8);
智能識(shí)別算法
STHS34PF80嵌入了智能數(shù)字算法,以支持以下三種檢測(cè)模式:
? 存在檢測(cè)
? 運(yùn)動(dòng)檢測(cè)
? 環(huán)境溫度沖擊檢測(cè)
這些算法分別使用不同的低通濾波器(LPF_P、LPF_M和LPF_A_T)。此外,存在和運(yùn)動(dòng)檢測(cè)算法使用另一個(gè)共同的低通濾波器(LPF_P_M)。這些濾波器用于生成中間信號(hào)(TPRESENCE、TMOTION和TAMB_SHOCK),可以用于對(duì)算法本身進(jìn)行微調(diào)。這些濾波器的截止頻率值可以通過(guò)它們各自的位范圍進(jìn)行配置,這些位范圍可以在LPF1(0Ch)和LPF2(0Dh)寄存器中找到,如下所示。
寄存器LPF1 (0Ch)和LPF2 (0Dh)如下所示。
案例中只是對(duì)濾波器進(jìn)行了讀取以及打印。
/* read filters */
sths34pf80_lpf_m_bandwidth_get(&dev_ctx, &lpf_m);
sths34pf80_lpf_p_bandwidth_get(&dev_ctx, &lpf_p);
sths34pf80_lpf_p_m_bandwidth_get(&dev_ctx, &lpf_p_m);
sths34pf80_lpf_a_t_bandwidth_get(&dev_ctx, &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);
使用塊數(shù)據(jù)更新(BDU)功能
在很多傳感器中,數(shù)據(jù)通常被存儲(chǔ)在輸出寄存器中,這些寄存器分為兩部分:MSB和LSB。這兩部分共同表示一個(gè)完整的數(shù)據(jù)值。例如,在一個(gè)加速度計(jì)中,MSB和LSB可能共同表示一個(gè)加速度的測(cè)量值。
連續(xù)更新模式(BDU = ‘0’):在默認(rèn)模式下,輸出寄存器的值會(huì)持續(xù)不斷地被更新。這意味著在你讀取MSB和LSB的時(shí)候,寄存器中的數(shù)據(jù)可能會(huì)因?yàn)樾碌臏y(cè)量數(shù)據(jù)而更新。這可能導(dǎo)致一個(gè)問(wèn)題:當(dāng)你讀取MSB時(shí),如果寄存器更新了,接下來(lái)讀取的LSB可能就是新的測(cè)量值的一部分,而不是與MSB相對(duì)應(yīng)的值。這樣,你得到的就是一個(gè)“拼湊”的數(shù)據(jù),它可能無(wú)法準(zhǔn)確代表任何實(shí)際的測(cè)量時(shí)刻。
塊數(shù)據(jù)更新(BDU)模式(BDU = ‘1’):當(dāng)激活BDU功能時(shí),輸出寄存器中的內(nèi)容不會(huì)在讀取MSB和LSB之間更新。這就意味著一旦開始讀取數(shù)據(jù)(無(wú)論是先讀MSB還是LSB),寄存器中的那一組數(shù)據(jù)就被“鎖定”,直到兩部分都被讀取完畢。這樣可以確保你讀取的MSB和LSB是同一測(cè)量時(shí)刻的數(shù)據(jù),避免了讀取到代表不同采樣時(shí)刻的數(shù)據(jù)。
簡(jiǎn)而言之,BDU位的作用是確保在讀取數(shù)據(jù)時(shí),輸出寄存器的內(nèi)容保持穩(wěn)定,從而避免讀取到拼湊或錯(cuò)誤的數(shù)據(jù)。這對(duì)于需要高精度和穩(wěn)定性的應(yīng)用尤為重要。
案例也是設(shè)置了BDU。 BDU在CTRL1 (20h)寄存器中。
/* Set BDU */
sths34pf80_block_data_update_set(&dev_ctx, 1);
設(shè)置ODR速率
初始化完畢之后需要通過(guò)CTRL1(20h)寄存器中的ODR[3:0]位范圍選擇其中一種操作模式(連續(xù)模式),或者在CTRL2(21h)寄存器中將ONE_SHOT位設(shè)置為1(單次觸發(fā)模式)。
當(dāng)配置了寄存器LPF1 (0Ch)和LPF2 (0Dh) 的LPF_P、LPF_M和LPF_A_T、LPF_P_M濾波器之后,可以去設(shè)置ODR速率。
這里設(shè)置速率為8Hz。
/* Set ODR */
sths34pf80_odr_set(&dev_ctx, STHS34PF80_ODR_AT_30Hz);
獲取狀態(tài)
STATUS (地址為0x23U) 用于表示傳感器的狀態(tài)。
drdy(1位):這個(gè)位用于指示數(shù)據(jù)就緒(Data Ready)狀態(tài)。當(dāng)傳感器有新的數(shù)據(jù)可供讀取時(shí),這個(gè)位會(huì)被設(shè)置。
FUNC_STATUS(25h)主要檢測(cè)三個(gè)標(biāo)志位:PRES_FLAG、MOT_FLAG 和 TAMB_SHOCK_FLAG,這些標(biāo)志位用于檢測(cè)不同類型的事件。
PRES_FLAG是存在檢測(cè)標(biāo)志位。當(dāng)存在檢測(cè)到人員存在時(shí),此位變?yōu)?。
MOT_FLAG:運(yùn)動(dòng)檢測(cè)標(biāo)志位。當(dāng)檢測(cè)到運(yùn)動(dòng)時(shí),此位變?yōu)?。
TAMB_SHOCK_FLAG:環(huán)境溫度沖擊檢測(cè)標(biāo)志位。當(dāng)檢測(cè)到環(huán)境溫度沖擊時(shí),此位變?yōu)?。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
sths34pf80_drdy_status_t status;
sths34pf80_func_status_t func_status;
sths34pf80_drdy_status_get(&dev_ctx, &status);
if (status.drdy)
{
sths34pf80_func_status_get(&dev_ctx, &func_status);
printf("TAmbient Shock: %d - Presence: %d - Motion: %drn",func_status.tamb_shock_flag, func_status.pres_flag, func_status.mot_flag);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
測(cè)試結(jié)果
在未有人的情況下。
在人體純?cè)谇闆r下。
審核編輯 黃宇
-
傳感器
+關(guān)注
關(guān)注
2551文章
51085瀏覽量
753445 -
智能算法
+關(guān)注
關(guān)注
0文章
77瀏覽量
11933 -
紅外感應(yīng)器
+關(guān)注
關(guān)注
0文章
11瀏覽量
8362
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論