基于STM32F103——XGZP6847D压力传感器+串口打印

基于STM32F103—XGZP6847D压力传感器+串口打印

  • 基本介绍
  • 概述
  • 产品特点
  • 引脚的连接 (IIC通信)
  • 名称含义的介绍
  • I2C通信协议 (设备地址是 `0x6D`)
  • 寄存器描述
  • 工作模式
  • 寄存器
  • Reg0x30(测量命令寄存器)
  • Reg0xA5
  • Reg0xA6
  • 模式说明
  • 组合数据采集模式
  • 休眠数据采集模式
  • 代码编写
  • 等待模式可读
  • 读取压力值
  • 读取温度值
  • 主程序
  • 最终效果
  • 基本介绍

    概述

    XGZP6847D 型压力传感器尺寸小、易安装,广泛用于医疗电子、汽车电子、消费电子、运动健身器材、
    物联网等领域

    产品特点

    引脚的连接 (IIC通信)

    名称含义的介绍

    I2C通信协议 (设备地址是 0x6D)

    寄存器描述

    工作模式

    寄存器

    Reg0x30(测量命令寄存器)

  • Measurement_control<2:0>(工作模式)
  • 010b,组合采集模式(一次温度采集后立即进行一次传感器压力信号采集)。
  • 011b,休眠工作模式(定期的执行一次组合采集模式,间隔时间由‘sleep_time’决定)
  • Sleep_time<7:4>: 0001:62.5ms, 0010:125ms … 1111: 1s, 0000:无意义。(仅在休眠工作模式下有效)
  • Sco:数据采集完成标志位。1, 开始数据采集;0,采集结束(休眠工作模式除外)。
  • 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。
  • 模式说明

    组合数据采集模式

    休眠数据采集模式

    代码编写

  • 这里我是选择 组合采集模式

  • Measurement_control<2:0>(工作模式) 设置为010b
  • 组合模式读取数据按照如下指令顺序进行操作(其他模式参考 0x30 寄存器定义相应调整即可):

  • 1、发送指令 0x0A(即 00001010)到 0x30 寄存器进行一次温度采集,一次压力数据采集。
  • 2、读取 0x30 寄存器地址,若 Sco 位为 0 代表采集结束,可以读取数据, 否则等待延迟 20ms 读取。
  • 3、读取 0x06、0x07、0x08 三个寄存器地址数据构成 24 位 AD 值(压力数据 AD 值),读取 0x09、0x0A
    两个寄存器地址数据构成 16 位 AD 值(温度数据 AD 值)。
  • 等待模式可读

    /**
     *	描述: XGZP6847模块等待可读压力和温度
     *	参数: 无
     * 	返回: 0:可读 1:不可读
     */
    unsigned char xgzp6847_wait(void)
    {
    	unsigned char ack, data, status;
    
    	/* 设置组合数据采集模式 */
    	ack = xgzp6847_write_byte(0x30, 0x0A);
    	if (ack)
    	{
    		return 1;
    	}
    
    	ack = xgzp6847_read_byte(0x30, &data);
    	if (ack)
    	{
    		return 1;
    	}
    	
    	/* 若 Sco 位为 0 代表采集结束 否则等待延迟 20ms 读取 */
    	status = data & 0x08;
    	if (status)
    	{
    		delay_ms(20);
    	}	
    
    	return 0;	
    }
    
    

    读取压力值

    /**
     *	描述: XGZP6847模块读取压力
     *	参数: 无
     * 	返回: 读取到的压力(Pa)
     */
    int xgzp6847_read_pressure(void)
    {
    
    	int pressure = 0;
    	unsigned char pressure_H, pressure_M, pressure_L;
    	
    	xgzp6847_read_byte(DATA_MSB_ADDR, &pressure_H);	/* <23:16> */
    	xgzp6847_read_byte(DATA_CSB_ADDR, &pressure_M);	/* <15:8> */
    	xgzp6847_read_byte(DATA_LSB_ADDR, &pressure_L);	/* <7:0> */
    
    	pressure |= (unsigned int)pressure_H << 16;
    	pressure |= (unsigned int)pressure_M << 8;
    	pressure |= (unsigned int)pressure_L << 0;
    
    	
    	/* 超过 8388606 为负压值 */
    	if (pressure > 8388608)	//0x800000
    	{
    		pressure = (pressure - 16777216) / 64;
    	}
    	else
    	{
    		pressure = pressure / 64;
    	}
    	
    	return pressure;	//单位为 Pa
    }
    

    读取温度值

    /**
     *	描述: XGZP6847模块读取温度
     *	参数: 无
     * 	返回: 读取到的温度
     */
    short xgzp6847_read_temperature(void)
    {
    	unsigned char temperature_H, temperature_L;
    	unsigned short temperature = 0;
    
    	xgzp6847_read_byte(TEMP_MSB_ADDR, &temperature_H);	/* <15:8> */
    	xgzp6847_read_byte(TEMP_LSB_ADDR, &temperature_L);	/* <7:0> */
    
    	temperature |= (unsigned short)temperature_H << 8;
    	temperature |= temperature_L << 0;
    
    	if (temperature > 32786)	//0x8000
    	{
    		temperature = (temperature - 65536) / 256;
    	}
    	else
    	{
    		temperature = temperature / 256;
    	}
    	
    	return temperature;	/* °C */
    
    }
    

    主程序

    /**
     *	描述: 读取压力和温度 并串口输出
     *	参数: 无
     *	返回: 无	 
     */
    void xgzp6847_handler(void)
    {
    	int pressure = 0;
    	short temperature = 0;
    
    	pressure    = xgzp6847_read_pressure();
    	temperature = xgzp6847_read_temperature();
    
    	printf("pressure: %6d  temperature:%3d\r\n", pressure, temperature);	
    }
    
    
    int main()
    {
    	usart1_init(115200);	//串口1初始化   用于输出
    	xgzp6847_init();
    
    	while(1)
    	{
    		if (xgzp6847_wait())
    		{
    			continue;
    		}
    		xgzp6847_handler();	
    		delay_ms(100);	/* 只是防止打印太快我看不清 */
    	}  
    }
    

    最终效果

    print("需要代码 +meQQ 844797079")
    

    如果觉得这篇文章对你有用。欢迎大家点赞、评论哈哈

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于STM32F103——XGZP6847D压力传感器+串口打印

    发表评论