STM32F103学习笔记(11)——压力传感器GZP6859D使用

news2024/7/2 3:46:49

一、简介

数据手册:https://item.szlcsc.com/3590436.html

GZP6859D 型压力传感器采用 SOP6 封装形式,内部集成了高精度 ADC 芯片,对传感器芯片输出的偏移、灵敏度、温漂和非线性进行数字补偿,以供电电压为参考,产生一个经过校准、温度补偿后的标准数字信号。

GZP6859D 型压力传感器尺寸小,方便客户安装。产品广泛用于医疗电子、汽车电子、运动健身器材等领域。

  • 测量范围-100kPa…0~5kPa…200kPa
  • 表压型
  • SOP6 封装
  • 适用于无腐蚀性的气体
  • 电源电压: 2.5V~5.5V
  • IIC 通讯

1.1 I2C地址分配

I2C 总线使用 SCL 和 SDA 作为信号线,这两根线都通过上拉电阻(典型值 4.7K)连接到 VDD,不通信时都保持为高电平。I2C 设备地址为 0x6D

二、硬件连接

功能口引脚
SCLPB.8
SDAPB.9

三、添加I2C驱动

I2C配置查看 STM32CubeMX学习笔记(9)——I2C接口使用(读写EEPROM AT24C02)

四、采集温度和气压

4.1 寄存器描述

Reg0x06-Reg0x08:压力数据寄存器

Reg0x09-Reg0x0A:温度数据寄存器

Reg0x30:测量命令寄存器

Measurement_ctrl<2:0>:工作模式

  • 000:单次温度采集模式。
  • 001:单次传感器压力信号采集模式。(使用此模式之前需要先读取温度,以获取温度校准系数,否则读数不准)
  • 010:组合采集模式(一次温度采集后立即进行一次传感器压力信号采集)。
  • 011:休眠模式(定期的执行一次组合采集模式,间隔时间由‘sleep_time’决定)

sco:数据采集完成标志位

  • 1:开始数据采集
  • 0:采集结束(休眠工作模式除外)

Sleep_time<7:4>:休眠时间

  • 0001:62.5ms
  • 0010:125ms
  • 1111:1s
  • 0000:无意义

Reg0xA5

Aout_config<7:4>:模拟输出配置(建议保留默认配置)

LDO_config:内部 LDO 配置

  • 0:配置成 1.8V
  • 1:配置成 3.6V

Unipolar

  • 0:ADC 原始数据以有符号数格式输出
  • 1:ADC 原始数据以无符号格式输出。(仅当‘Data_out_control’=1 有效)

Data_out_control

  • 0:输出校准数据
  • 1:输出 ADC 原始数据(默认配置为 0)

Diag_on

  • 0:关闭诊断功能
  • 1:开启诊断功能(默认开启)

Reg0xA6

Input Swap:在传感器内部交换差分信号极性

Gain_P<5:3>:采集传感器信号时 PGA 增益

  • 000:增益=1X。
  • 001:增益=2X。
  • 010:增益=4X。
  • 011:增益=8X。
  • 100:增益=16X。
  • 101:增益=32X。
  • 110:增益=64X。
  • 111:增益=128X。

OSR_P<2:0>:采集传感器信号时的过采样

  • 000:1024X。
  • 001:2048X。
  • 010:4096X。
  • 011:8192X。
  • 100:256X。
  • 101:512X。
  • 110:16384X。
  • 111:32768X。

4.2 工作模式说明

4.2.1 组合数据采集模式

设置‘measurement_control’=010 和‘sco’=1 进入组合数据采集模式。

芯片上电后先后进行一次温度数据采集和一次传感器数据采集,完成后回到待机模式,并自动将‘sco’置 0。在组合采集模式下,“Data_out_control”寄存器必须设置为 0,校准后的温度数据储存在 0x09~0x0A 寄存器,压力数据储存在 0x06~0x08 寄存器。

组合模式读取数据按照如下指令顺序进行操作:

  1. 发送指令 0x0A0x30 寄存器进行一次温度采集,一次压力数据采集。
  2. 读取 0x30 寄存器地址,若Sco位为0代表采集结束,可以读取数据。或等待延迟10ms。
  3. 读取 0x060x070x08 三个寄存器地址数据构成 24 位 AD 值(压力数据 AD 值),读取 0x090x0A 两个寄存器地址数据构成 16 位 AD 值(温度数据 AD 值)
  4. 按以下公式换算成实际压力、温度值。

4.2.2 休眠数据采集模式

设置‘measurement_control’=011 和‘sco’=1 进入休眠数据采集模式。芯片上电后,以一定的时间间隔进行一次温度数据采集和一次传感器数据采集,间隔时间由’sleep_time’ 设置,范围为 62.5ms 到 1s。除非手动将‘sco’置 0,不然不会停止采集。在休眠数据采集模式下‘Data_out_control’必须设置为 0,校准后的温度数据储存在 0x09~0x0A 寄存器,压力数据储存在 0x06~0x08 寄存器。

4.3 温度和压力值换算公式

  • 最高位为“0”代表正压/正温度:
    压力:Pressure = Pressure_ ADC / k
    温度:Temperature = Temp_ ADC / 256

  • 最高位为“1”代表负压/负温度:
    压力:Pressure = (Pressure_ADC - 16777216) / k
    温度:Temperature = (Temp_ADC - 65536) / 256

注:
1)传感器校准后的输出可视为当前实际压力值(±1%Span)
2)传感器校准后的输出:单位 Pa(默认),若要显示其他单位,可在换算公式里输入相应的系数进行换算;
3)关于上述压力 ADC 换算公式中 k 值的选取可参照下表:

P 取测量点的最大数值(绝对值),比如,测量-20~40kpa,P 取 40,因为 32<40 ≤ 65,所以 k 值为 128;又比如,测量范围-100~50kpa,P 取 100,因为 65<P ≤ 131,所以 k 值为 64。

五、移植文件

5.1 board_gzp6859d.h

#ifndef _BOARD_GZP6859D_H_
#define _BOARD_GZP6859D_H_

/*********************************************************************
 * INCLUDES
 */
#include <stdint.h>

/*********************************************************************
 * DEFINITIONS
 */
#define GZP6859D_SLAVE_ADDR         0x6D

#define GZP6859D_WRITE_BIT          0x00
#define GZP6859D_READ_BIT           0x01

#define GZP6859D_DATA_MSB_ADDR      0x06
#define GZP6859D_DATA_CSB_ADDR      0x07
#define GZP6859D_DATA_LSB_ADDR      0x08
#define GZP6859D_TEMP_MSB_ADDR      0x09
#define GZP6859D_TEMP_LSB_ADDR      0x0A
#define GZP6859D_CMD_ADDR           0x30
#define GZP6859D_SYS_CONFIG_ADDR    0xA5
#define GZP6859D_P_CONFIG_ADDR      0xA6

#define GZP6859D_ONE_TEMP           0x08
#define GZP6859D_ONE_PRESS          0x09
#define GZP6859D_COM                0x0A
#define GZP6859D_DORMANT            0x0B

#define GZP6859D_K_VALUE            512

/*********************************************************************
 * GLOBAL VARIABLES
 */

/*********************************************************************
 * API FUNCTIONS
 */
void GZP6859D_ReadSingleModePressureData(int32_t *pPressure);
void GZP6859D_ReadCombinedModeData(int32_t *pTemperature, int32_t *pPressure);


#endif /* _BOARD_GZP6859D_H_ */

5.2 board_gzp6859d.c

/*********************************************************************
 * INCLUDES
 */
#include <stdio.h>
#include "i2c.h"

#include "board_gzp6859d.h"

/*********************************************************************
 * PUBLIC FUNCTIONS
 */
/**
 @brief 单次模式读取压力数据
 @param pPressure -[out] 压力值
 @return 无
*/
void GZP6859D_ReadSingleModePressureData(int32_t *pPressure)
{		
    uint8_t cmd = GZP6859D_ONE_PRESS;
    uint8_t result = 0;
    uint8_t pressArr[4] = {0};
    int32_t press = 0;
    
    // 进行单次传感器压力信号采集模式
    HAL_I2C_Mem_Write(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_WRITE_BIT,
                    GZP6859D_CMD_ADDR, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 10);
    
    // 采集结束
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_CMD_ADDR, I2C_MEMADD_SIZE_8BIT, &result, 1, 10);
    printf("0x%02X  ", result);
    
    // 获取压力数据AD值
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_DATA_MSB_ADDR, I2C_MEMADD_SIZE_8BIT, &pressArr[1], 1, 10);
    printf("0x%02X  ", pressArr[1]);
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_DATA_CSB_ADDR, I2C_MEMADD_SIZE_8BIT, &pressArr[2], 1, 10);
    printf("0x%02X  ", pressArr[2]);
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_DATA_LSB_ADDR, I2C_MEMADD_SIZE_8BIT, &pressArr[3], 1, 10);
    printf("0x%02X  ", pressArr[3]);
    
    // 压力计算公式
    press = (pressArr[0] << 24) + (pressArr[1] << 16) + (pressArr[2] << 8) + pressArr[3];
    if(press > 8388607)
    {
        press = press - 16777216;
    }
    press = press / GZP6859D_K_VALUE;   // 单位为Pa
    *pPressure = press;
    printf("press:%d\r\n", press);
}

/**
 @brief 组合模式读取数据
 @param pTemperature -[out] 温度值
 @param pPressure -[out] 压力值
 @return 无
*/
void GZP6859D_ReadCombinedModeData(int32_t *pTemperature, int32_t *pPressure)
{		
    uint8_t cmd = GZP6859D_COM;
    uint8_t result = 0;
    uint8_t tempArr[4] = {0};
    int32_t temp = 0;
    uint8_t pressArr[4] = {0};
    int32_t press = 0;
    
    // 进行组合模式读取数据
    HAL_I2C_Mem_Write(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_WRITE_BIT,
                    GZP6859D_CMD_ADDR, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 10);
    
    // 采集结束
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_CMD_ADDR, I2C_MEMADD_SIZE_8BIT, &result, 1, 10);
    printf("0x%02X  ", result);
    
    // 获取温度数据AD值
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_TEMP_MSB_ADDR, I2C_MEMADD_SIZE_8BIT, &tempArr[2], 1, 10);
    printf("0x%02X  ", tempArr[2]);
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_TEMP_LSB_ADDR, I2C_MEMADD_SIZE_8BIT, &tempArr[3], 1, 10);
    printf("0x%02X  ", tempArr[3]);
    
    // 温度计算公式
    temp = (tempArr[0] << 24) + (tempArr[1] << 16) + (tempArr[2] << 8) + tempArr[3];
    if(temp > 32768)
    {
        temp = temp - 65536;
    }
    temp = temp / 256;                  // 单位为℃
    *pTemperature = temp;
    printf("temp:%d\r\n", temp);
    
    // 获取压力数据AD值
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_DATA_MSB_ADDR, I2C_MEMADD_SIZE_8BIT, &pressArr[1], 1, 10);
    printf("0x%02X  ", pressArr[1]);
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_DATA_CSB_ADDR, I2C_MEMADD_SIZE_8BIT, &pressArr[2], 1, 10);
    printf("0x%02X  ", pressArr[2]);
    HAL_I2C_Mem_Read(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_READ_BIT,
                    GZP6859D_DATA_LSB_ADDR, I2C_MEMADD_SIZE_8BIT, &pressArr[3], 1, 10);
    printf("0x%02X  ", pressArr[3]);
    
    // 压力计算公式
    press = (pressArr[0] << 24) + (pressArr[1] << 16) + (pressArr[2] << 8) + pressArr[3];
    if(press > 8388607)
    {
        press = press - 16777216;
    }
    press = press / GZP6859D_K_VALUE;   // 单位为Pa
    *pPressure = press;
    printf("press:%d\r\n", press);
}

/****************************************************END OF FILE****************************************************/

六、使用例子

I2C 初始化后,调用 GZP6859D_ReadCombinedModeData() 先以组合模式读取温度,以获取温度校准系数,否则读数不准。然后调用 GZP6859D_ReadSingleModePressureData() 读取单次压力值。

#include "board_gzp6859d.h"

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  int32_t temperature;
  int32_t pressure  
  GZP6859D_ReadCombinedModeData(&temperature, &pressure);  //先以组合模式读取温度,以获取温度校准系数,否则读数不准

  /* USER CODE END 2 */

  /* Call init function for freertos objects (in freertos.c) */
  MX_FREERTOS_Init();

  /* Start scheduler */
  osKernelStart();

  /* We should never get here as control is now taken by the scheduler */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    int32_t pressure;
    GZP6859D_ReadSingleModePressureData(&pressure);
    printf("p:%d\r\n", pressure);
    HAL_Delay(1000);
    /* USER CODE END WHILE */
    
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

查看打印:


• 由 Leung 写于 2023 年 1 月 30 日

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java实现对Excel表格数据的读写(附B站详细讲解视频)

文章目录 Maven依赖设置导入相应jar包 读取.xlsx表格文件数据 写入数据到.xlsx表格文件 读写后缀名为.xls类型的表格文件&#xff08;旧版表格文件&#xff09; 详细视频教程 Maven依赖设置导入相应jar包 <project xmlns"http://maven.apache.org/POM/4.0.0" …

论文理解【Offline RL】——【One-step】Offline RL Without Off-Policy Evaluation

标题&#xff1a;Offline RL Without Off-Policy Evaluation文章链接&#xff1a;Offline RL Without Off-Policy Evaluation代码&#xff1a;davidbrandfonbrener/onestep-rl发表&#xff1a;NIPS 2021领域&#xff1a;离线强化学习&#xff08;offline/batch RL&#xff09;—…

【深度学习】知识蒸馏原理以及实践从0到1

文章目录前言1、知识蒸馏1.1 是什么&#xff1f;1.2 训练流程1.3 问题与挑战2、落地使用2.1 后续问题&#xff1a;总结前言 有没有什么方法可以在不扩展硬件的情况下利用这些强大但庞大的模型来训练最先进的模型&#xff1f;目前&#xff0c;有三种方法可以压缩神经网络&#…

一文搞懂JDK8 HashMap源码

目录前言常量和变量构造器put方法resize扩容get方法前言 HashMap的源码非常经典&#xff0c;里面用到了哈希表、链表、红黑树等数据结构&#xff0c;而且又是用纯Java实现的&#xff0c;所以成为了Java程序员必读的源码之一。 事先了解下哈希表&#xff08;散列表&#xff09…

portraiture2023手动磨皮的p图插件

可以手动磨皮的p图软件&#xff0c;大部分美颜软件只能一键磨皮或简单调整磨皮强度&#xff0c;本文会介绍一款可自动、可手动磨皮的p图软件。人像p图软件哪个好用&#xff1f;本文还会盘点一下好用的人像p图软件。 portraiture2023功能特点 2x性能和精细的输出质量将您的皮肤…

AES加密算法

AES算法原理 对称加密算法&#xff08;用于取代DES算法&#xff0c;发展历史DES-3DES-AES&#xff09; 明文长度固定为128位&#xff08;DES&#xff1a;64位&#xff09;&#xff0c;密钥长度可128位、192位、256位&#xff08;DES&#xff1a;64位&#xff09; 加密原理 …

你是如何对待植物神经紊乱的?

大家好&#xff0c;你们是如何对待植物神经紊乱这种疾病的&#xff1f; 你们知道吗&#xff1f;植物神经紊乱是一种情绪情志障碍伴躯体化症状的特殊且复杂的疾病&#xff0c;这种疾病可能会导致浑身的不适。 并且&#xff0c;很多植物神经紊乱的患者发现&#xff0c;这种疾病是…

【GD32F427开发板试用】硬件SPI通信驱动CH376芯片,用单片机实现U盘数据下载

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;周文杰 SPI通信作为单片机多种基础数据传输模式中的一种&#xff0c;驱动外部芯片CH376实现数据导出到U盘功能在实际工程项目中是很方便的。本…

字符设备驱动之mmap、select

一、mmap mmap&#xff0c;简而言之就是将内核空间的一段内存区域映射到用户空间。映射成功后&#xff0c;用户对这段内存区域的修改可以直接反映到内核空间&#xff0c;相反&#xff0c;内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间与用户空间两者之…

Prometheus + Grafana + Alertmanager 本地安装调试

一、简介 Prometheus 是一款强大的监控软件&#xff0c;一般会与Grafana和Alertmanager一起配合使用&#xff0c;而且多用于k8s集群。简介的话网上很多&#xff0c;官网 更是详细&#xff0c;这里就不班门弄斧了。k8s集群环境下的安装网上很多&#xff0c;但是k8s集群搭建时间…

【实际开发10】- 远程调用 ( Feign )

目录 1. Feign 调用注意事项 - ★★★ 1. 【原则】: 禁止遍历 - 多次跨服务调用接口 ( 提需求 : idList ) 1. 单一数据查询 , 可直接用 Feign单一查询接口 2. List数据查询 , 需进行 Feign 数据转换 , 禁止遍历 Feign 3. stream() : 从List<对象> , 取出 id 和 name…

关于PS VR2和独占,开发者和分析师都怎么看

近期&#xff0c;索尼正式宣布了PS VR2首发游戏列表&#xff0c;共计37款游戏&#xff0c;其中包括备受关注的IP大作《地平线&#xff1a;山之召唤》等。从这37款首发阵容中可以看到一个现象&#xff0c;大部分游戏是非新作&#xff0c;而是已经在PS VR1或其它VR平台上线&#…

C++基础——C++数组

C基础——C数组C 数组声明数组初始化数组访问数组元素C 中数组详解C 数组 C 支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的…

【数据结构基础】线性表 - 链表

n个节点离散分配&#xff0c;彼此通过指针相连&#xff0c;每个节点只有一个前驱节点&#xff0c;每个节点只有一个后续节点&#xff0c;首节点没有前驱节点&#xff0c;尾节点没有后续节点。确定一个链表我们只需要头指针&#xff0c;通过头指针就可以把整个链表都能推出来。知…

设计模式-UML图

目录 2&#xff0c;UML图 2.1 类图概述 2.2 类图的作用 2.3 类图表示法 2.3.1 类的表示方式 2.3.2 类与类之间关系的表示方式 2&#xff0c;UML图 统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;是用来设计软件的可视化建模语言。它的特…

Matlab pdetool

云溪岩绵迎彩霞,博主精神压力大呀,没人说说知心话啊,SCU物理要命啦........基本物理方程静电磁场交流电磁场热传导Options->ApplicationGeneric Scalar泛型标量Generic System通用系统Structural Mechanics,Plane Stress结构力学 - 平面应力Structural Mechanics,Plane Stra…

Flashback Oracle文档阅读

和Flashback相关的文档大多位于备份和恢复用户指南 和Oracle 数据库开发指南中。 基本概念 请参看备份和恢复用户指南的1.4 About Oracle Flashback Technology。 Oracle Flashback Technology的定义&#xff1a; A set of Oracle Database features that provide an additi…

Verilog HDL门级建模

⭐本专栏针对FPGA进行入门学习&#xff0c;从数电中常见的逻辑代数讲起&#xff0c;结合Verilog HDL语言学习与仿真&#xff0c;主要对组合逻辑电路与时序逻辑电路进行分析与设计&#xff0c;对状态机FSM进行剖析与建模。 &#x1f525;文章和代码已归档至【Github仓库&#xf…

数字电路设计:Logicly 最新版Crack

Logicly有效地教授逻辑门 数字电路 — 使用 Logicly 现代直观的用户界面支持拖放、复制/粘贴、缩放等功能&#xff0c;可快速轻松地设计电路。 通过暂停模拟并在您逐步推进时观察信号传播来控制调试。 不用担心学生计算机上的多个平台。在 Windows 和 macOS 上安装 创建引人入…

子查询-MySQL

文章目录理解举例基本使用语法分类分类方式1单行子查询多行子查询分类方式2&#xff1a;单行子查询单行比较操作符代码示例HAVING 中的子查询CASE中的子查询子查询中的空值问题非法使用子查询多行子查询多行比较操作符代码示例相关子查询相关子查询执行流程代码示例EXISTS 与 N…