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

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

  • 概述
  • 硬件准备
  • 视频教学
  • 样品申请
  • 源码下载
  • 产品特性
  • 通信模式
  • 速率
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • CS和SA0地址设置
  • 串口重定向
  • 参考程序
  • SA0设置模块地址
  • 获取ID
  • 复位操作
  • BDU设置
  • 设置低通滤波器
  • 设置速率
  • 轮询读取数据
  • 演示

概述

最近在弄ST的课程,需要样片的可以加群申请:615061293 。
本文将介绍如何使用 LPS22HB 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及通过轮询方式持续读取气压数据和温度数据。读取到的数据会被转换为适当的单位并通过串行通信输出。

在这里插入图片描述

硬件准备

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

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1WH4y1A7bM/

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

样品申请

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

源码下载

产品特性

LPS22HB 是一款超紧凑型压阻式绝对压力传感器,可用作数字输出气压计。该器件包括一个传感元件和一个 I2C 接口,该接口通过 I 2 C 或 SPI 从传感元件与应用程序进行通信。
检测绝对压力的传感元件由采用 ST 开发的专用工艺制造的悬浮膜组成。
LPS22HB 采用全模制、带孔 LGA 封装 (HLGA)。保证在 -40 °C 至 +85 °C 的温度范围内运行。封装上有孔,以允许外部压力到达传感元件。

通信模式

对于LPS22HB,可以使用IIC进行通讯。
最小系统图如下所示。

在这里插入图片描述

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

在这里插入图片描述

速率

该模块支持的I2C速度为快速模式400k。
在这里插入图片描述

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32U073CC。
配置时钟树,配置时钟为48M。
在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。
在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

在这里插入图片描述

配置IIC为快速模式,速度为400k。
在这里插入图片描述

CS和SA0地址设置

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

在这里插入图片描述

这里设置SA0管脚位输出管脚。
在这里插入图片描述

在这里插入图片描述

串口重定向

打开魔术棒,勾选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 */

参考程序

hhttps://github.com/STMicroelectronics/lps22hb-pid/tree/master

SA0设置模块地址

使能SA0为低电平,配置模块地址。
在这里插入图片描述

	HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);	
	HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);	
	
  /* 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)获取固定值,判断是否为0xB1。

在这里插入图片描述

lps22hb_device_id_get为获取函数。

在这里插入图片描述

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

  /* Check device ID */
  lps22hb_device_id_get(&dev_ctx, &whoamI);
	printf("LPS22HB_ID=0x%x,whoamI=0x%x",LPS22HB_ID,whoamI);
  if (whoamI != LPS22HB_ID) {
    while (1)/* manage here device not found */;
  }

复位操作

可以向CTRL_REG2 (11h)的SWRESET位写入1进行软件复位。
在这里插入图片描述

lps22hb_reset_set为重置函数。

在这里插入图片描述

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

  /* Restore default configuration */
  lps22hb_reset_set(&dev_ctx, PROPERTY_ENABLE);

  do {
    lps22hb_reset_get(&dev_ctx, &rst);
  } while (rst);

BDU设置

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

在这里插入图片描述

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

  /* Enable Block Data Update */
  lps22hb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

设置低通滤波器

可以向CTRL_REG1 (10h)的LPFP_CFG 位设置低通滤波器。

在这里插入图片描述
在这里插入图片描述

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

  /* Can be enabled low pass filter on output */
  lps22hb_low_pass_filter_mode_set(&dev_ctx, LPS22HB_LPF_ODR_DIV_2);

设置速率

设置速率可以通过CTRL_REG1 (10h)的ODR位进行设置。

在这里插入图片描述

  /* Set Output Data Rate */
  lps22hb_data_rate_set(&dev_ctx, LPS22HB_ODR_10_Hz);

轮询读取数据

对于压强和温度数据是否准备好,可以查看STATUS (27h)的T_DA位和P_DA位,判断是否有新数据到达。
在这里插入图片描述
对于压强数据,主要在PRESS_OUT_XL (28h)-PRESS_OUT_H (2Ah)。

在这里插入图片描述

压强转换如下所示。

在这里插入图片描述

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

在这里插入图片描述

对应代码如下。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
    uint8_t reg;
    /* Read output only if new value is available */
    lps22hb_press_data_ready_get(&dev_ctx, &reg);
    uint8_t reg_temp;		
		lps22hb_temp_data_ready_get(&dev_ctx, &reg_temp);
    if (reg) {
//      memset(&data_raw_pressure, 0x00, sizeof(int32_t));
//      lps22hb_pressure_raw_get(&dev_ctx, &data_raw_pressure);
//      pressure_hPa = lps22hb_from_lsb_to_hpa(data_raw_pressure);
//      printf("pressure [hPa]:%6.2f\r\n", pressure_hPa);
	
			uint8_t reg1[3];
			int32_t ret;
			lps22hb_read_reg(&dev_ctx, LPS22HB_PRESS_OUT_XL,  reg1, 3);	
			ret = reg1[2];
			ret=ret<<8;
			ret+=reg1[1];
			ret=ret<<8;
			ret+=reg1[0];
			pressure_hPa=	(float)ret / 4096.0f;
			printf("OUT_XL=%x %x %x %x\n",reg1[0],reg1[1],reg1[2],ret);			
			
			printf("pressure [hPa]:%6.2f\r\n", pressure_hPa);			
    }		
    if (reg_temp) {	
      memset(&data_raw_temperature, 0x00, sizeof(int16_t));
      lps22hb_temperature_raw_get(&dev_ctx, &data_raw_temperature);
      temperature_degC = lps22hb_from_lsb_to_degc(data_raw_temperature);
      printf("temperature [degC]:%6.2f\r\n",temperature_degC);			
	
		}			
		
    /* USER CODE END WHILE */

演示

在这里插入图片描述

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/566122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Algorithm][二分查找][山峰数组的峰顶索引][寻找峰值][寻找旋转排序数组中的最小值][0~n-1中缺失的数字]详细讲解

目录 1.山脉数组的峰顶索引1.题目链接2.算法原理详解3.代码实现 2.寻找峰值1.题目链接2.算法原理详解3.代码实现 3.寻找旋转排序数组中的最小值1.题目链接2.算法原理详解3.代码实现 4.0〜n-1 中缺失的数字1.题目链接2.算法原理详解3.代码实现 1.山脉数组的峰顶索引 1.题目链接…

TaskWeaver使用记录

TaskWeaver使用记录 1. 基本介绍2. 总体结构与流程3. 概念细节3.1 Project3.2 Session3.3 Memory3.4 Conversation3.5 Round3.6 Post3.7 Attachment3.8 Plugin3.9 Executor 4. 代码特点5. 使用过程5.1 api调用5.2 本地模型使用5.3 添加插件 6. 存在的问题与使用体验6.1 判别模型…

模板初阶

泛型编程&#xff1a; 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;模板是泛型编程的基础 class Test { public:void Swap(int& left, int& right){int tmp left;left right;right tmp;}void Swap(double& left, double& right){double tmp…

一句话或一张图讲清楚系列之——ISERDESE2的原理

主要参考&#xff1a; https://blog.csdn.net/weixin_50810761/article/details/137383681 xilinx原语详解及仿真——ISERDESE2 作者&#xff1a;电路_fpga https://blog.csdn.net/weixin_45372778/article/details/122036112 Xilinx ISERDESE2应用笔记及仿真实操 作者&#x…

鸿蒙OpenHarmony【小型系统编写“Hello World”程序】 (基于Hi3516开发板)

编写“Hello World”程序 下方将展示如何在单板上运行第一个应用程序&#xff0c;其中包括新建应用程序、编译、烧写、运行等步骤&#xff0c;最终输出“Hello World&#xff01;”。 前提条件 已参考[创建工程并获取源码]&#xff0c;创建Hi3516开发板的源码工程。 鸿蒙开发…

【Python-装饰器】

Python-装饰器 ■ 简介■ 装饰器的一般写法&#xff08;闭包写法&#xff09;■ 装饰器的语法 (outer写法) ■ 简介 装饰器其实是一种闭包&#xff0c; 功能就是在不破坏目标函数原有的代码和功能的前提下为目标函数增加新功能。 ■ 装饰器的一般写法&#xff08;闭包写法&am…

服务器数据恢复—StorNext文件系统下raid5阵列数据恢复案例

服务器数据恢复环境&#xff1a; 昆腾某型号存储&#xff0c;8个存放数据的存储柜1个存放元数据的存储柜。 元数据存储&#xff1a;8组RAID1阵列1组RAID10阵列4个全局热备硬盘。 数据存储&#xff1a;32组RAID5阵列&#xff0c;划分2个存储系统。 服务器故障&#xff1a; 数据…

鸿蒙开发模拟器的坑, No Devices

问题 我已经安装了模拟器&#xff0c;并且模拟器已经运行了 在Device Manager页面开启模拟器 No Devices 但是这里没有模拟器的选项 解决 添加环境变量 下面步骤 1、清除用户数据 2、 关闭Device Manager 3、 关闭ide 重启ide、开启模拟器 看到有模拟器的选项了

SLICEM是如何将查找表配置为分布式RAM/移位寄存器的

1.首先说SliceM和SliceL如何配置为ROM的 一个SLICE包含4个六输入查找表&#xff0c;因此每个查找表就能存储64bit的数据&#xff0c;要实现128bit的ROM&#xff0c;只需要通过两个LUT就可实现&#xff0c;具体如下表: 2.如何配置成为分布式RAM SLICEM中的LUT如下图&#xff…

iOS - Runloop在实际开发中的应用

文章目录 iOS - Runloop在实际开发中的应用1. 控制线程生命周期&#xff08;线程保活&#xff09;2. 解决NSTimer在滑动时停止工作的问题2.1. 案例2.2 解决 3. 监控应用卡顿4. 性能优化 iOS - Runloop在实际开发中的应用 1. 控制线程生命周期&#xff08;线程保活&#xff09;…

夜神、雷电、android studio手机模拟器资源占用情况

夜神、雷电、android studio手机模拟器内存资源占用情况 由于开发电脑只有16G内存&#xff0c;出于开发需要和本身硬件资源的限制&#xff0c;对多个手机模拟器进行了机器资源占用&#xff08;主要是内存&#xff09;的简单比较。 比较的模拟器包括&#xff1a; 1. Android S…

[Linux][多线程][二][线程互斥][互斥量][可重入VS线程安全][常见锁概念]

目录 1.线程互斥1.互斥相关背景概念2.多个线程并发的操作共享变量&#xff0c;会带来一些问题3.互斥量mutex 2.互斥量的接口1.初始化互斥量2.销毁互斥量3.加锁4.解锁5.使用 -- 改善上面代码 3.互斥量实现原理探究1.加锁是如何保证原子性的&#xff1f;2.如何保证锁是原子性的&a…

交通工程绪论

一、交通工程 交通工程学定义交通工程学研究的内容交通工程学的产生与发展交通工程学在道路运输管理中的作用 1. 交通工程学定义 早在20世纪30年代&#xff0c;美国交通工程师协会(American Institute of Traffic Engineers)给交通工程学(Traffic Engineering)下了一个定义&a…

Java中使用Graphics2D绘制字符串文本自动换行 算法

效果&#xff1a; 代码&#xff1a; /*** return void* Author xia* Description //TODO 写字换行算法* Date 18:08 2021/4/1* Param []**/private static void drawWordAndLineFeed(Graphics2D g2d, Font font, String words, int wordsX, int wordsY, int wordsWidth) {FontD…

Java微服务架构之Spring Boot —上篇

SpringBoot 概述 SpringBoot提供了一种快速使用Spring的方式&#xff0c;基于约定优于配置的思想&#xff0c;可以让开发人员不必在配置与逻辑业务之间进行思维的切换&#xff0c;全身心的投入到逻辑业务的代码编写中&#xff0c;从而大大提高了开发的效率&#xff0c;一定程度…

CentOS 7虚拟机配置过程中所需组件的安装(二)

1.安装net-tools组件&#xff08;解决无 ifconfig&#xff09; # yum install net-tools 2.安装gcc、c编译器以及内核文件 # yum -y install gcc gcc-c kernel-devel 验证安装成功 3.安装nano&#xff08;文本编辑器&#xff09; # yum install nano

stm32——GPIO学习

对于许多刚入门stm32的同学们来说&#xff0c;GPIO是我们的第一课&#xff0c;初出茅庐的我们会对GPIO的配置感到疑惑不解&#xff0c;也是劝退我们的第一课&#xff0c;今天我们就来一起学习一下stm32的GPIO&#xff0c;提振一下信心。好的&#xff0c;发车了小卷卷们&#xf…

Redis入门到通关之Redis数据结构-ZSet篇

文章目录 ZSet也就是SortedSet&#xff0c;其中每一个元素都需要指定一个 score 值和 member 值&#xff1a; 可以根据score值排序后member必须唯一可以根据member查询分数 因此&#xff0c;zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学习的哪种编…

vscode ssh远程连接服务器,一直正在下载vscode服务器的解决办法

前言 为方便描述&#xff0c;在本教程中&#xff0c;发起远程连接的叫“主机”&#xff0c;被远程连接的叫“服务器”。 正文 如果主机是首次用vscode远程连接服务器&#xff0c;会在服务器上自动下载vscode服务器&#xff0c;但有时候因为网络问题&#xff0c;会卡在&#xff…

OpenCV轻松入门(九)——使用第三方库imgaug自定义数据增强器

安装命令&#xff1a;pip install imgaug 代码实现&#xff1a; import cv2 import random import matplotlib.pyplot as pltfrom imgaug import augmenters as iaa # 数据增强——缩放效果 def zoom_img(img):# 获取一个1-1.3倍的线性图像处理器&#xff0c;scale参数是缩放范…