搜索
bottom↓
回复: 10

大气压力传感器bmp085读数不准确,上传源代码,求指正!!!

[复制链接]

出0入0汤圆

发表于 2011-10-18 08:51:21 | 显示全部楼层 |阅读模式
//寄存器地址定义
#define BMP085_ADD          0xEE

#define AC1_ADD          0xAA
#define AC2_ADD          0xAC
#define AC3_ADD                0xAE
#define AC4_ADD                0xB0
#define AC5_ADD                0xB2
#define AC6_ADD                0xB4
#define B1_ADD                0xB6
#define B2_ADD                0xB8
#define MB_ADD                0xBA
#define MC_ADD                0xBC
#define MD_ADD                0xBE

#define oss          3

/***************************************/            
//毫秒延迟       
/**************************************/        
void msdelay(uint  num)
{
        uint i;
        for(i=0;i<num;i++)
                {
                while(bmp085_delay_1ms==FALSE);
               
                        bmp085_delay_1ms=FALSE;
                       
                }
}


//读UT
long UT_READ(void)
{
        uchar cmd[1];
        uchar reg[2];
        long UT=0;
       
        cmd[0]=0x2E;
       
        IIC_Str_Write(BMP085_ADD, 0xF4, cmd, 1);

        msdelay(10);
       
        IIC_Str_Read(BMP085_ADD, 0xF6, reg, 2);
       
                UT=((long)reg[0]<<8)+reg[1];
               

        return UT;

}

//读UP
long UP_READ(void)
{
        uchar cmd[1];
        uchar reg[3];
        long UP;

        cmd[0]=0x34+(oss<<6);
       
        IIC_Str_Write(BMP085_ADD, 0xF4, cmd, 1);

        if(oss==0)
        msdelay(10);
        else if(oss==1)
        msdelay(13);
        else if(oss==2)
        msdelay(19);
        else if(oss==3)
        msdelay(31);
       
        IIC_Str_Read(BMP085_ADD, 0xF6, reg, 3);
       
                UP=(((long)reg[0]<<16)+((int)reg[1]<<8)+reg[2])>>(8-oss);

        return UP;

}

//定义参数结构体
typedef  struct
{
        ulong UT;
        ulong UP;
        long P;
        uint T;
        int AC1;
        int AC2;
        int AC3;
        uint AC4;
        uint AC5;
        uint AC6;
        int B1;
        int B2;
        int MB;
        int MC;
        int MD;
} BMP085_Def;
BMP085_Def BMP085_DAT;

//参数计算,和规格书校正过好几遍,没发现啥问题
void BMP085_Calcu()
{
        long x1,x2,x3,B3,B5,B6,B7;
        ulong B4;
        x1 = (BMP085_DAT.UT - BMP085_DAT.AC6) * BMP085_DAT.AC5 / 32768;
        x2 = (BMP085_DAT.MC * 2048)/(x1 + BMP085_DAT.MD);
        B5 = x1 + x2;
        BMP085_DAT.T = (B5 + 8)/16;
        Current_temp=BMP085_DAT.T /10.0;
       
        B6 = B5 - 4000;
        x1 = (BMP085_DAT.B2*(B6 * B6/4096))/2048;
        x2 = BMP085_DAT.AC2 * B6/2048;
        x3 = x1 + x2;
        B3 = ((BMP085_DAT.AC1 * 4 + x3) << oss + 2)/4;
        x1 = BMP085_DAT.AC3 * B6/8192;
        x2 = (BMP085_DAT.B1 * (B6 * B6/4096))/65536;
        x3 = ((x1 + x2) + 2)/4;
        B4 = BMP085_DAT.AC4 * ((ulong)(x3 + 32768))/32768;
        B7 = ((ulong)BMP085_DAT.UP - B3) * (50000 >> oss);
        if(B7 < 0x80000000)
                BMP085_DAT.P = (B7 * 2)/B4;
        else
                BMP085_DAT.P = (B7/B4)*2;
        x1 =( BMP085_DAT.P/256)*( BMP085_DAT.P/256);
        x1 = (x1*3038)/65536;
        x2 = (-7357* BMP085_DAT.P)/65536;
        BMP085_DAT.P = BMP085_DAT.P + (x1 + x2 + 3791)/16;
        Current_press=BMP085_DAT.P /1000.0;

}

//BMP085整个运行函数
void BMP085_process(void)
{
        uchar reg[2];
        if(!Read_BMP085)
                return;
        Read_BMP085=FALSE;


//bmp085读寄存器
        IIC_Str_Read(BMP085_ADD, AC1_ADD, reg, 2);
                BMP085_DAT.AC1=((int)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, AC2_ADD, reg, 2);
                BMP085_DAT.AC2=((int)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, AC3_ADD, reg, 2);
                BMP085_DAT.AC3=((int)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, AC4_ADD, reg, 2);
                BMP085_DAT.AC4=((uint)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, AC5_ADD, reg, 2);
                BMP085_DAT.AC5=((uint)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, AC6_ADD, reg, 2);
                BMP085_DAT.AC6=((uint)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, B1_ADD, reg, 2);
                BMP085_DAT.B1=((int)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, B2_ADD, reg, 2);
                BMP085_DAT.B2=((int)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, MB_ADD, reg, 2);
                BMP085_DAT.MB=((int)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, MC_ADD, reg, 2);
                BMP085_DAT.MC=((int)reg[0]<<8)+reg[1];
                       
        IIC_Str_Read(BMP085_ADD, MD_ADD, reg, 2);
                BMP085_DAT.MD=((int)reg[0]<<8)+reg[1];
                       
                BMP085_DAT.UT=UT_READ();

                BMP085_DAT.UP=UP_READ();
               
                BMP085_Calcu();
       
}

计算出来 温度:40.5度  大气压:50.12KP   求指正!!!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-10-18 10:30:30 | 显示全部楼层
求指正!!!

出0入0汤圆

 楼主| 发表于 2011-10-19 11:35:10 | 显示全部楼层
有用过它的吗,指教一二!!不胜感激!!

出0入0汤圆

 楼主| 发表于 2011-10-19 15:37:24 | 显示全部楼层
自己顶,急切等待中!!!

出0入0汤圆

发表于 2011-12-6 19:55:29 | 显示全部楼层
我一直不知道EOC是怎么用的……我的值也不准确,不过更严重的是,我烧了他……诶,当时我在想EOC的问题。我当时以为转换没有完成,我就开始读数据了……楼主弄好了,也请公布下吧……

出0入0汤圆

发表于 2012-1-9 11:44:22 | 显示全部楼层
我也在用做,不过我的在25度的时候是102.4KPa,问一下 “ #define oss   3”这个oss 由什么决定的

出0入0汤圆

发表于 2012-1-9 11:47:59 | 显示全部楼层
我的 oss 为 0

出0入0汤圆

发表于 2013-10-7 14:09:35 | 显示全部楼层
我这有四个,每个值都不一样,相差比较大

出0入0汤圆

发表于 2013-11-17 21:01:52 | 显示全部楼层
用了100多片,BMP085,唯一的问题是板子温度超过35度,气压显示就变成400多了,温度到25度左右,气压显示10042正常,无法解决这个问题。

出0入0汤圆

发表于 2013-11-23 09:24:02 | 显示全部楼层
楼主 ,你好!我现在也出现这个问题了,有好几个BMP085的板子,采集到的值都不对。the temperature is :50.9 'C
the pressure is :81949 Pa.这个值不对啊!
头像被屏蔽

出0入0汤圆

发表于 2013-11-23 12:12:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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