STM32单片机驱动BMP180气压计(模拟IIC)

 STM32单片机驱动BMP180气压计(模拟IIC)

使用使stm32f103单片机驱动传感器,通过模拟IIC接口进行通信,得到了经过矫正的气压,并可以获得海表面高度信息。(IIC驱动使用正点原子的工程)

#include "BMP180.h"
#include "delay.h"
#include "myiic.h"
#include "sys.h"
//***BMP085使用
long  result_UT=0;
long  result_UP=0;

short ac1;
short ac2; 
short ac3; 
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1; 
short b2;
short mb;
short mc;
short md;

//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
u16 Multiple_read(u8 ST_Address)
{   
	u8 msb, lsb;
	u16 _data;
    IIC_Start();                          //起始信号
    IIC_Send_Byte(BMP180_SlaveAddress);    //发送设备地址+写信号
	while(IIC_Wait_Ack());
    IIC_Send_Byte(ST_Address);             //发送存储单元地址
	while(IIC_Wait_Ack());                                 
    IIC_Start();                          //起始信号
    IIC_Send_Byte(BMP180_SlaveAddress+1);         //发送设备地址+读信号
	while(IIC_Wait_Ack());                                        

    msb = IIC_Read_Byte(1);                 //BUF[0]存储                
    lsb = IIC_Read_Byte(0);                //最后一个数据需要回NOACK

    IIC_Stop();                           //停止信号
    delay_ms(5);
    _data = msb << 8;
	_data |= lsb;	
	return _data;
}
//********************************************************************
u16 bmp180ReadTemp(void)
{

    IIC_Start();                  //起始信号
    IIC_Send_Byte(BMP180_SlaveAddress);   //发送设备地址+写信号   BMP180_SlaveAddress  0xee	气压传感器器件地址
	while(IIC_Wait_Ack());
    IIC_Send_Byte(0xF4);	          // write register address
    while(IIC_Wait_Ack());
	IIC_Send_Byte(0x2E);       	// write register data for temp
    while(IIC_Wait_Ack());
	IIC_Stop();                   //发送停止信号
	delay_ms(10);	// max time is 4.5ms
	return Multiple_read(0xF6);
}
//*************************************************************
u16 bmp180ReadPressure(void)
{
	//u16 pressure = 0;

    IIC_Start();                   //起始信号
    IIC_Send_Byte(BMP180_SlaveAddress);   //发送设备地址+写信号
    while(IIC_Wait_Ack());
	IIC_Send_Byte(0xF4);	          // write register address
    while(IIC_Wait_Ack());
	IIC_Send_Byte(0x34);       	  // write register data for pressure
    while(IIC_Wait_Ack());
	IIC_Stop();                    //发送停止信号
	delay_ms(20);    	                  // max time is 4.5ms
	
	//pressure = Multiple_read(0xF6);
	//pressure &= 0x0FFFF;
	
	return Multiple_read(0xF6);//pressure;	
}

//**************************************************************

//初始化BMP085,根据需要请参考pdf进行修改**************
void Init_BMP180()
{
	IIC_Init();
	ac1 = Multiple_read(0xAA);
	ac2 = Multiple_read(0xAC);
	ac3 = Multiple_read(0xAE);
	ac4 = Multiple_read(0xB0);
	ac5 = Multiple_read(0xB2);
	ac6 = Multiple_read(0xB4);
	b1 =  Multiple_read(0xB6);
	b2 =  Multiple_read(0xB8);
	mb =  Multiple_read(0xBA);
	mc =  Multiple_read(0xBC);
	md =  Multiple_read(0xBE);
}
//***********************************************************************
void bmp180Convert()
{
	unsigned int ut;
	unsigned long up;
	long x1, x2, b5, b6, x3, b3, p;
	unsigned long b4, b7;

	ut = bmp180ReadTemp();	   // 读取温度
	up = bmp180ReadPressure();  // 读取压强    return pressure;	
	//*************
	x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
	x2 = ((long) mc << 11) / (x1 + md);
	b5 = x1 + x2;
	result_UT = ((b5 + 8) >> 4);
	//*************		
	b6 = b5 - 4000;
	                         // Calculate B3
	x1 = (b2 * (b6 * b6)>>12)>>11;
	x2 = (ac2 * b6)>>11;
	x3 = x1 + x2;
	b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;	
	                         // Calculate B4
	x1 = (ac3 * b6)>>13;
	x2 = (b1 * ((b6 * b6)>>12))>>16;
	x3 = ((x1 + x2) + 2)>>2;
	b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
	
	b7 = ((unsigned long)(up - b3) * (50000>>OSS));
	if (b7 < 0x80000000)
	p = (b7<<1)/b4;
	else
	p = (b7/b4)<<1;
	
	x1 = (p>>8) * (p>>8);
	x1 = (x1 * 3038)>>16;
	x2 = (-7357 * p)>>16;
	result_UP = p+((x1 + x2 + 3791)>>4);
}


/****************************************************************
   函数名称:BMP085_Get_Altitude			    
   函数功能:获取海拔高度值
   入口参数:无
   出口参数:altitude //int型  2字节,当前海拔高度值
   备 注:	 返回的高度值单位为厘米,调用时再换算成带小数的以米为单位的高度值
*****************************************************************/
double BMP085_Get_Altitude()
{
	double altitude;
	//pressure=(float)pressure;				//获取气压值
	altitude=44330.0*(1-pow((double)pressure/101325,1/5.255));  	//根据芯片手册提供的公式计算海拔高度
	//altitude*=100;	 		//转换成厘米单位的高度值,调用时再换算成带小数的高度值,提高精度
	return altitude;
}

这是头文件。

#ifndef __BMP180_H__
#define __BMP180_H__

#define	BMP180_SlaveAddress     0xee	//气压传感器器件地址

#define   OSS 0	 //	BMP085使用
#define   REG_Pressure 0x34 // oss=0 4.5


void Init_BMP180(void);//初始化IO   读取校准参数
void bmp180Convert(void);	//校准温度和气压 ,将结果分别存入 result_UP result_UT

#endif

 

 

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: BMP280是一款数字压力传感器,常用于实时监测气温和气压等环境参数。而STM32F103是一款高性能的32位微控制器,具有丰富的外设和强大的计算能力。 在使用BMP280与STM32F103配合时,通常需要通过I2C或SPI接口进行数据传输。通过STM32F103的GPIO引脚与BMP280进行连接,以实现数据传输和控制。 首先,我们需要在STM32F103上配置相应的外设,包括I2C或SPI控制器和GPIO引脚。然后,我们需要编写相应的代码,在初始化时设置传感器的工作模式和采样率等参数。 接下来,我们可以通过STM32F103读取BMP280的测量数据。首先发送启动测量命令,然后等待一段时间,再通过I2C或SPI接口读取传感器的数据寄存器。最后,根据BMP280的数据手册,将读取的原始数据转换为实际的温度和气压值。 除了读取测量数据,我们还可以通过STM32F103控制BMP280的工作状态。通过发送相应的命令,我们可以使传感器进入睡眠模式、正常模式或强制测量模式等。 综上所述,BMP280与STM32F103的配合可以实现对环境气温和气压等参数的实时监测,并且能够通过STM32F103进行控制和配置。这种组合在气象、气候监测以及室内外环境监测等领域具有广泛的应用前景。注意,在具体应用中,我们还需要根据实际的需求和硬件连接情况进行适当的配置和调试。 ### 回答2: bmp280是一种常见的压力传感器,广泛应用在气象、环境监测、室内定位等领域。而stm32f103是意法半导体推出的一款微控制器芯片,具有丰富的资源和强大的处理能力。 在将bmp280与stm32f103结合使用时,可以利用stm32f103的GPIO和I2C接口与bmp280进行通信。通过读取bmp280传感器提供的压力数值,可以实时获得在其应用领域中所需的压力数据。通过合适的算法和逻辑处理,可以实现对压力数值的分析和应用。 stm32f103芯片使用C语言进行编程,可以根据需求编写相关的程序代码,通过配置I2C接口的相关寄存器,实现与bmp280的正常通信和数据读取。同时,stm32f103还可以通过串口或其他通信方式将数据传输到其他设备或显示器上进行进一步处理或展示。 除了压力传感数据的读取外,bmp280还可以输出温度数据。因此,与stm32f103的结合使用还可以实现对温度的检测和监控。通过适当的硬件和软件设计,可以将bmp280和stm32f103集成在同一个系统中,以实现高精度和高稳定性的压力和温度监测。 综上所述,bmp280与stm32f103的结合使用可以实现对压力和温度的监测和控制。通过合理的软硬件设计与编程,可以满足不同领域中对压力数据的需求,并为各种应用场景提供准确的压力和温度信息。 ### 回答3: bmp280是一款数字气压传感器,可用于测量大气压强和温度。stm32f103是一种常见的单片机芯片,具有强大的处理能力和丰富的外设资源。 通过将bmp280与stm32f103相连接,可以方便地获取大气压力和温度信息,并可以进行相应的处理和应用。通过使用stm32f103的I2C或SPI接口与bmp280进行通信,可以读取传感器的数据,并进行相应的计算和分析。例如,可以实时监测大气压力的变化,用于气象观测或气象预测,也可以用于高度测量、气压校准等应用。 在硬件连接方面,bmp280的供电电压一般为3.3V,而stm32f103的供电电压通常为3.3V或5V,因此可以直接将它们的VCC引脚相连。同时,需要根据具体的连接方式,将bmp280的SDA引脚与stm32f103的I2C SDA引脚或SPI MOSI引脚相连,将SCL引脚与I2C SCL引脚或SPI SCK引脚相连,以实现数据传输。 在软件方面,可以使用stm32的开发工具如Keil或CubeIDE进行编程。通过配置I2C或SPI接口的相应寄存器以及相应的时钟和引脚,实现与bmp280的通信。然后可以读取bmp280的寄存器数据,并进行相应的处理和应用。 总之,将bmp280与stm32f103相连接,可以方便地获取大气压力和温度信息,并进行相应的处理和应用,扩展了stm32f103的功能和应用范围。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值