概述
STHS34PF80是一款高性能的紅外(IR)傳感器,特別適用于檢測(cè)存在感和運(yùn)動(dòng)。其主要特點(diǎn)是高靈敏度,能在沒有透鏡的情況下探測(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/BV1KN4y1v7gy/
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#]
完整代碼下載
[https://download.csdn.net/download/qq_24312945/88711602]
主要特點(diǎn)
高靈敏度探測(cè): 專為探測(cè)紅外線的存在和運(yùn)動(dòng)設(shè)計(jì),具有高靈敏度。 探測(cè)范圍: 能夠在沒有透鏡的情況下,探測(cè)到70 x 25厘米大小的物體,最遠(yuǎn)達(dá)4米。 集成硅紅外濾波器: 通過濾除非紅外波長(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ā)板:
接口
STHS34PF80模塊接口的示意圖如下所示,支持IIC或者SPI通訊。
最小系統(tǒng)圖
新建工程
工程模板
保存工程路徑
芯片配置
本文中使用R7FA4M2AD3CFL來進(jìn)行演示。
工程模板選擇
時(shí)鐘設(shè)置
開發(fā)板上的外部高速晶振為12M.
需要修改XTAL為12M。
UART配置
點(diǎn)擊Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。
UART屬性配置
設(shè)置e2studio堆棧
printf函數(shù)通常需要設(shè)置堆棧大小。這是因?yàn)閜rintf函數(shù)在運(yùn)行時(shí)需要使用棧空間來存儲(chǔ)臨時(shí)變量和函數(shù)調(diào)用信息。如果堆棧大小不足,可能會(huì)導(dǎo)致程序崩潰或不可預(yù)期的行為。
printf函數(shù)使用了可變參數(shù)列表,它會(huì)在調(diào)用時(shí)使用棧來存儲(chǔ)參數(shù),在函數(shù)調(diào)用結(jié)束時(shí)再清除參數(shù),這需要足夠的棧空間。另外printf也會(huì)使用一些臨時(shí)變量,如果棧空間不足,會(huì)導(dǎo)致程序崩潰。 因此,為了避免這類問題,應(yīng)該根據(jù)程序的需求來合理設(shè)置堆棧大小。
e2studio的重定向printf設(shè)置
在嵌入式系統(tǒng)的開發(fā)中,尤其是在使用GNU編譯器集合(GCC)時(shí),--specs 參數(shù)用于指定鏈接時(shí)使用的系統(tǒng)規(guī)格(specs)文件。這些規(guī)格文件控制了編譯器和鏈接器的行為,尤其是關(guān)于系統(tǒng)庫和啟動(dòng)代碼的鏈接。--specs=rdimon.specs 和 --specs=nosys.specs 是兩種常見的規(guī)格文件,它們用于不同的場(chǎng)景。
--specs=rdimon.specs
用途: 這個(gè)選項(xiàng)用于鏈接“Redlib”庫,這是為裸機(jī)(bare-metal)和半主機(jī)(semihosting)環(huán)境設(shè)計(jì)的C庫的一個(gè)變體。半主機(jī)環(huán)境是一種特殊的運(yùn)行模式,允許嵌入式程序通過宿主機(jī)(如開發(fā)PC)的調(diào)試器進(jìn)行輸入輸出操作。
應(yīng)用場(chǎng)景: 當(dāng)你需要在沒有完整操作系統(tǒng)的環(huán)境中運(yùn)行程序,但同時(shí)需要使用調(diào)試器來處理輸入輸出(例如打印到宿主機(jī)的終端),這個(gè)選項(xiàng)非常有用。
特點(diǎn): 它提供了一些基本的系統(tǒng)調(diào)用,通過調(diào)試接口與宿主機(jī)通信。
--specs=nosys.specs
用途: 這個(gè)選項(xiàng)鏈接了一個(gè)非常基本的系統(tǒng)庫,這個(gè)庫不提供任何系統(tǒng)服務(wù)的實(shí)現(xiàn)。
應(yīng)用場(chǎng)景: 適用于完全的裸機(jī)程序,其中程序不執(zhí)行任何操作系統(tǒng)調(diào)用,比如不進(jìn)行文件操作或者系統(tǒng)級(jí)輸入輸出。
特點(diǎn): 這是一個(gè)更“裸”的環(huán)境,沒有任何操作系統(tǒng)支持。使用這個(gè)規(guī)格文件,程序不期望有操作系統(tǒng)層面的任何支持。 如果你的程序需要與宿主機(jī)進(jìn)行交互(如在開發(fā)期間的調(diào)試),并且通過調(diào)試器進(jìn)行基本的輸入輸出操作,則使用 --specs=rdimon.specs。
如果你的程序是完全獨(dú)立的,不需要任何形式的操作系統(tǒng)服務(wù),包括不進(jìn)行任何系統(tǒng)級(jí)的輸入輸出,則使用 --specs=nosys.specs。
R_SCI_UART_Open()函數(shù)原型
故可以用 R_SCI_UART_Open()函數(shù)進(jìn)行配置,開啟和初始化UART。
/* Open the transfer instance with initial configuration. */
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
回調(diào)函數(shù)user_uart_callback ()
當(dāng)數(shù)據(jù)發(fā)送的時(shí)候,可以查看UART_EVENT_TX_COMPLETE來判斷是否發(fā)送完畢。
可以檢查檢查 "p_args" 結(jié)構(gòu)體中的 "event" 字段的值是否等于 "UART_EVENT_TX_COMPLETE"。如果條件為真,那么 if 語句后面的代碼塊將會(huì)執(zhí)行。
fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args- >event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}
printf輸出重定向到串口
打印最常用的方法是printf,所以要解決的問題是將printf的輸出重定向到串口,然后通過串口將數(shù)據(jù)發(fā)送出去。 注意一定要加上頭文件#include
#ifdef __GNUC__ //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
return ch;
}
int _write(int fd,char *pBuffer,int size)
{
for(int i=0;i< size;i++)
{
__io_putchar(*pBuffer++);
}
return size;
}
IIC屬性配置
查看手冊(cè),可以得知STHS34PF80的IIC地址為“1011010” ,即0x5A。
IIC配置
配置RA4M2的I2C接口,使其作為I2C master進(jìn)行通信。 查看開發(fā)板原理圖,對(duì)應(yīng)的IIC為P407和P408。
點(diǎn)擊Stacks->New Stack->Connectivity -> I2C Master(r_iic_master)。
設(shè)置IIC的配置,需要注意從機(jī)的地址。
R_IIC_MASTER_Open()函數(shù)原型
R_IIC_MASTER_Open()函數(shù)為執(zhí)行IIC初始化,開啟配置如下所示。
/* Initialize the I2C module */
err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
R_IIC_MASTER_Write()函數(shù)原型
R_IIC_MASTER_Write()函數(shù)是向IIC設(shè)備中寫入數(shù)據(jù),寫入格式如下所示。
err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ®, 1, true);
assert(FSP_SUCCESS == err);
R_IIC_MASTER_Read()函數(shù)原型
R_SCI_I2C_Read()函數(shù)是向IIC設(shè)備中讀取數(shù)據(jù),讀取格式如下所示。
/* Read data from I2C slave */
err = R_IIC_MASTER_Read(&g_i2c_master0_ctrl, bufp, len, false);
assert(FSP_SUCCESS == err);
sci_i2c_master_callback()回調(diào)函數(shù)
對(duì)于數(shù)據(jù)是否發(fā)送完畢,可以查看是否獲取到I2C_MASTER_EVENT_TX_COMPLETE字段。
/* Callback function */
i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
uint32_t timeout_ms = 100000;
void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
{
i2c_event = I2C_MASTER_EVENT_ABORTED;
if (NULL != p_args)
{
/* capture callback event for validating the i2c transfer event*/
i2c_event = p_args- >event;
}
}
CS設(shè)置
STS34PF80IO設(shè)置如下所示。 在IIC模式下CS需要給個(gè)高電平。
官方提供IIC接線如下所示。
設(shè)置PC0為輸出口。
參考案例
[https://github.com/STMicroelectronics/sths34pf80-pid]
獲取ID
參考例程序中對(duì)應(yīng)的獲取ID驅(qū)動(dòng)程序,如下所示。
獲取ID可以查看0x0F,讀出來的值應(yīng)該為0xD3。
對(duì)應(yīng)的獲取ID驅(qū)動(dòng)程序,如下所示。
/* Open the transfer instance with initial configuration. */
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
printf("hello world!n");
/* Initialize the I2C module */
err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
/* Handle any errors. This function should be defined by the user. */
assert(FSP_SUCCESS == err);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_00, BSP_IO_LEVEL_HIGH);
uint8_t whoami;
sths34pf80_lpf_bandwidth_t lpf_m, lpf_p, lpf_p_m, lpf_a_t;
/* Initialize mems driver interface */
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
dev_ctx.handle = &SENSOR_BUS;
/* 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)。通過應(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ù)平滑和過濾噪聲,同時(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)。這些濾波器的截止頻率值可以通過它們各自的位范圍進(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è)問題:當(dāng)你讀取MSB時(shí),如果寄存器更新了,接下來讀取的LSB可能就是新的測(cè)量值的一部分,而不是與MSB相對(duì)應(yīng)的值。這樣,你得到的就是一個(gè)“拼湊”的數(shù)據(jù),它可能無法準(zhǔn)確代表任何實(shí)際的測(cè)量時(shí)刻。
塊數(shù)據(jù)更新(BDU)模式(BDU = '1'):當(dāng)激活BDU功能時(shí),輸出寄存器中的內(nèi)容不會(huì)在讀取MSB和LSB之間更新。這就意味著一旦開始讀取數(shù)據(jù)(無論是先讀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速率
初始化完畢之后需要通過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_8Hz);
獲取狀態(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)注
2564文章
52607瀏覽量
763865 -
檢測(cè)
+關(guān)注
關(guān)注
5文章
4605瀏覽量
92543 -
RA4M2
+關(guān)注
關(guān)注
2文章
20瀏覽量
1086
發(fā)布評(píng)論請(qǐng)先 登錄
基于STM32CUBEMX驅(qū)動(dòng)TMOS模塊STHS34PF80(1)----獲取ID

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

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

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

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

STHS34PF80高靈敏度紅外感應(yīng)器(2)----InfraredPD存在感應(yīng)檢測(cè)

通過STEVAL-MKI109V3在unico上識(shí)別不到STHS34PF80是為什么?怎么處理?
LivingScan人體存在傳感器手冊(cè)
酒店人體存在雷達(dá)模塊方案,人體存在雷達(dá)傳感器技術(shù)應(yīng)用

意法半導(dǎo)體發(fā)布新型人體存在和移動(dòng)檢測(cè)芯片
意法半導(dǎo)發(fā)布了新型人體存在和移動(dòng)檢測(cè)芯片:STHS34PF80
ST TMOS熱敏紅外傳感器: 精準(zhǔn)檢測(cè)人員存在和移動(dòng)
人體存在傳感器方案,雷達(dá)感控聯(lián)動(dòng)技術(shù),人體接近傳感器感應(yīng)互動(dòng)人體存在傳感器怎么選?
STHS34PF80人體存在傳感器(1)----獲取人體存在狀態(tài)

STHS34PF80高靈敏度紅外感應(yīng)器(1)----獲取人體存在狀態(tài)

評(píng)論