一、簡介
數(shù)據(jù)手冊:https://item.szlcsc.com/3590436.html
GZP6859D 型壓力傳感器采用 SOP6 封裝形式,內(nèi)部集成了高精度 ADC 芯片梯嗽,對傳感器芯片輸出的偏移萍膛、靈敏度、溫漂和非線性進(jìn)行數(shù)字補(bǔ)償,以供電電壓為參考,產(chǎn)生一個(gè)經(jīng)過校準(zhǔn)、溫度補(bǔ)償后的標(biāo)準(zhǔn)數(shù)字信號(hào)竖席。
GZP6859D 型壓力傳感器尺寸小,方便客戶安裝敬肚。產(chǎn)品廣泛用于醫(yī)療電子毕荐、汽車電子、運(yùn)動(dòng)健身器材等領(lǐng)域艳馒。
- 測量范圍-100kPa…0~5kPa…200kPa
- 表壓型
- SOP6 封裝
- 適用于無腐蝕性的氣體
- 電源電壓: 2.5V~5.5V
- IIC 通訊
1.1 I2C地址分配
I2C 總線使用 SCL 和 SDA 作為信號(hào)線憎亚,這兩根線都通過上拉電阻(典型值 4.7K)連接到 VDD,不通信時(shí)都保持為高電平弄慰。I2C 設(shè)備地址為 0x6D
第美。
二、硬件連接
功能口 | 引腳 |
---|---|
SCL | PB.8 |
SDA | PB.9 |
三陆爽、添加I2C驅(qū)動(dòng)
I2C配置查看 STM32CubeMX學(xué)習(xí)筆記(9)——I2C接口使用(讀寫EEPROM AT24C02)
四什往、采集溫度和氣壓
4.1 寄存器描述
Reg0x06-Reg0x08:壓力數(shù)據(jù)寄存器
Reg0x09-Reg0x0A:溫度數(shù)據(jù)寄存器
Reg0x30:測量命令寄存器
Measurement_ctrl<2:0>:工作模式
- 000:單次溫度采集模式。
- 001:單次傳感器壓力信號(hào)采集模式慌闭。(使用此模式之前需要先讀取溫度别威,以獲取溫度校準(zhǔn)系數(shù),否則讀數(shù)不準(zhǔn))
- 010:組合采集模式(一次溫度采集后立即進(jìn)行一次傳感器壓力信號(hào)采集)驴剔。
- 011:休眠模式(定期的執(zhí)行一次組合采集模式省古,間隔時(shí)間由‘sleep_time’決定)
sco:數(shù)據(jù)采集完成標(biāo)志位
- 1:開始數(shù)據(jù)采集
- 0:采集結(jié)束(休眠工作模式除外)
Sleep_time<7:4>:休眠時(shí)間
- 0001:62.5ms
- 0010:125ms
......- 1111:1s
- 0000:無意義
Reg0xA5:
Aout_config<7:4>:模擬輸出配置(建議保留默認(rèn)配置)
LDO_config:內(nèi)部 LDO 配置
- 0:配置成 1.8V
- 1:配置成 3.6V
Unipolar:
- 0:ADC 原始數(shù)據(jù)以有符號(hào)數(shù)格式輸出
- 1:ADC 原始數(shù)據(jù)以無符號(hào)格式輸出。(僅當(dāng)‘Data_out_control’=1 有效)
Data_out_control:
- 0:輸出校準(zhǔn)數(shù)據(jù)
- 1:輸出 ADC 原始數(shù)據(jù)(默認(rèn)配置為 0)
Diag_on:
- 0:關(guān)閉診斷功能
- 1:開啟診斷功能(默認(rèn)開啟)
Reg0xA6:
Input Swap:在傳感器內(nèi)部交換差分信號(hào)極性
Gain_P<5:3>:采集傳感器信號(hào)時(shí) PGA 增益
- 000:增益=1X丧失。
- 001:增益=2X豺妓。
- 010:增益=4X。
- 011:增益=8X利花。
- 100:增益=16X科侈。
- 101:增益=32X。
- 110:增益=64X炒事。
- 111:增益=128X。
OSR_P<2:0>:采集傳感器信號(hào)時(shí)的過采樣
- 000:1024X蔫慧。
- 001:2048X挠乳。
- 010:4096X。
- 011:8192X。
- 100:256X睡扬。
- 101:512X盟蚣。
- 110:16384X。
- 111:32768X卖怜。
4.2 工作模式說明
4.2.1 組合數(shù)據(jù)采集模式
設(shè)置‘measurement_control’=010 和‘sco’=1 進(jìn)入組合數(shù)據(jù)采集模式屎开。
芯片上電后先后進(jìn)行一次溫度數(shù)據(jù)采集和一次傳感器數(shù)據(jù)采集,完成后回到待機(jī)模式马靠,并自動(dòng)將‘sco’置 0奄抽。在組合采集模式下,“Data_out_control”寄存器必須設(shè)置為 0甩鳄,校準(zhǔn)后的溫度數(shù)據(jù)儲(chǔ)存在 0x09~0x0A 寄存器逞度,壓力數(shù)據(jù)儲(chǔ)存在 0x06~0x08 寄存器。
組合模式讀取數(shù)據(jù)按照如下指令順序進(jìn)行操作:
- 發(fā)送指令
0x0A
到0x30
寄存器進(jìn)行一次溫度采集妙啃,一次壓力數(shù)據(jù)采集档泽。- 讀取
0x30
寄存器地址,若Sco位為0代表采集結(jié)束揖赴,可以讀取數(shù)據(jù)馆匿。或等待延遲10ms燥滑。- 讀取
0x06
甜熔、0x07
、0x08
三個(gè)寄存器地址數(shù)據(jù)構(gòu)成 24 位 AD 值(壓力數(shù)據(jù) AD 值)突倍,讀取0x09
腔稀、0x0A
兩個(gè)寄存器地址數(shù)據(jù)構(gòu)成 16 位 AD 值(溫度數(shù)據(jù) AD 值)- 按以下公式換算成實(shí)際壓力、溫度值羽历。
4.2.2 休眠數(shù)據(jù)采集模式
設(shè)置‘measurement_control’=011 和‘sco’=1 進(jìn)入休眠數(shù)據(jù)采集模式焊虏。芯片上電后,以一定的時(shí)間間隔進(jìn)行一次溫度數(shù)據(jù)采集和一次傳感器數(shù)據(jù)采集秕磷,間隔時(shí)間由’sleep_time’ 設(shè)置诵闭,范圍為 62.5ms 到 1s。除非手動(dòng)將‘sco’置 0澎嚣,不然不會(huì)停止采集疏尿。在休眠數(shù)據(jù)采集模式下‘Data_out_control’必須設(shè)置為 0,校準(zhǔn)后的溫度數(shù)據(jù)儲(chǔ)存在 0x09~0x0A 寄存器易桃,壓力數(shù)據(jù)儲(chǔ)存在 0x06~0x08 寄存器褥琐。
4.3 溫度和壓力值換算公式
最高位為“0”代表正壓/正溫度:
壓力:Pressure = Pressure_ ADC / k
溫度:Temperature = Temp_ ADC / 256最高位為“1”代表負(fù)壓/負(fù)溫度:
壓力:Pressure = (Pressure_ADC - 16777216) / k
溫度:Temperature = (Temp_ADC - 65536) / 256
注:
1)傳感器校準(zhǔn)后的輸出可視為當(dāng)前實(shí)際壓力值(±1%Span)
2)傳感器校準(zhǔn)后的輸出:單位 Pa(默認(rèn)),若要顯示其他單位晤郑,可在換算公式里輸入相應(yīng)的系數(shù)進(jìn)行換算敌呈;
3)關(guān)于上述壓力 ADC 換算公式中 k 值的選取可參照下表:
P 取測量點(diǎn)的最大數(shù)值(絕對值)贸宏,比如,測量-20~40kpa磕洪,P 取 40吭练,因?yàn)?32<40 ≤ 65,所以 k 值為 128析显;又比如鲫咽,測量范圍-100~50kpa,P 取 100谷异,因?yàn)?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 單次模式讀取壓力數(shù)據(jù)
@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;
// 進(jìn)行單次傳感器壓力信號(hào)采集模式
HAL_I2C_Mem_Write(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_WRITE_BIT,
GZP6859D_CMD_ADDR, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 10);
// 采集結(jié)束
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);
// 獲取壓力數(shù)據(jù)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]);
// 壓力計(jì)算公式
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 組合模式讀取數(shù)據(jù)
@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;
// 進(jìn)行組合模式讀取數(shù)據(jù)
HAL_I2C_Mem_Write(&hi2c1, (GZP6859D_SLAVE_ADDR << 1) | GZP6859D_WRITE_BIT,
GZP6859D_CMD_ADDR, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 10);
// 采集結(jié)束
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);
// 獲取溫度數(shù)據(jù)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]);
// 溫度計(jì)算公式
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);
// 獲取壓力數(shù)據(jù)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]);
// 壓力計(jì)算公式
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 初始化后,調(diào)用 GZP6859D_ReadCombinedModeData()
先以組合模式讀取溫度荞下,以獲取溫度校準(zhǔn)系數(shù)伶选,否則讀數(shù)不準(zhǔn)。然后調(diào)用 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); //先以組合模式讀取溫度仰税,以獲取溫度校準(zhǔn)系數(shù),否則讀數(shù)不準(zhǔn)
/* 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 日