| 【編者按】物聯(lián)網(wǎng),顧名思義就是萬物相連的網(wǎng)絡(luò),如果我們?nèi)コ嬰s提煉重點(diǎn),它的五大關(guān)鍵環(huán)節(jié),感知、計(jì)算、執(zhí)行、連接、安全是精髓。感知對應(yīng)傳感器,計(jì)算對應(yīng)各類微控制器,執(zhí)行對應(yīng)功率器件,連接則通過集成或分立的各種網(wǎng)絡(luò)連接方案實(shí)現(xiàn),安全則對標(biāo)基于芯片或系統(tǒng)的功能安全和信息安全方案。 在B-U585I-IOT02A 探索套件中,板載豐富的傳感器資源,包括陀螺儀、加速度計(jì)、磁強(qiáng)計(jì)、接近傳感器、壓力傳感器、濕度傳感器和溫度傳感器,可以完成物聯(lián)網(wǎng)環(huán)境下的各種感知需求。 
 簡單介紹下LPS22HH,傳感器采用HLGA-10L封裝,整體尺寸在2.0x2.0x0.73mm,是結(jié)構(gòu)非常緊湊,適合空間受限應(yīng)用環(huán)境的高性能MEMS壓力傳感器。作為氣壓傳感器,量程和精度是我們普遍關(guān)心的指標(biāo)。LPS22HH量程在260至1260hPa,精度在0.5hPa并且內(nèi)建溫度補(bǔ)償。器件本身支持SPI、I2C、I3C總線,工作電壓1.7至3.6V。 
 由于板上采用I2C總線與傳感器通訊,接下來的驅(qū)動編寫也使用I2C的通信方式。 LPS22HH的讀地址為0xBB,定義為LPS22HH_RD;寫地址為0xBA;定義為LPS22HH_WR。與HTS221溫濕度傳感器一樣,LPS22HH也有一個(gè)名為REG_WHO_AM_I的寄存器地址0x0F;讀取該地址,將得到0xB3的返回值;該值用于系統(tǒng)驗(yàn)證設(shè)備身份,與I2C總線的響應(yīng)機(jī)制結(jié)合,可作為雙重驗(yàn)證機(jī)制。驗(yàn)證結(jié)果通過枚舉LPS22HHState表示,使代碼便于理解。操作LPS22HH,除需要讀取存放壓力與溫度參數(shù)的5個(gè)寄存器,還需要至少配置兩個(gè)控制寄存器,分別是IF_CTRL和CTRL_REG1。其中,IF_CTRL用于控制總線內(nèi)部上下拉方式,I3C和I2C支持模式。CTRL_REG1用于控制內(nèi)部濾波器、轉(zhuǎn)換模式(可選連續(xù)轉(zhuǎn)換或程控)、SPI支持模式。對于連續(xù)轉(zhuǎn)換,有1Hz至200Hz轉(zhuǎn)換速率可選,見數(shù)據(jù)手冊截圖。 壓力數(shù)據(jù)由三個(gè)寄存器儲存,分別為PRESSURE_OUT_XL、PRESSURE_OUT_L、PRESSURE_OUT_H;溫度數(shù)據(jù)由兩個(gè)寄存器儲存,分別為TEMP_OUT_L、TEMP_OUT_H。相關(guān)寄存器定義如下: #include <inttypes.h>typedef enum{LPS22HH_PASSED =0U,LPS22HH_FAILED} LPS22HHState;#define LPS22HH_RD 0xBB#define LPS22HH_WR 0xBA#define IF_CTRL 0x0E#define CTRL_REG1 0x10#define REG_WHO_AM_I 0x0F#define PRESSURE_OUT_XL 0x28#define PRESSURE_OUT_L 0x29#define PRESSURE_OUT_H 0x2A#define TEMP_OUT_L 0x2B#define TEMP_OUT_H 0x2Cvoid LPS22HH_Init(void);float LPS22HH_GET_Pressure(void);float LPS22HH_GET_Temperature(void);LPS22HHState LPS22HH_Identity_Verification(void);傳感器初始化代碼中,給IF_CTRL賦值0x00,即采用I2C模式,不使用內(nèi)部上下拉;給CTRL_REG1賦值0x20,即轉(zhuǎn)換頻率10Hz,不使用濾波器且連續(xù)轉(zhuǎn)換: void LPS22HH_Init(void){        uint8_t cfg1[2] = {IF_CTRL, 0x00};        HAL_I2C_Mem_Write(&hi2c2, LPS22HH_WR, cfg1[0], I2C_MEMADD_SIZE_8BIT, cfg1 + 1, 1, 0xFF);        uint8_t cfg2[2] = {CTRL_REG1, 0x20};        HAL_I2C_Mem_Write(&hi2c2, LPS22HH_WR, cfg2[0], I2C_MEMADD_SIZE_8BIT, cfg2 + 1, 1, 0xFF);}身份驗(yàn)證代碼如下所示: LPS22HHState LPS22HH_Identity_Verification(void){        uint8_t reg_value = 0;        HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, REG_WHO_AM_I, I2C_MEMADD_SIZE_8BIT, reg_value, 1, 0xFFFF);        if (reg_value == 0xB3)                return LPS22HH_PASSED;        else                return LPS22HH_FAILED;}讀取壓力時(shí),先通過I2C總線獲取PRESSURE_OUT_XL、PRESSURE_OUT_L、PRESSURE_OUT_H三個(gè)寄存器的值,位移后組合為24位2進(jìn)制補(bǔ)碼形式。組合方式見下圖。 float LPS22HH_GET_Pressure(void){        float pressure = 0;        int32_t pressure_s32 = 0;        uint8_t pressure_xl, pressure_l, pressure_h = 0;        HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, PRESSURE_OUT_XL, I2C_MEMADD_SIZE_8BIT, &pressure_xl, 1, 0xFFFF);        HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, PRESSURE_OUT_L, I2C_MEMADD_SIZE_8BIT, &pressure_l, 1, 0xFFFF);        HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, PRESSURE_OUT_H, I2C_MEMADD_SIZE_8BIT, &pressure_h, 1, 0xFFFF);        pressure_s32 = (pressure_h << 16) | (pressure_l << 8) | pressure_xl;        pressure = (float)pressure_s32 / 4096 / 10;        return pressure;}讀取溫度時(shí),通過TEMP_OUT_L、TEMP_OUT_H組合16位溫度數(shù)據(jù),組合方式見下圖: 對組合后的數(shù)據(jù)/100,即可換算得到當(dāng)前溫度數(shù)據(jù);溫度傳感器誤差范圍±1.5攝氏度,轉(zhuǎn)換時(shí)對其進(jìn)行了補(bǔ)償,代碼如下: float LPS22HH_GET_Temperature(void){        float temperature = 0;        int16_t temperature_s16 = 0;        uint8_t temperature_l, temperature_h = 0;        HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, TEMP_OUT_L, I2C_MEMADD_SIZE_8BIT, &temperature_l, 1, 0xFFFF);        HAL_I2C_Mem_Read(&hi2c2, LPS22HH_RD, TEMP_OUT_H, I2C_MEMADD_SIZE_8BIT, &temperature_h, 1, 0xFFFF);        temperature_s16 = (temperature_h << 8) | temperature_l;        temperature = (float)temperature_s16 / 100 - 1.5;        return temperature;}最后給出簡單的氣壓-海拔換算公式,其中,壓力單位為kPa: printf('----Altitude-----: %fm\r\n',44330*(1- pow(pressure/102.3,0.19))/1000);上個(gè)圖展示下效果,本人在海邊,海拔大約1~2米,與換算結(jié)果較為一致: 來源:STM32論壇網(wǎng)友Litthins 版權(quán)歸原作者所有 | 
|  |