小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

優(yōu)板評測系列 | STM32U585AI探索套件壓力傳感器LPS22HH驅(qū)動與海拔換算

 新用戶0118F7lQ 2021-12-08

【編者按】物聯(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)境下的各種感知需求。

本文為5篇 B-U585I-IOT02A 開發(fā)板網(wǎng)友評測文章的第五篇,與大家分享該板的壓力傳感器LPS22HH驅(qū)動與海拔換算。

Image
今天分享的是壓力傳感器LPS22HH的數(shù)據(jù)讀取與海拔換算。板上編號U26,采用I2C2與STM32U5通信。

簡單介紹下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。


當(dāng)然也有一些突出特性,比如傳感器內(nèi)集成FIFO,支持突發(fā)連續(xù)數(shù)據(jù)讀取,該模式對需要低功耗和間歇獲取數(shù)據(jù)的應(yīng)用場合更友好。該傳感器支持工作環(huán)境溫度范圍-40至+85攝氏度,考慮部分較惡劣的工作條件,也可作為備選器件考慮。

Image

由于板上采用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ù)手冊截圖。

Image

壓力數(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 0x2C
void 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ǔ)碼形式。組合方式見下圖。

Image

該數(shù)據(jù)/4096即可換算得到單位為hPa的壓力值,代碼中將之轉(zhuǎn)換為kPa。

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ù),組合方式見下圖:

Image

對組合后的數(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é)果較為一致:

Image

來源:STM32論壇網(wǎng)友Litthins  版權(quán)歸原作者所有

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多