OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3955|回复: 7

使用BMP180遇到问题,校准系数全部相同

[复制链接]

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2016-3-1
在线时间
55 小时
发表于 2016-4-20 17:20:41 | 显示全部楼层 |阅读模式
3金钱
测出来的压力、温度感觉很不准,高度直接都上万了  
QQ图片20160420171514.png
QQ图片20160420171631.png

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=applescript,true]#include #include #include "bmp180.h" #include "LCD12864.h" #include "typedefine.h" #include "delay.h" //========定义从器件地址和读写方式 ======== #define rd_device_add 0xef //即11101111,1110111是 BMP085器件的固定地址, //最后的1 表示对从器件进行读操作 #define wr_device_add 0xee //即11101110,1110111是 BMP085器件的固定地址, //最后的0 表示对从器 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2015-8-16
在线时间
116 小时
发表于 2016-4-20 17:20:42 | 显示全部楼层
[mw_shl_code=applescript,true]#include <iom16v.h>
#include <macros.h>
#include "bmp180.h"
#include "LCD12864.h"
#include "typedefine.h"
#include "delay.h"

//========定义从器件地址和读写方式 ========
#define rd_device_add 0xef
//即11101111,1110111是 BMP085器件的固定地址,
//最后的1 表示对从器件进行读操作

#define wr_device_add 0xee
//即11101110,1110111是 BMP085器件的固定地址,
//最后的0 表示对从器件时行写操作

#define START                        0x08
#define RE_START                0x10
#define MT_SLA_ACK                0x18
#define MT_SLA_NOACK         0x20
#define MT_DATA_ACK                0x28
#define MT_DATA_NOACK        0x30
#define MR_SLA_ACK                0x40
#define MR_SLA_NOACK        0x48
#define MR_DATA_ACK                0x50
#define MR_DATA_NOACK        0x58

//常用TWI操作(主模式写和读)
#define Start()                        (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))                //启动I2C
#define Stop()                        (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))                //停止I2C
#define Wait()                        {while(!(TWCR&(1<<TWINT)));}                                //等待中断发生
#define TestAck()                (TWSR&0xf8)                                                                        //观察返回状态
#define SetAck()                (TWCR|=(1<<TWEA))                                                        //做出ACK应答
#define SetNoAck()                (TWCR&=~(1<<TWEA))                                                        //做出Not Ack应答
#define Twi()                        (TWCR=(1<<TWINT)|(1<<TWEN))                                    //启动I2C
#define Write8Bit(x)        {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}                //写数据到TWDR

uint8 ge,shi,bai,qian,wan,shiwan;
uint8 ReadTemp[2];
uint8 ReadPressure[2];
int ac1;
int ac2;
int ac3;
uint16 ac4;
uint16 ac5;
uint16 ac6;
int b1;
int b2;
//显示变量 //接收到的温度数据缓冲区 //接收到的气压数据缓冲区

int mb;
int mc;
int md;

//===IIC 总线写 n 个字节(成功返回0,失败返回1) ====
uint8 I2C_Write(uint8 RomAddress,uint8 *buf,uint8 len)
{
   uint8 i;
   Start();
   Wait();
   if(TestAck()!=START)
   return 1;
   Write8Bit(wr_device_add);
   Wait();
   if(TestAck()!=MT_SLA_ACK)
   return 1;
   Write8Bit(RomAddress);
   Wait();
   if(TestAck()!=MT_DATA_ACK)
   return 1;
   for(i=0;i<len;i++)
    {
          Write8Bit(buf);
          Wait();
          if(TestAck()!=MT_DATA_ACK)
          {
           return 1;
          }
           delay_nms(10);
        }
         Stop();
         delay_nms(10);
         return 0;
}

//===IIC 总线读 n 个字节(成功返回0,失败返回1)===
uint8 I2C_Read(uint8 RomAddress,uint8 *buf,uint8 len)
{
  uint8 i;
  Start();
  Wait();
  if(TestAck()!=START)
  return 1;
  Write8Bit(wr_device_add);
  Wait();
  if(TestAck()!=MT_SLA_ACK)
  return 1; //ACK 信号,则失败返回值1
  Write8Bit(RomAddress);
  Wait(); //等待回应
  if(TestAck()!=MT_DATA_ACK)
  return 1;
  Start();
  Wait();
  if(TestAck()!=RE_START)
  return 1;
  Write8Bit(rd_device_add);
  Wait();
  if(TestAck()!=MR_SLA_ACK)
  return 1;  
  for(i=0;i<len;i++)
  {
     Twi();
     SetAck();
         delay_nms(10);
         Wait();
           delay_nms(10);
           *(buf+i)=TWDR;// 据依次存入对应的地址单元(数组)中
  }
  SetNoAck();
  delay_nms(10);
  Stop();
  return 0;
}

//==================转换子函数=============
void conversion(long temp_data)
{
  shiwan=temp_data/100000+0x30;
  temp_data=temp_data%100000;
  wan=temp_data/10000+0x30;
  temp_data=temp_data%10000;
  qian=temp_data/1000+0x30;
  temp_data=temp_data%1000;
  bai=temp_data/100+0x30;
  temp_data=temp_data%100;
  shi=temp_data/10+0x30;
  temp_data=temp_data%10;
  ge=temp_data+0x30; ;

}

//===================BMP085读温度=====================
void bmp085ReadTemp(void)
{
  uint8 t=0x2e;
  I2C_Write(0xf4,&t,1);
  delay_nms(5);
  I2C_Read(0xf6,ReadTemp,2);
}
//===================BMP085读气压=====================
void bmp085ReadPressure(void)
{
  uint8 t=0x34;
  I2C_Write(0xf4,&t,1); //气压转换
  delay_nms(5);
  I2C_Read(0xf6,ReadPressure,2);
}

//==================初始化 BMP085====================
void Init_BMP085(void)
{
  uint8 temp[2];
  I2C_Read(0xaa,temp,2);
  ac1 = (temp[0]<<8)|temp[1];
  I2C_Read(0xac,temp,2);
  ac2 = (temp[0]<<8)|temp[1];
  I2C_Read(0xae,temp,2);
  ac3 = (temp[0]<<8)|temp[1];
  I2C_Read(0xb0,temp,2);
  ac4 = (temp[0]<<8)|temp[1];
  I2C_Read(0xb2,temp,2);
  ac5 = (temp[0]<<8)|temp[1];
  I2C_Read(0xb4,temp,2);
  ac6 = (temp[0]<<8)|temp[1];
  I2C_Read(0xb6,temp,2);
  b1 = (temp[0]<<8)|temp[1];
  I2C_Read(0xb8,temp,2);
  b2 = (temp[0]<<8)|temp[1];
  I2C_Read(0xba,temp,2);
  mb = (temp[0]<<8)|temp[1];
  I2C_Read(0xbc,temp,2);
  mc = (temp[0]<<8)|temp[1];
  I2C_Read(0xbe,temp,2);
  md = (temp[0]<<8)|temp[1];
}

//===================转换子函数=====================
void bmp085Convert(void)
{
  long ut,up,temperature,pressure; //定义无符号长整型变量
  long x1, x2, b5, b6, x3, b3, p;
  uint32 b4, b7;
  bmp085ReadTemp();  //读取温度
  
  //以下根据 EEPROM 中的值对获取的温度数据的进行
  ut=ReadTemp[0]<<8|ReadTemp[1]; //合成温度数据
  x1=((long)ut-ac6)*ac5>>15; //补偿换算
  x2=((long)mc<<11)/(x1+md);
  b5=x1+x2;
  temperature=(b5+8)>>4;
  conversion(temperature);
  
  LCD_write_str(0,0,"温度:");
  LCD_SET_XY(3,0);
  Write_Data(bai);  
  Write_Data(shi);
  Write_Data('.');
  Write_Data(ge);
  
  bmp085ReadPressure();
  up=ReadPressure[0]<<8|ReadPressure[1]; //合成气压数据
  up&=0x0000FFFF;
  b6=b5-4000; //行补偿换算
  x1=(b2*(b6*b6>>12))>>11;
  x2=ac2*b6>>11;
  
  //以下根据 EEPROM 中的值对获取的气压数据的进
  x3=x1+x2;
  b3=(((long)ac1*4+x3)+2)/4;
  x1=ac3*b6>>13;
  x2=(b1*(b6*b6>>12))>>16;
  x3=((x1+x2)+2)>>2;
  b4=(ac4*(uint32)(x3+32768))>>15;
  b7=((uint32)up-b3)*(50000>>0);
  if(b7<0x80000000) p=(b7*2)/b4;
  else p=(b7/b4)*2;
  x1=(p>>8)*(p>>8);
  x1=(x1*3038)>>16;
  x2=(-7357*p)>>16;
  pressure=p+((x1+x2+3791)>>4);
  conversion(pressure);
   
  LCD_write_str(0,3,"气压:");
  LCD_SET_XY(3,3);
  Write_Data(shiwan);
  Write_Data(wan);
  Write_Data(qian);
  Write_Data('.');
  Write_Data(bai);
  Write_Data(shi);
  Write_Data(' ');
  Write_Data('k');
  Write_Data('P');
  Write_Data('a');
}




  [/mw_shl_code]


这个是之前用AVR写的程序,希望对楼主有帮助
回复

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2016-3-1
在线时间
55 小时
 楼主| 发表于 2016-4-20 17:24:49 | 显示全部楼层
有没有做过这个的,请教啊
回复

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2016-4-21 09:59:10 | 显示全部楼层
你讀取沒寫好吧 你看你印出來的 什麼鬼都32639 這合理嗎
回复

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2016-3-1
在线时间
55 小时
 楼主| 发表于 2016-4-21 14:00:25 | 显示全部楼层
Rocks 发表于 2016-4-21 09:59
你讀取沒寫好吧 你看你印出來的 什麼鬼都32639 這合理嗎

是呀 我也觉得这个有问题,我模拟的IIC通信,可能有问题
QQ图片20160421135609.png
回复

使用道具 举报

29

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2016-7-27
在线时间
33 小时
发表于 2016-9-13 10:55:14 | 显示全部楼层
wang呆呆 发表于 2016-4-21 14:00
是呀 我也觉得这个有问题,我模拟的IIC通信,可能有问题

我和你遇到同样的问题,你解决了吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-8-9
在线时间
1 小时
发表于 2016-9-26 00:59:15 | 显示全部楼层
楼主 我现在也遇到了同样的问题,想问下您后来是怎么解决这个绝对高度不稳定的问题的?? 谢谢 您有时间时帮我回忆一下您怎么解决的 几个字提示我一下就好!十分感谢
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-10-21
在线时间
0 小时
发表于 2016-10-21 09:33:30 | 显示全部楼层
大家好,BMP180 目前停产缺货,手上有大批库存,价格合理,保证原厂原装货,有需要跟我联系。 13560762444 李小姐 QQ 2355640870
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 11:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表