STM32F103學(xué)習(xí)筆記(11)——壓力傳感器GZP6859D使用

一、簡介

數(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)行操作:

  1. 發(fā)送指令 0x0A0x30 寄存器進(jìn)行一次溫度采集妙啃,一次壓力數(shù)據(jù)采集档泽。
  2. 讀取 0x30 寄存器地址,若Sco位為0代表采集結(jié)束揖赴,可以讀取數(shù)據(jù)馆匿。或等待延遲10ms燥滑。
  3. 讀取 0x06甜熔、0x070x08 三個(gè)寄存器地址數(shù)據(jù)構(gòu)成 24 位 AD 值(壓力數(shù)據(jù) AD 值)突倍,讀取 0x09腔稀、0x0A 兩個(gè)寄存器地址數(shù)據(jù)構(gòu)成 16 位 AD 值(溫度數(shù)據(jù) AD 值)
  4. 按以下公式換算成實(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 日

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迹淌,隨后出現(xiàn)的幾起案子河绽,更是在濱河造成了極大的恐慌,老刑警劉巖唉窃,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耙饰,死亡現(xiàn)場離奇詭異,居然都是意外死亡纹份,警方通過查閱死者的電腦和手機(jī)苟跪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔓涧,“玉大人件已,你說我怎么就攤上這事≡” “怎么了篷扩?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昨寞。 經(jīng)常有香客問我瞻惋,道長厦滤,這世上最難降的妖魔是什么援岩? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任歼狼,我火速辦了婚禮,結(jié)果婚禮上享怀,老公的妹妹穿的比我還像新娘羽峰。我一直安慰自己,他們只是感情好添瓷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布梅屉。 她就那樣靜靜地躺著,像睡著了一般鳞贷。 火紅的嫁衣襯著肌膚如雪坯汤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天搀愧,我揣著相機(jī)與錄音惰聂,去河邊找鬼。 笑死咱筛,一個(gè)胖子當(dāng)著我的面吹牛搓幌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迅箩,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼溉愁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饲趋?” 一聲冷哼從身側(cè)響起拐揭,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奕塑,沒想到半個(gè)月后堂污,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爵川,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年敷鸦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寝贡。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扒披,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出圃泡,到底是詐尸還是另有隱情碟案,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布颇蜡,位于F島的核電站价说,受9級特大地震影響辆亏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鳖目,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一扮叨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧领迈,春花似錦彻磁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尘喝,卻和暖如春磁浇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朽褪。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工置吓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鞍匾。 一個(gè)月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓交洗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橡淑。 傳聞我的和親對象是個(gè)殘疾皇子构拳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容