STM32U585AI探索套件压力传感器LPS22HH驱动与海拔换算

发布时间:2023-02-03  

今天分享的是压力传感器LPS22HH的数据读取与海拔换算。板上编号U26,采用I2C2与STM32U5通信。

简单介绍下LPS22HH,传感器采用HLGA-10L封装,整体尺寸在2.0x2.0x0.73mm,是结构非常紧凑,适合空间受限应用环境的高性能MEMS压力传感器。作为气压传感器,量程和精度是我们普遍关心的指标。LPS22HH量程在260至1260hPa,精度在0.5hPa并且内建温度补偿。器件本身支持SPI、I2C、I3C总线,工作电压1.7至3.6V。


当然也有一些突出特性,比如传感器内集成FIFO,支持突发连续数据读取,该模式对需要低功耗和间歇获取数据的应用场合更友好。该传感器支持工作环境温度范围-40至+85摄氏度,考虑部分较恶劣的工作条件,也可作为备选器件考虑。



由于板上采用I2C总线与传感器通讯,接下来的驱动编写也使用I2C的通信方式。


LPS22HH的读地址为0xBB,定义为LPS22HH_RD;写地址为0xBA;定义为LPS22HH_WR。与HTS221温湿度传感器一样,LPS22HH也有一个名为REG_WHO_AM_I的寄存器地址0x0F;读取该地址,将得到0xB3的返回值;该值用于系统验证设备身份,与I2C总线的响应机制结合,可作为双重验证机制。验证结果通过枚举LPS22HHState表示,使代码便于理解。操作LPS22HH,除需要读取存放压力与温度参数的5个寄存器,还需要至少配置两个控制寄存器,分别是IF_CTRL和CTRL_REG1。其中,IF_CTRL用于控制总线内部上下拉方式,I3C和I2C支持模式。CTRL_REG1用于控制内部滤波器、转换模式(可选连续转换或程控)、SPI支持模式。对于连续转换,有1Hz至200Hz转换速率可选,见数据手册截图。



压力数据由三个寄存器储存,分别为PRESSURE_OUT_XL、PRESSURE_OUT_L、PRESSURE_OUT_H;温度数据由两个寄存器储存,分别为TEMP_OUT_L、TEMP_OUT_H。相关寄存器定义如下:

#include


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模式,不使用内部上下拉;给CTRL_REG1赋值0x20,即转换频率10Hz,不使用滤波器且连续转换:


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);

}



身份验证代码如下所示:


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;

}

读取压力时,先通过I2C总线获取PRESSURE_OUT_XL、PRESSURE_OUT_L、PRESSURE_OUT_H三个寄存器的值,位移后组合为24位2进制补码形式。组合方式见下图。




该数据/4096即可换算得到单位为hPa的压力值,代码中将之转换为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;

}


读取温度时,通过TEMP_OUT_L、TEMP_OUT_H组合16位温度数据,组合方式见下图:


对组合后的数据/100,即可换算得到当前温度数据;温度传感器误差范围±1.5摄氏度,转换时对其进行了补偿,代码如下:

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-----: %fmrn",44330*(1- pow(pressure/102.3,0.19))/1000);



上个图展示下效果,本人在海边,海拔大约1~2米,与换算结果较为一致:


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    设计。 LTS110是一款性价比极高的V/I转换器,可以将模拟电压线性的转换成0-20mA/4-20mA;用户可以通过外部的Rset进行设置想要的输出范围;外部可通过三极管进行功率转移;LDO为内部基准输出......
    模拟信号传感器的性能选型搜索 1、两线制电流/电压输出传感器(无供电电源,由负载提供16—24V配电,输出4-20mA/0-5V)。 1.1、两线制无源4-20mA输入型传感器,经电......
    接线 图9. 源型输出 图10. 继电器输出 晶体管输出只能接成源型输出(图9),不能接成漏型,即输出为24V。 继电器输出是一组共用一个公共端的干节点,可以接交流或直流,电压等级最高到220V......
    -20mA信号然后再输出; 控制器再将4-20mA反译为具体的温度值; 基于此温度值,控制回路会给实现对过程终端控制元件的控制。 同样,控制回路中的压力变送器,通常用来测量过程介质的压力值: 传感......
    电源之间没有联系也可以。 数字量输出接线 图9. 源型输出 图10. 继电器输出 晶体管输出只能接成源型输出(图9),不能接成漏型,即输出为24V。 继电器输出是一组共用一个公共端的干节点,可以接交流或直流,电压......
    4~20mA,而接收端4~20mA的接口为二线回路供电方式,不方便外接电源,此时选用输出端供电型信号隔离器,将供电型隔离器由信号输出线接入到输出环路,它由接收设备供电,同时隔离现场4线制变送器的信号并输出......
    420mA输出接口的绝对值编码器。 绝对值编码器分单圈绝对值和多圈绝对值,单圈绝对值编码器是指编码器旋转在360度以内工作,或者0—180度内工作,这样选择的编码器,4mA对应0度,360度(或......
    信号有很多种,主要4~20mA,0~20mA,0~10V,0~5V等等,但是比较常用的是4~20mA和0~10V两种,在我上面举的这些输出信号中,只有4~20mA为两线制(我们所说的输出......
    图中的继电器、接点、线圈不是物理的,是PLC存储器中的位(1=0N;0=0FF);编程时常开/常闭接点可无限次引用,线圈输出只能是一次; 3、梯形图中流过的不是物理电流而是“概念电流”,只能从左向右流; 4、用户......
    、线圈不是物理的,是PLC存储器中的位(1=0N;0=0FF);编程时常开/常闭接点可无限次引用,线圈输出只能是一次; 3、梯形图中流过的不是物理电流而是“概念电流”,只能从左向右流; 4、用户......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>