STM32F103学习笔记(11)——压力传感器GZP6859D使用
创始人
2024-05-20 20:06:22
0

一、简介

数据手册: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 /********************************************************************** 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 
#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 日

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...