概述
STHS34PF80傳感器項目種修改 Arduino 腳本,重新移植到STM32的MCU中。
該項目基于STHS34PF80 IR溫度傳感器,能夠檢測環(huán)境和物體溫度,并且在最大4米范圍內(nèi)檢測存在和運動。有一個Arduino腳本,顯示如何為基本環(huán)境和物體溫度測量配置傳感器,并如何配置嵌入式功能算法,并使用它們檢測存在和運動。腳本允許連續(xù)或一次性模式,允許更改低通濾波器和檢測閾值以實現(xiàn)各種檢測行為。腳本利用內(nèi)嵌的中斷引擎來檢測溫度數(shù)據(jù)的就緒狀態(tài),以及通知存在和運動事件。
總的來說,這是一個有趣的項目,使用STHS34PF80 IR溫度傳感器進行存在和運動檢測,適用于各種應(yīng)用,從環(huán)境和物體溫度監(jiān)測到人員和動物計數(shù)。該項目已經(jīng)有一個功能強大的Arduino腳本作為起點,適合任何有興趣使用這個傳感器的人進一步開發(fā)和測試。
傳感器的內(nèi)置智能數(shù)字算法。該傳感器具有三種不同的檢測模式:存在檢測、運動檢測和環(huán)境溫度沖擊檢測,通過配置嵌入式函數(shù)寄存器,來實現(xiàn)嵌入式函數(shù)的參數(shù)調(diào)整。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:6_15061293 。
視頻教學
https://www.bilibili.com/video/BV1kF411C71S/
樣品申請
https://www.wjx.top/vm/OhcKxJk.aspx#
視頻教程
參考Demo
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/sths34pf80_STdC/examples/sths34pf80_tmos_data_polling.c
參考Demo
hthttps://github.com/kriswiner/STHS34PF80/tree/main
完整代碼下載
https://download.csdn.net/download/qq_24312945/88257572
內(nèi)嵌函數(shù)地址
STHS34PF80傳感器中的內(nèi)嵌功能寄存器。這些寄存器可用于配置內(nèi)嵌算法,用于補償物體溫度中的環(huán)境溫度變化,以及內(nèi)嵌的智能數(shù)字算法。
串口配置
查看原理圖,PA9和PA10設(shè)置為開發(fā)板的串口。
配置串口。
IIC配置
在這個應(yīng)用中,STS34PF80模塊通過I2C(IIC)接口與主控器通信。具體來說,STS34PF80模塊的I2C引腳連接到主控器的PB6(引腳B6)和PB7(引腳B7)兩個IO口。
配置IIC為普通模式,速度為100k。
IO口設(shè)置
STS34PF80IO設(shè)置如下所示。
在IIC模式下CS需要給個高電平。
官方提供IIC接線如下所示。
需要把PA8配置為輸出模式,默認高電平,配置PA7為輸入模式。
串口重定向
打開魔術(shù)棒,勾選MicroLIB
在main.c中,添加頭文件,若不添加會出現(xiàn) identifier "FILE" is undefined報錯。
/* 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 */
參考程序初始化
IIC寫函數(shù)
STHS34PF80地址為101 1010(0x5A),如果是寫操作,那么具體的地址為1011 0100(0xB4)。
/**
* @brief 讀取數(shù)據(jù)
*
* @param add 模塊地址
* @param reg 寄存器地址
* @param data buffer 緩沖區(qū)
* @param len 讀取長度
* @retval ret 正常返回HAL_OK
*
*/
uint8_t sths34pf80_read_reg(uint8_t add,uint8_t reg, uint8_t * data, uint8_t len)
{
uint8_t ret;
ret=HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_8BIT,data,len,0xffff);
return ret;
}
IIC讀函數(shù)
STHS34PF80地址為101 1010(0x5A),如果是讀操作,那么具體的地址為1011 0101(0xB5)。
/**
* @brief 寫入數(shù)據(jù)
*
* @param add 模塊地址
* @param reg 寄存器地址
* @param data buffer 緩沖區(qū)
* @param len 寫入長度
* @retval ret 正常返回HAL_OK
*
*/
uint8_t sths34pf80_write_reg(uint8_t add,uint8_t reg, uint8_t * data, uint8_t len)
{
uint8_t ret;
HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_8BIT,data,len,0xffff);
return ret;
}
獲取ID
參考例程序中對應(yīng)的獲取ID驅(qū)動程序,如下所示。
獲取ID可以查看0x0F,讀出來的值應(yīng)該為0xD3。
讀取函數(shù)如下所示。
/**
* @brief 獲取設(shè)備ID
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_getChipID(uint8_t add)
{
uint8_t temp[1]={0};
sths34pf80_read_reg(add,STHS34PF80_WHO_AM_I,temp,1);
return temp[0];
}
驅(qū)動如下所示。
uint8_t STHS34PF80_ID = STHS34PF80_getChipID(STHS34PF80_ADDRESS); // Read CHIP_ID register for STHS34PF80
printf("STHS34PF80_ID=0x%xn",STHS34PF80_ID);
設(shè)備的自動引導過程和關(guān)機模式配置
在設(shè)備上電后,它會執(zhí)行一個2.5毫秒的引導過程,將校準系數(shù)從嵌入式閃存下載到內(nèi)部寄存器,并加載AVG_TRIM(10h)、CTRL0(17h)和SENS_DATA(1Dh)寄存器的默認內(nèi)容。在引導過程中,設(shè)備的寄存器是不可訪問的。
引導完成后,設(shè)備會自動配置為關(guān)機模式。在上電后,通過將CTRL2(21h)寄存器的BOOT位設(shè)置為1,可以重新啟動引導過程,以重新加載上述寄存器的默認值。無需對設(shè)備的電源線進行切換操作。
在重新引導過程中,設(shè)備的寄存器是不可訪問的。重新引導完成后,設(shè)備會自動配置為先前的工作模式,并且BOOT位會自動清零為0。
修改后如下所示。
/**
* @brief 傳感器重置
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_reset(uint8_t add)
{
uint8_t temp = 0;
int32_t ret;
//STHS34PF80_CTRL2- >0x21
ret=sths34pf80_read_reg(add,STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
if (ret == HAL_OK)
{
temp=temp | 0x80;
ret = sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);// set bit 7 to force device reset, wait 2.5 ms for reboot
}
HAL_Delay(3);
return ret;
}
省電模式
下面文本描述了關(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 清零,其中讀取FUNC_STATUS (25h)可以清零DRDY。
其中0x20是配置速率寄存器。
參考文檔提供的關(guān)閉電源代碼如下所示。
修改后如下。
void STHS34PF80_powerDown(uint8_t add)
{
uint8_t stat = 0;
//STHS34PF80_FUNC_STATUS- >0x25
STHS34PF80_ReadByte(add,STHS34PF80_FUNC_STATUS); // This is done to reset the DRDY bit of the STATUS (23h) register to 0
//STHS34PF80_STATUS- >0x23
stat=STHS34PF80_ReadByte(add,STHS34PF80_STATUS);
while( (stat & 0x04) )
{
stat=STHS34PF80_ReadByte(add,STHS34PF80_STATUS);
HAL_Delay(1);
} // wait for STATUS DR bit -- > 0
uint8_t temp=0;
//STHS34PF80_CTRL1- >0x20
temp=STHS34PF80_ReadByte(add,STHS34PF80_CTRL1);
STHS34PF80_WriteByte(add,STHS34PF80_CTRL1, temp & ~(0x07));// set bits 0 - 3 to 0 to power downt
//STHS34PF80_FUNC_STATUS- >0x25
STHS34PF80_ReadByte(add,STHS34PF80_FUNC_STATUS); // reset DR bit of STATUS to
}
溫度數(shù)據(jù)的靈敏度值
τ 表示光學系統(tǒng)在操作波長范圍內(nèi)的透射率(取值范圍從0到1),SENSITIVITY DEFAULT 是對象溫度數(shù)據(jù)的默認靈敏度值(通常約為2000 LSB/°C)。默認的靈敏度值是通過使用黑體覆蓋傳感器的全視場而無需光學元件(即,τ = 1)進行每個單元的校準獲得的。
透射率的變化可能會影響傳感器的讀數(shù),因此在有光學元件的情況下使用傳感器時,可能需要根據(jù)透射率調(diào)整或考慮靈敏度。
可以讀取SENS_DATA (1Dh)寄存器進行獲取。
參考代碼如下所示。
修改后如下。
/**
* @brief 獲取設(shè)備靈敏度
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
int16_t STHS34PF80_readSenseData(uint8_t add)
{
uint8_t temp = 0;
int32_t ret;
//STHS34PF80_SENS_DATA- >0x1D
ret = sths34pf80_read_reg(add, STHS34PF80_SENS_DATA, (uint8_t *)&temp, 1);
return (int16_t)((int16_t)temp < < 8 | 0x00);
}
主程序打印保存的數(shù)值。
// 獲取設(shè)備靈敏度
ObjSense = (STHS34PF80_readSenseData(STHS34PF80_ADDRESS) / 16) + 2048;
printf("Object Sense Data (LSB/oC) =%d n",ObjSense)
設(shè)置低通濾波器
配置低通濾波器可以通過LPF1 (0Ch)和LPF2 (0Dh)進行配置。
STHS34PF80內(nèi)置嵌入式算法,設(shè)備具有三種嵌入式的檢測模式,包括存在檢測、運動檢測和環(huán)境溫度沖擊檢測。
每種算法使用不同的低通濾波器 (LPF_P, LPF_M 和 LPF_A_T)。存在和運動檢測算法還共同使用另一個低通濾波器 (LPF_P_M)。這些濾波器用于生成中間信號 (TPRESENCE, TMOTION 和 TAMB_SHOCK),可以用來微調(diào)算法本身。
下面分別是存在檢測和運動檢測的框圖。
參考文檔設(shè)置如下所示。
修改如下。
/**
* @brief 設(shè)置低通濾波器
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_setLowpassFilters(uint8_t add,uint8_t lpf_P, uint8_t lpf_M, uint8_t lpf_PM, uint8_t lpf_Tshock)
{
int32_t ret;
uint8_t LPF1,LPF2;
LPF1=lpf_PM < < 3 | lpf_M;
LPF2=lpf_P < < 3 | lpf_Tshock;
//STHS34PF80_LPF1- >0x0C
ret = sths34pf80_write_reg(add, STHS34PF80_LPF1, (uint8_t *)&LPF1, 1);
if(ret==HAL_OK)
{ //STHS34PF80_LPF2- >0x0D
ret=sths34pf80_write_reg(add, STHS34PF80_LPF2, (uint8_t *)&LPF2, 1);
}
return ret;
}
溫度測量濾波方式
首先需要設(shè)置AVG_TRIM (10h) 寄存器用于配置溫度平均值濾波的參數(shù),以控制環(huán)境溫度和目標溫度測量的平滑度和穩(wěn)定性。在溫度測量中,可能會受到噪聲和干擾的影響,這可能導致短期內(nèi)測量值的波動。通過應(yīng)用平均值濾波,可以平滑這些波動,從而得到更加穩(wěn)定的溫度數(shù)據(jù)。AVG_TRIM 寄存器中的設(shè)置會決定平均值濾波的級別,從而影響濾波的時間常數(shù)以及平滑度。
這里默認參數(shù)如下
- 在AVG_TRIM(10h)寄存器中寫入02h // AVG_T = 8,AVG_TMOS = 32
- 在CTRL1(20h)寄存器中寫入07h // ODR = 15 Hz
AVG_T[1:0]: 這個設(shè)置位用于選擇環(huán)境溫度的平均值濾波樣本數(shù)。
AVG_TMOS[2:0]: 這個設(shè)置位用于選擇目標溫度的平均值濾波樣本數(shù)以及與之相關(guān)的噪聲水平。
之后需要去設(shè)置溫度范圍,CTRL0 (17h)主要用于配置設(shè)備的增益,以適應(yīng)不同的操作溫度范圍。具體的增益設(shè)置將決定設(shè)備可以工作的溫度范圍。
值000表示寬模式(wide mode)。
值111表示默認增益模式(default gain mode)。
查看下表得知,當房間和傳感器溫度差別不大時候,可以設(shè)置默認增益模式。
設(shè)置中斷可以通過CTRL3 (22h)寄存器來配置。
這個寄存器為系統(tǒng)提供了有關(guān)設(shè)備當前狀態(tài)的關(guān)鍵信息,可以用于驅(qū)動其他邏輯或觸發(fā)相應(yīng)的操作,如中斷服務(wù)例程。例如,PRES_FLAG可用于確定是否有人進入了一個區(qū)域,MOT_FLAG可以用于檢測人體是否運動,TAMB_SHOCK_FLAG可能用于環(huán)境監(jiān)控系統(tǒng)以捕捉突然的溫度變化。
通過查看FUNC_STATUS (25h)可以得知,PRES_FLAG為存在檢測,MOT_FLAG為運動檢測,TAMB_SHOCK_FLAG為環(huán)境溫度沖擊檢測標志。
通過配置CTRL3 (22h)寄存器的IEN[1:0] 可以設(shè)置輸出模式。
IEN[1:0]位在CTRL3寄存器中,它定義了應(yīng)該將哪種信號路由到INT管腳(即中斷輸出):
00:INT管腳處于高阻態(tài)。
01:將DRDY(數(shù)據(jù)已準備好的信號)路由到INT管腳。
10:將INT_OR信號路由到INT管腳。
參考程序配置如下。
修改后如下所示。
/**
* @brief 設(shè)置溫度測量濾波方式
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_config(uint8_t add,uint8_t avgt, uint8_t avgtmos, uint8_t gain, bool functions)
{
int32_t ret;
uint8_t temp;
uint8_t AVG_TRIM;
AVG_TRIM = avgt < < 4 | avgtmos;
//STHS34PF80_AVG_TRIM- >0x10//設(shè)置濾波樣本數(shù)
ret = sths34pf80_write_reg(add, STHS34PF80_AVG_TRIM, (uint8_t *)&AVG_TRIM, 1);
if(ret==HAL_OK)
{//STHS34PF80_CTRL0- >0x17//設(shè)置溫度增益
sths34pf80_read_reg(add, STHS34PF80_CTRL0, (uint8_t *)&temp, 1);
temp=temp | gain < < 4;
ret = sths34pf80_write_reg(add, STHS34PF80_CTRL0, (uint8_t *)&temp, 1);
// Configure interrupt behavior
// select active HIGH (bit 7 == 0), push-pull (bit 6 == 0), pulsed mode (bit 2 == 0)
temp=0x01;//STHS34PF80_CTRL3- >0x22
ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&temp, 1);
temp=0x3A;//0011 1010
// if(functions) _i2c_bus- >writeByte(STHS34PF80_ADDRESS, STHS34PF80_CTRL3, 0x32 ); // configure INT_OR for either Presence or Motion detection
if(functions)
ret = sths34pf80_write_reg(add, STHS34PF80_CTRL3, (uint8_t *)&temp, 1);
}
return ret;
}
寫入嵌入式函數(shù)
嵌入式函數(shù)寫操作如下所示。
案例實現(xiàn)如下。
CTRL2 (21h)如下所示,對FUNC_CFG_ACCESS設(shè)置為1主要是開啟訪問內(nèi)嵌函數(shù)寄存器。
寄存器PAGE_RW (11h)的FUNC_CFG_WRITE標志位置為為1,啟用嵌入式函數(shù)的寫過程。
/************開啟嵌入式函數(shù)讀寫************/
uint8_t temp ; //STHS34PF80_CTRL2- >0x21
sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
temp = temp | 0x10;//STHS34PF80_CTRL2- >0x21 //開啟嵌入式函數(shù)訪問
sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);//允許訪問嵌入式函數(shù)寄存器
temp = 0x40; //STHS34PF80_FUNC_PAGE_RW- >0x11 //開啟嵌入式函數(shù)寫操作
sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1); //允許寫入嵌入函數(shù)寄存器
寄存器FUNC_CFG_ADDR (08h)為配置嵌入式函數(shù)的地址,F(xiàn)UNC_CFG_DATA (09h)為傳入數(shù)據(jù)到嵌入式函數(shù)中。
這里傳入的地址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)。
/************設(shè)置存在閾值************/
temp = STHS34PF80_PRESENCE_THS_L;//STHS34PF80_FUNC_CFG_ADDR- >0x08 嵌入式地址PRESENCE_THS (20h - 21h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為PRESENCE_THS_L
temp =presence_ths ;//STHS34PF80_FUNC_CFG_DATA- >0x09
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入低字節(jié)
temp = STHS34PF80_PRESENCE_THS_H;//STHS34PF80_FUNC_CFG_ADDR- >0x08 嵌入式地址PRESENCE_THS (20h - 21h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為PRESENCE_THS_H
temp = presence_ths > >8;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入高字節(jié)
MOTION_THS (22h - 23h) 這個寄存器用于設(shè)置運動檢測算法的閾值。在實際應(yīng)用中,你可能需要讀取或設(shè)置這個寄存器,以調(diào)整或查看運動檢測算法的閾值。如果值過高,可能會導致運動檢測不靈敏;而值過低則可能會導致誤報。這個值的范圍從0到32767。默認值是200。
/************設(shè)置運動閾值************/
temp = STHS34PF80_MOTION_THS_L;//嵌入式地址MOTION_THS (22h - 23h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為MOTION_THS_L
temp = motion_ths ;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入低字節(jié)
temp = STHS34PF80_MOTION_THS_H;//嵌入式地址MOTION_THS (22h - 23h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為MOTION_THS_H
temp = motion_ths > >8;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入高字節(jié)
TAMB_SHOCK_THS (24h - 25h)這個寄存器是用來設(shè)置環(huán)境溫度震蕩檢測算法的閾值。簡而言之,當環(huán)境溫度突然變化到某一程度時(超過這個設(shè)定的閾值),系統(tǒng)可能會認為發(fā)生了一個"溫度震蕩"事件。這是一個15位的無符號整數(shù)。這意味著它的范圍是0到32767。
/************設(shè)置環(huán)境溫度沖擊閾值************/
temp = STHS34PF80_TAMB_SHOCK_THS_L;//嵌入式地址TAMB_SHOCK_THS (24h - 25h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為TAMB_SHOCK_THS_L
temp = tamb_shock_ths ;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入低字節(jié)
temp = STHS34PF80_TAMB_SHOCK_THS_H;//嵌入式地址TAMB_SHOCK_THS (24h - 25h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為TAMB_SHOCK_THS_H
temp = tamb_shock_ths > >8;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入高字節(jié)
HYST_PRESENCE (27h)這個寄存器是用來設(shè)置存在檢測算法的滯后配置值。滯后(hysteresis)在很多傳感器應(yīng)用中是一個重要的概念,它可以幫助減少由于小的或暫時的輸入變化而導致的輸出頻繁切換。簡而言之,滯后會為傳感器的讀數(shù)提供一定的"容差",只有當輸入值超過了這個容差范圍時,輸出才會發(fā)生變化。這是一個8位的無符號整數(shù),所以它的范圍是0到255,默認值是32。
/************設(shè)置存在滯后值************/
temp = STHS34PF80_HYST_PRESENCE;//嵌入式地址HYST_PRESENCE (27h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為HYST_PRESNCE
temp = presence_hyst;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入1字節(jié)
HYST_MOTION (26h)這個寄存器用于設(shè)置運動檢測算法的滯后配置值。這是一個8位的無符號整數(shù),所以它的范圍是0到255,默認值是32。
/************設(shè)置運動滯后值************/
temp = STHS34PF80_HYST_MOTION;//嵌入式地址HYST_MOTION (26h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為HYST_MOTION
temp = motion_hyst;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入1字節(jié)
ALGO_CONFIG (28h)寄存器用于配置和調(diào)整算法的行為,包括中斷脈沖模式、溫度補償和存在檢測算法的絕對值選擇。適當?shù)呐渲每梢允顾惴ǜm合特定應(yīng)用的需求。
INT_PULSED: 當設(shè)置為1時,算法產(chǎn)生的標志會在INT引腳上脈沖輸出(高電平持續(xù)ODR定義的時間)。默認值為0。
0: 鎖存模式
1: 脈沖模式
COMP_TYPE: 啟用內(nèi)置線性算法,用于在物體溫度中補償環(huán)境溫度變化。默認值為0。
0: 禁用
1: 啟用
SEL_ABS: 在存在檢測算法中選擇絕對值。默認值為0。
0: 不應(yīng)用絕對值
1: 應(yīng)用絕對值
這里設(shè)置為脈沖輸出模式,將算法中斷設(shè)置為脈沖模式(位3 = 1)。
// set algorithm interrupt to pulsed mode (bit 3 = 1) or latch mode (bit 3 = 0)
/************設(shè)置脈沖模式************/
temp = STHS34PF80_ALGO_CONFIG;//嵌入式地址ALGO_CONFIG (28h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為ALGO_CONFIG
temp = 0x08;
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//寫入0x08(位3)使能脈沖模式
最后關(guān)閉嵌入式寫操作。
/************關(guān)閉嵌入式函數(shù)讀寫************/
temp = 0x00;//STHS34PF80_FUNC_PAGE_RW- >0x11 //關(guān)閉嵌入式函數(shù)寫
sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為STHS34PF80_FUNC_PAGE_RW
//STHS34PF80_CTRL2- >0x21 //讀取CTRL2 (21h)
sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
temp = temp & ~(0x10); //STHS34PF80_CTRL2- >0x21 //清除FUNC_CFG_ACCESS
sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
讀取嵌入式函數(shù)
嵌入式函數(shù)讀操作如下所示。
案例實現(xiàn)如下。
CTRL2 (21h)如下所示,對FUNC_CFG_ACCESS設(shè)置為1主要是開啟訪問內(nèi)嵌函數(shù)寄存器。
寄存器PAGE_RW (11h)的FUNC_CFG_READ標志位置為為1,啟用嵌入式函數(shù)的讀過程。
uint8_t rawData[2] = {0, 0}; // register data stored here
uint8_t temp ; //STHS34PF80_CTRL2- >0x21
sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
temp = temp | 0x10;//STHS34PF80_CTRL2- >0x21 //開啟嵌入式函數(shù)訪問
sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);//允許訪問嵌入式函數(shù)寄存器
temp = 0x20; //STHS34PF80_FUNC_PAGE_RW- >0x11 //開啟嵌入式函數(shù)讀操作
sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1); //允許寫入嵌入函數(shù)寄存器
寄存器FUNC_CFG_ADDR (08h)為配置嵌入式函數(shù)的地址,F(xiàn)UNC_CFG_DATA (09h)為傳入數(shù)據(jù)到嵌入式函數(shù)中。
這里傳入的地址addr為STHS34PF80_PRESENCE_THS,這是個15位的寄存器,PRESENCE_THS 寄存器(地址范圍為 0x20 到 0x21)主要用于存在檢測算法的存在閾值設(shè)置。存在檢測算法用于判斷是否存在某種狀態(tài)或條件,通常與傳感器測量數(shù)據(jù)相關(guān)。
/************讀取存在閾值************/
temp = STHS34PF80_PRESENCE_THS_L;//嵌入式地址PRESENCE_THS (20h - 21h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為PRESENCE_THS_L
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);
temp = STHS34PF80_PRESENCE_THS_H;//嵌入式地址PRESENCE_THS (20h - 21h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為PRESENCE_THS_H
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);
dest[0] = (uint16_t)(((uint16_t)rawData[1]) < < 8 | rawData[0]);
MOTION_THS (22h - 23h) 這個寄存器用于設(shè)置運動檢測算法的閾值。在實際應(yīng)用中,你可能需要讀取或設(shè)置這個寄存器,以調(diào)整或查看運動檢測算法的閾值。如果值過高,可能會導致運動檢測不靈敏;而值過低則可能會導致誤報。這個值的范圍從0到32767。默認值是200。
/************讀取運動閾值************/
temp = STHS34PF80_MOTION_THS_L;//嵌入式地址MOTION_THS (22h - 23h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為MOTION_THS_L
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);
temp = STHS34PF80_MOTION_THS_H;//嵌入式地址MOTION_THS (22h - 23h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為MOTION_THS_H
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);
dest[1] = (uint16_t)(((uint16_t)rawData[1]) < < 8 | rawData[0]);
TAMB_SHOCK_THS (24h - 25h)這個寄存器是用來設(shè)置環(huán)境溫度震蕩檢測算法的閾值。簡而言之,當環(huán)境溫度突然變化到某一程度時(超過這個設(shè)定的閾值),系統(tǒng)可能會認為發(fā)生了一個"溫度震蕩"事件。這是一個15位的無符號整數(shù)。這意味著它的范圍是0到32767。
/************讀取環(huán)境溫度沖擊閾值************/
temp = STHS34PF80_TAMB_SHOCK_THS_L;//嵌入式地址TAMB_SHOCK_THS (24h - 25h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為TAMB_SHOCK_THS_L
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);
temp = STHS34PF80_TAMB_SHOCK_THS_H; //嵌入式地址TAMB_SHOCK_THS (24h - 25h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為TAMB_SHOCK_THS_H
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);
dest[2] = (uint16_t)(((uint16_t)rawData[1]) < < 8 | rawData[0]);
HYST_MOTION (26h)這個寄存器用于設(shè)置運動檢測算法的滯后配置值。這是一個8位的無符號整數(shù),所以它的范圍是0到255,默認值是32。
/************讀取運動滯后值************/
temp = STHS34PF80_HYST_MOTION;//嵌入式地址HYST_MOTION (26h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為HYST_MOTION
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);
HYST_PRESENCE (27h)這個寄存器是用來設(shè)置存在檢測算法的滯后配置值。滯后(hysteresis)在很多傳感器應(yīng)用中是一個重要的概念,它可以幫助減少由于小的或暫時的輸入變化而導致的輸出頻繁切換。簡而言之,滯后會為傳感器的讀數(shù)提供一定的"容差",只有當輸入值超過了這個容差范圍時,輸出才會發(fā)生變化。這是一個8位的無符號整數(shù),所以它的范圍是0到255,默認值是32。
/************讀取存在滯后值************/
temp = STHS34PF80_HYST_PRESENCE;//嵌入式地址HYST_PRESENCE (27h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為HYST_PRESNCE
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);
dest[3] = (uint16_t)(((uint16_t)rawData[1]) < < 8 | rawData[0]);
ALGO_CONFIG (28h)寄存器用于配置和調(diào)整算法的行為,包括中斷脈沖模式、溫度補償和存在檢測算法的絕對值選擇。適當?shù)呐渲每梢允顾惴ǜm合特定應(yīng)用的需求。
INT_PULSED: 當設(shè)置為1時,算法產(chǎn)生的標志會在INT引腳上脈沖輸出(高電平持續(xù)ODR定義的時間)。默認值為0。
0: 鎖存模式
1: 脈沖模式
COMP_TYPE: 啟用內(nèi)置線性算法,用于在物體溫度中補償環(huán)境溫度變化。默認值為0。
0: 禁用
1: 啟用
SEL_ABS: 在存在檢測算法中選擇絕對值。默認值為0。
0: 不應(yīng)用絕對值
1: 應(yīng)用絕對值
這里設(shè)置為脈沖輸出模式,將算法中斷設(shè)置為脈沖模式(位3 = 1)。
// set algorithm interrupt to pulsed mode (bit 3 = 1) or latch mode (bit 3 = 0)
/************讀取脈沖模式************/
temp = STHS34PF80_ALGO_CONFIG;//嵌入式地址ALGO_CONFIG (28h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為ALGO_CONFIG
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[0], 1);
HYST_TAMB_SHOCK (29h)寄存器用于設(shè)置環(huán)境溫度突變檢測算法的滯后配置值。滯后(hysteresis)在傳感器應(yīng)用中很常見,用于防止小范圍、暫時的信號變化而導致的輸出頻繁切換。通過為傳感器的讀數(shù)提供一個“容差”,滯后確保只有當輸入值超出這個容差范圍時,輸出才會發(fā)生變化。這是一個8位的無符號整數(shù),意味著它的范圍是0到255。
/************讀取環(huán)境溫度滯后值************/
temp = STHS34PF80_HYST_TAMB_SHOCK;//嵌入式地址HYST_TAMB_SHOCK (29h)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為HYST_TAMB_SHOCK
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&rawData[1], 1);
dest[4] = (uint16_t)(((uint16_t)rawData[1]) < < 8 | rawData[0]);
最后關(guān)閉嵌入式寫操作。
/************設(shè)置中斷模式************/
temp = 0x00;//STHS34PF80_FUNC_PAGE_RW- >0x11 //關(guān)閉嵌入式函數(shù)寫
sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為STHS34PF80_FUNC_PAGE_RW
//STHS34PF80_CTRL2- >0x21 //讀取CTRL2 (21h)
sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
temp = temp & ~(0x10); //STHS34PF80_CTRL2- >0x21 //清除BOOT和ONE_SHOT
sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
重置模塊
當更改與算法相關(guān)的參數(shù)或濾波器的截止頻率,或當啟用/禁用嵌入式補償算法時,需要按照上述步驟重置算法。這個過程涉及進入掉電模式、更改算法配置、啟用和禁用嵌入式功能寄存器的訪問和寫操作,并在最后的步驟中設(shè)置所需的輸出數(shù)據(jù)速率或觸發(fā)單次采集。
/**
* @brief 重置STHS34PF80傳感器內(nèi)置的算法
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
void STHS34PF80_resetAlgo(uint8_t add)
{
uint8_t temp ; //STHS34PF80_CTRL2- >0x21 //讀取CTRL2 (21h)
sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
temp= temp | 0x10;//STHS34PF80_CTRL2- >0x21 //開啟嵌入式函數(shù)訪問
sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);//允許訪問嵌入式函數(shù)寄存器
temp = 0x40; //STHS34PF80_FUNC_PAGE_RW- >0x11 //開啟嵌入式函數(shù)寫操作
sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1); //允許寫入嵌入函數(shù)寄存器
temp = STHS34PF80_RESET_ALGO;//嵌入式地址STHS34PF80_RESET_ALGO (2Ah)
sths34pf80_write_reg(add, STHS34PF80_FUNC_CFG_ADDR, (uint8_t *)&temp, 1); //設(shè)置嵌入式寄存器地址為STHS34PF80_RESET_ALGO
temp = 0x01;
sths34pf80_read_reg(add, STHS34PF80_FUNC_CFG_DATA, (uint8_t *)&temp, 1);//設(shè)置ALGO_ENABLE_RESET位
temp = 0x00;//STHS34PF80_FUNC_PAGE_RW- >0x11 //關(guān)閉嵌入式函數(shù)寫
sths34pf80_write_reg(add, STHS34PF80_FUNC_PAGE_RW, (uint8_t *)&temp, 1);//設(shè)置嵌入式寄存器地址為STHS34PF80_FUNC_PAGE_RW
//STHS34PF80_CTRL2- >0x21 //讀取CTRL2 (21h)
sths34pf80_read_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
temp = temp & ~(0x10); //STHS34PF80_CTRL2- >0x21 //清除FUNC_CFG_ACCESS
sths34pf80_write_reg(add, STHS34PF80_CTRL2, (uint8_t *)&temp, 1);
}
最后第九步需要設(shè)置BDU速率。
/**
* @brief 關(guān)閉低功耗,進入正常模式,設(shè)置ODR
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_powerUp(uint8_t add,uint8_t odr)
{
uint8_t temp = 0;
int32_t ret; //STHS34PF80_CTRL1- >0x20
ret = sths34pf80_read_reg(add, STHS34PF80_CTRL1, (uint8_t *)&temp, 1);
temp=temp | 0x10 | odr;// set bdu = 1 (bit 4 == 1) and odr
if(ret==HAL_OK)
ret = sths34pf80_write_reg(add, STHS34PF80_CTRL1, (uint8_t *)&temp, 1);
return ret;
}
清零DRDY
可以通過讀取0x25,主要功能是對STATUS (23h)的DRDY進行清0。
查看下面表格也可以得知,有多種操作可以對STATUS (23h)的DRDY 清零。
/**
* @brief 清零DRDY
*
* @param add 設(shè)備地址
* @param val 設(shè)備ID.
* @retval ret 正常返回HAL_OK
*
*/
uint8_t STHS34PF80_getFuncStatus(uint8_t add)
{
uint8_t temp = 0;//STHS34PF80_FUNC_STATUS- >0x25
sths34pf80_read_reg(add, STHS34PF80_FUNC_STATUS, (uint8_t *)&temp, 1);
return temp;
}
審核編輯:湯梓紅
-
模塊
+關(guān)注
關(guān)注
7文章
2706瀏覽量
47468 -
嵌入式
+關(guān)注
關(guān)注
5082文章
19123瀏覽量
305146 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4331瀏覽量
62605 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14807
發(fā)布評論請先 登錄
相關(guān)推薦
評論