0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

气压计LPS22DF开发(1)----轮询获取气压计数据

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-11-27 09:59 次阅读

概述

本文将介绍如何使用 LPS22DF 传感器来读取数据。LPS22DF是一款超紧凑型压阻绝对压力传感器,可用作数字输出气压计。LPS22DF相比前代产品具有更低的功耗和更小的压力噪声。

本章主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取气压数据和温度数据。读取到的数据会被转换为适当的单位并通过串行通信输出。

最近在弄ST的教程,需要样片的可以加群申请:615061293/925643491 。

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。 主控为STM32U073CC,气压计为LPS22DF

视频教学

[https://www.bilibili.com/video/BV1PbmEYXE2J/]

样品申请

[https://www.wjx.top/vm/OhcKxJk.aspx#]

源码下载

[https://download.csdn.net/download/qq_24312945/89972258]

产品特性

LPS22DF是一款超紧凑型压阻绝对压力传感器,可用作数字输出气压计。LPS22DF相比前代产品具有更低的功耗和更小的压力噪声。

该器件包含传感元件和IC接口,该接口通过I²C、MIPI I3CSM或SPI接口实现传感元件与应用的通信,同时该器件也支持用于数据接口的广泛Vdd IO。检测绝对压力的传感元件由悬浮膜组成,采用ST开发的专门工艺进行制造。

LPS22DF采用全压塑孔LGA封装(HLGA)。可保证在-40 °C到+85 °C的温度范围都能工作。封装上有开孔,以便外部压力到达传感元件。

260-1260 hPa 的绝对压力范围,适用于多种气压应用。 最低电流消耗可达 1.7 μA,适合低功耗设备。 压力精度达 0.2 hPa,并具备 0.34 Pa 的低噪声和 0.45 Pa/°C 的温度补偿偏移。

通信模式

对于LPS22DF,可以使用IIC进行通讯。

最小系统图如下所示。

本文使用的板子原理图如下所示。

速率

该模块支持的I2C速度为快速模式1M。

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32H503CB。 配置时钟树,配置时钟为250M。

串口配置

查看原理图,PA9和PA10设置为开发板的串口。

配置串口,速率为115200。

IIC配置

配置IIC为快速模式,速度为400k。

SA0地址设置

通过设置SA0管脚的高低电平可以改变模块的地址。

这里设置SA0管脚位输出管脚。

CS片选配置

LPS22DF可以通过CS管脚进行IIC或者SPI通讯切换

堆栈设置

若无法正常运行需要修改优化等级。

串口重定向

打开魔术棒,勾选MicroLIB

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* 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 */

参考程序

[https://github.com/STMicroelectronics/lps22df-pid/]

SA0设置模块地址

使能SA0为低电平,配置模块地址。

HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);        
    HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);    //GPIO_PIN_RESET        

    printf("hello!n");



  lps22df_pin_int_route_t int_route;
  lps22df_all_sources_t all_sources;
  lps22df_bus_mode_t bus_mode;
  stmdev_ctx_t dev_ctx;
  lps22df_id_t id;
  lps22df_md_t md;
  int ret;

  /* Initialize mems driver interface */
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;

获取ID

可以向WHO_AM_I (0Fh)获取固定值,判断是否为0xB4。

lps22df_id_get为获取函数。

对应的获取ID驱动程序,如下所示。

/* Check device ID */
  lps22df_id_get(&dev_ctx, &id);
    printf("LPS22DF_ID=0x%x,whoamI=0x%xn",LPS22DF_ID,id.whoami);
  if (id.whoami != LPS22DF_ID)
    while(1);

复位操作

可以向CTRL_REG2 (11h)的BOOT位和SWRESET位写入1进行软件复位。
● BOOT: 重启存储在非易失性存储器中的寄存器内容。设置为 1 后立即执行,完成后自动清零。用于恢复工厂校准参数
● SWRESET: 软件复位。设置为 1 会触发复位,复位完成后自动清零。

对应的驱动程序,如下所示。

/* Boot device */
  ret = lps22df_init_set(&dev_ctx, LPS22DF_BOOT);
  if (ret != 0)
    while(1);

  /* Reset device */
  ret = lps22df_init_set(&dev_ctx, LPS22DF_RESET);
  if (ret != 0)
    while(1);

BDU设置

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。
连续更新模式(BDU = ‘0’):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。
块数据更新(BDU)模式(BDU = ‘1’):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。
简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。
可以向CTRL_REG2 (11h)的BDU寄存器写入1进行开启。

对应的驱动程序,如下所示。

/* Set bdu and if_inc recommended for driver usage */
  lps22df_init_set(&dev_ctx, LPS22DF_DRV_RDY);

设置速率

设置速率和平均样本数可以通过CTRL_REG1 (10h)进行设置。

● ODR[3:0](输出数据速率选择):用于设置传感器的数据输出速率。默认值为 0000(关机/单次采样模式)。可以设置的频率包括 1 Hz、4 Hz、10 Hz、25 Hz、50 Hz、75 Hz、100 Hz 和 200 Hz。不同的输出速率适用于不同应用场景,频率越高数据更新越快,但功耗也相应增加。
● AVG[2:0](平均选择):用于选择压力和温度数据的平均样本数。默认值为 000(4 次平均)。可选项包括 4、8、16、32、64、128 和 512。较高的平均数可以提高测量精度,但会导致响应速度下降。

/* Select bus interface */
  bus_mode.filter = LPS22DF_FILTER_AUTO;
  bus_mode.interface = LPS22DF_SEL_BY_HW;
  lps22df_bus_mode_set(&dev_ctx, &bus_mode);

  /* Set Output Data Rate */
  md.odr = LPS22DF_4Hz;
  md.avg = LPS22DF_16_AVG;
  md.lpf = LPS22DF_LPF_ODR_DIV_4;
  lps22df_mode_set(&dev_ctx, &md);

  /* Configure inerrupt pins */
  lps22df_pin_int_route_get(&dev_ctx, &int_route);
  int_route.drdy_pres   = PROPERTY_DISABLE;
  lps22df_pin_int_route_set(&dev_ctx, &int_route);

轮询读取数据

对于压强和温度数据是否准备好,可以查看STATUS (27h)的T_DA位和P_DA位,判断是否有新数据到达。
● T_DA(温度数据可用):表示新的温度数据是否生成。
● P_DA(压力数据可用):表示新的压力数据是否生成。

该寄存器在每个 ODR 周期都会更新,以反映最新的温度和压力数据状态。————————————————

原文链接:https://blog.csdn.net/qq_24312945/article/details/142976931

对于压强数据,主要在LPS22DF_PRESS_OUT_XL (28h)-LPS22DF_PRESS_OUT_H (2Ah)。

压强转换如下所示。

对于温度数据,主要在TEMP_OUT_L (2Bh)-TEMP_OUT_H (2Ch)。

对应代码如下。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

    /* Read output only if new values are available */
    lps22df_all_sources_get(&dev_ctx, &all_sources);
    if ( all_sources.drdy_pres | all_sources.drdy_temp ) {
      lps22df_data_get(&dev_ctx, &data);
      printf("pressure [hPa]:%6.2f temperature [degC]:%6.2frn",
              data.pressure.hpa, data.heat.deg_c);

    }


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

演示

正常气压为50hPa到1050hPa之间。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 气压计
    +关注

    关注

    1

    文章

    55

    浏览量

    18255
收藏 人收藏

    评论

    相关推荐

    气压计LPS25HB开发(1)----轮询获取气压计数据

    本文将介绍如何使用 LPS25HB 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取
    的头像 发表于 05-17 15:19 1175次阅读
    <b class='flag-5'>气压计</b><b class='flag-5'>LPS</b>25HB<b class='flag-5'>开发</b>(<b class='flag-5'>1</b>)----<b class='flag-5'>轮询</b><b class='flag-5'>获取</b><b class='flag-5'>气压计数据</b>

    气压计LPS22HB开发(1)----轮询获取气压计数据

    本文将介绍如何使用 LPS22HB 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取
    的头像 发表于 05-17 15:31 1497次阅读
    <b class='flag-5'>气压计</b><b class='flag-5'>LPS22</b>HB<b class='flag-5'>开发</b>(<b class='flag-5'>1</b>)----<b class='flag-5'>轮询</b><b class='flag-5'>获取</b><b class='flag-5'>气压计数据</b>

    e2studio开发LPS28DFW气压计(1)----轮询获取气压计数据

    本文将介绍如何使用 LPS28DFW 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取
    的头像 发表于 08-09 14:24 1427次阅读
    e2studio<b class='flag-5'>开发</b><b class='flag-5'>LPS</b>28DFW<b class='flag-5'>气压计</b>(<b class='flag-5'>1</b>)----<b class='flag-5'>轮询</b><b class='flag-5'>获取</b><b class='flag-5'>气压计数据</b>

    COCOFLY 教程 ——疯壳无人机·系列【7】SPI(气压计数据获取

    获取实验气压计数据获取实验使用STM32的硬件SPI与气压计SPL06相连接,串口1即UART1
    发表于 03-20 17:05

    COCOFLY 教程-疯壳无人机·系列--【7】SPI(气压计数据获取

    。每个压力传感器已被单独校准并包含校准系数。在应用中使用系数将测量结果转换成真实的压力和温度值。SPL06的实物图如下所示。 二、气压计数据获取实验气压计数据获取实验使用STM32的硬
    发表于 03-25 18:30

    COCOFLY 教程——疯壳无人机·系列·飞控开发基础【7】SPI(气压计数据获取

    实验使用STM32的硬件SPI与气压计SPL06相连接,串口1即UART1,通过USB转串口模块连接电脑,把SPI获取到的SPL06的原始压力值以及原始温度值
    发表于 04-07 11:29

    【飞控开发基础教程7】疯壳·开源编队无人机-SPI(气压计数据获取

    真实的压力和温度值。 SPL06 的实物图如下所示。 图2 二、气压计数据获取实验 气压计数据获取实验使用 STM32 的硬件 SPI 与气压计
    发表于 05-30 14:27

    【飞控开发基础教程7】开源编队无人机-SPI(气压计数据获取

    真实的压力和温度值。 SPL06 的实物图如下所示。 图2 二、气压计数据获取实验 气压计数据获取实验使用 STM32 的硬件 SPI 与气压计
    发表于 07-14 17:51

    LPS22DF器件相关的使用信息和应用提示

    本文档提供 ST LPS22DF 器件相关的使用信息和应用提示。LPS22DF 是一款超紧凑型压阻绝对气压传感器,可用作数字输出气压计,具有数字 I²C / MIPI I3CSM /
    发表于 09-07 06:37

    数字气压计设计与制作解析

    本文主要介绍了数字气压计设计与制作解析.
    发表于 06-26 08:00 34次下载
    数字<b class='flag-5'>气压计</b>设计与制作解析

    DIY高级Arduino气压计

    电子发烧友网站提供《DIY高级Arduino气压计.zip》资料免费下载
    发表于 10-31 10:50 3次下载
    DIY高级Arduino<b class='flag-5'>气压计</b>

    LPS22DF压阻绝对气压传感器应用笔记

    电子发烧友网站提供《LPS22DF压阻绝对气压传感器应用笔记.pdf》资料免费下载
    发表于 08-01 09:09 0次下载
    <b class='flag-5'>LPS22DF</b>压阻绝对<b class='flag-5'>气压</b>传感器应用笔记

    气压计是如何进行高程定位的?精度如何?

    气压计是一种通过测量大气压力变化来进行高程定位的仪器。其原理基于大气压力随高度变化的规律,通常使用标准大气模型来估算高度。 在高程定位中,气压计通常与卫星定位标签结合使用,以提供更准确
    的头像 发表于 08-22 10:31 1824次阅读

    气压计LPS28DFW开发(1)----轮询获取气压计数据

    本文将介绍如何使用 LPS28DFW 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取
    的头像 发表于 12-28 09:58 553次阅读
    <b class='flag-5'>气压计</b><b class='flag-5'>LPS</b>28DFW<b class='flag-5'>开发</b>(<b class='flag-5'>1</b>)----<b class='flag-5'>轮询</b><b class='flag-5'>获取</b><b class='flag-5'>气压计数据</b>

    e2studio开发LPS28DFW气压计(1)----轮询获取气压计数据

    本文将介绍如何使用 LPS28DFW 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取
    的头像 发表于 01-09 16:05 443次阅读
    e2studio<b class='flag-5'>开发</b><b class='flag-5'>LPS</b>28DFW<b class='flag-5'>气压计</b>(<b class='flag-5'>1</b>)----<b class='flag-5'>轮询</b><b class='flag-5'>获取</b><b class='flag-5'>气压计数据</b>