BMP280使用笔记

BMP280使用笔记

参考文章:https://blog.csdn.net/bdjsm_hh/article/details/107623788?utm_medium=distribute.pc_relevant_download.none-task-blog-blogcommendfrombaidu-4.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-blogcommendfrombaidu-4.nonecas

https://blog.csdn.net/zhangyl000/article/details/111053314
一、连接说明

在这里插入图片描述
二、引脚说明:

Pin1:VCC(3.3V供电)
Pin2:GND
Pin3:SCL(I2C通信模式时钟信号)
Pin4:SDA(I2C通信模式数据信号)
Pin5:CSB(SPI通信模式下用到的引脚,本次没用到,可以悬空)
Pin6:SDO(传感器地址控制位,接GND的时候I2C中器件地址为0xEC,接高电平为0xEC+1,本次接GND)
三、寄存器图示
在这里插入图片描述
在这里插入图片描述

四、测量的基本流程
1.I2C初始化
2.数据全部清零:写数据0xB6到地址0xE0;
3读芯片ID:读地址0xD0;
4设置测量控制寄存器:写数据0xFF到地址0xF4(测量数据位20Bit,Normal Mode);
5设置配置寄存器:写数据0x00到地址0xF5(测量间隔时间0.5ms,滤波器这次没用到)。
6读取补偿值数据
7.I2C循环读取传感器参数,代入公式计算获得结果。
五、代码片段

    unsigned short dig_T1;
    short dig_T2;
    short dig_T3; 
      
    unsigned short dig_P1;
    short dig_P2;
    short dig_P3;
    short dig_P4;
    short dig_P5;
    short dig_P6;
    short dig_P7;
    short dig_P8;
    short dig_P9;
    
void BMP280_Read_Compensation(uint8_t *dig_tp){
    dig_T1 =  (short)*(dig_tp+1) << 8  |  (short)*(dig_tp) ;       
    dig_T2 =  (short)*(dig_tp+3) << 8  |  (short)*(dig_tp+2) ;         
    dig_T3 =  (short)*(dig_tp+5) << 8  |  (short)*(dig_tp+4);  
      
    dig_P1 =  (short)*(dig_tp+7)  << 8  |  (short)*(dig_tp+6);          
    dig_P2 =  (short)*(dig_tp+9)  << 8  |  (short)*(dig_tp+8); 
    dig_P3 =  (short)*(dig_tp+11) << 8  |  (short)*(dig_tp+10);          
    dig_P4 =  (short)*(dig_tp+13) << 8  |  (short)*(dig_tp+12); 
    dig_P5 =  (short)*(dig_tp+15) << 8  |  (short)*(dig_tp+14);          
    dig_P6 =  (short)*(dig_tp+17) << 8  |  (short)*(dig_tp+16); 
    dig_P7 =  (short)*(dig_tp+19) << 8  |  (short)*(dig_tp+18);          
    dig_P8 =  (short)*(dig_tp+21) << 8  |  (short)*(dig_tp+20); 
    dig_P9 =  (short)*(dig_tp+23) << 8  |  (short)*(dig_tp+22);            
 }
//-----温度计算公式,拷贝数据手册中公式即可-----------------------
double Bmp280_Read_Temperature(long adc_T){
  double var1, var2, t_fine, T;
  var1 = (((double)adc_T)/16384.0-((double)dig_T1)/1024.0)*((double)dig_T2);
  var2 = ((((double)adc_T)/131072.0-((double)dig_T1)/8192.0)*(((double)adc_T)
                /131072.0-((double)dig_T1)/8192.0))*((double)dig_T3);
  t_fine = (unsigned long)(var1+var2);
    T = (var1+var2)/5120.0;
    return T;
 }
double Bmp280_Read_Pressure (long adc_P)
{
  double var1, var2,t_fine, p;
  var1 = ((double)t_fine/2.0) - 64000.0;
  var2 = var1 * var1 * ((double)dig_P6) / 32768.0;
  var2 = var2 + var1 * ((double)dig_P5) * 2.0;
  var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);
  var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;
  var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);
  if (var1 == 0.0)
  {
  return 0; // avoid exception caused by division by zero
  }
  p = 1048576.0 - (double)adc_P;
  p = (p - (var2 / 4096.0)) * 6250.0 / var1;
  var1 = ((double)dig_P9) * p * p / 2147483648.0;
  var2 = p * ((double)dig_P8) / 32768.0;
  p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;
  return p;
}




void setup() 
{
   	 uint8_t  data;
 	 uint8_t  dig_temp_pres[24];      
	 Serial.begin(9600);   
	 BMP280_Init();
	delay(10);  

	BMP280_Write(0xE0,0xB6);               //复位
	BMP280_Read(&data, 0xD0, 1);         //芯片ID
	Serial.println(data);
	BMP280_Write(0xF4,0xFF);              //测量控制  
	BMP280_Write(0xF5,0x00);             //CONFIG  

   
	BMP280_Read(dig_temp_pres,0x88,24);  //从0x88开始读取补偿数据24个
	delay(100);   
	BMP280_Read_Compensation(dig_temp_pres);
	delay(100);         
}

 
void loop() 
{
    uint8_t  raw_temp_p[6];
    long  adc_T,adc_P; 
    double T,P; 
    BMP280_Read(raw_temp_p,0xF7,6); 
    adc_T =(long)(((unsigned long)raw_temp_p[3] << 12)|((unsigned long)raw_temp_[4]
<< 4)|((unsigned long)raw_temp_p[5] >> 4));

    T =Bmp280_Read_Temperature(adc_T);    
    Serial.print(" 温度:"); 
   Serial.print(T,4); 

    adc_P =(long)(((unsigned long)raw_temp_p[0] << 12)|((unsigned long)raw_temp_[1]
<< 4)|((unsigned long)raw_temp_p[2] >> 4));
 
P=Bmp280_Read_Pressure (adc_P);
Serial.print("    压力:");
Serial.println(P,4); 
delay(2000);

}
               

六、数据手册提供的公式看起来很复杂,我们使用时只要代入几个变量,即可。例:温度计算公式:读得原始温度测量数据,经加工后得:adb_T,读得温度补偿数据经加工后得:dig_T1、dig_T2、dig_T3 ,代入公式即可算得温度。

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值