一、简介
数据手册: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
。
二、硬件连接
三、添加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:数据采集完成标志位
Sleep_time<7:4>:休眠时间
- 0001:62.5ms
- 0010:125ms
… - 1111:1s
- 0000:无意义
Reg0xA5:
Aout_config<7:4>:模拟输出配置(建议保留默认配置)
LDO_config:内部 LDO 配置
Unipolar:
- 0:ADC 原始数据以有符号数格式输出
- 1:ADC 原始数据以无符号格式输出。(仅当‘Data_out_control’=1 有效)
Data_out_control:
- 0:输出校准数据
- 1:输出 ADC 原始数据(默认配置为 0)
Diag_on:
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 寄存器。
组合模式读取数据按照如下指令顺序进行操作:
- 发送指令
0x0A
到 0x30
寄存器进行一次温度采集,一次压力数据采集。 - 读取
0x30
寄存器地址,若Sco位为0代表采集结束,可以读取数据。或等待延迟10ms。 - 读取
0x06
、0x07
、0x08
三个寄存器地址数据构成 24 位 AD 值(压力数据 AD 值),读取 0x09
、0x0A
两个寄存器地址数据构成 16 位 AD 值(温度数据 AD 值) - 按以下公式换算成实际压力、温度值。
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 温度和压力值换算公式
注:
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_
#include <stdint.h>
#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
void GZP6859D_ReadSingleModePressureData(int32_t *pPressure);
void GZP6859D_ReadCombinedModeData(int32_t *pTemperature, int32_t *pPressure);
#endif
5.2 board_gzp6859d.c
#include <stdio.h>
#include "i2c.h"
#include "board_gzp6859d.h"
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);
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;
*pPressure = press;
printf("press:%d\r\n", press);
}
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);
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);
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;
*pPressure = press;
printf("press:%d\r\n", press);
}
六、使用例子
I2C 初始化后,调用 GZP6859D_ReadCombinedModeData()
先以组合模式读取温度,以获取温度校准系数,否则读数不准。然后调用 GZP6859D_ReadSingleModePressureData()
读取单次压力值。
#include "board_gzp6859d.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
int32_t temperature;
int32_t pressure
GZP6859D_ReadCombinedModeData(&temperature, &pressure);
MX_FREERTOS_Init();
osKernelStart();
while (1)
{
int32_t pressure;
GZP6859D_ReadSingleModePressureData(&pressure);
printf("p:%d\r\n", pressure);
HAL_Delay(1000);
}
}
查看打印:
• 由 Leung 写于 2023 年 1 月 30 日
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)