两个嘴巴笑110 发表于 2014-9-26 14:44:00

BMP180气压传感器的数据处理问题。STM32硬件IIC驱动

在调试四轴的时候,打算加入气压传感器来测试飞行的高度,按照数据手册来读取数据和处理数据。

读取的温度值和大气压值都是很正常的,但是从大气压转换到海拔要经过一个复杂的公式,在计算公式的时候出现了问题。请问有人用过吗?可以给我一个意见吗?
数据手册上的公式为:



我的代码如下:
temp1 = P*1.0/Standard_Pressure;
    temp2 = (double)pow(temp1,0.2);
    temp3 = (double)(1-temp2);
    Altitude = 44330*(temp3);

两个嘴巴笑110 发表于 2014-9-26 14:46:57

还有我调试的结果为:

两个嘴巴笑110 发表于 2014-9-26 14:48:43

我把我这部分全部的程序贴出来,希望大家有时间帮我看看,发现一下问题。
程序如下://¶ÁÈ¡Æøѹֵ
void BMP180_GetPressure(void)
{
    u8 buffer;   
    double temp1,temp2,temp3;
   
    //Ïò¿ØÖƼĴæÆ÷дÈë0X34£¬µÈ´ý4.5ms,¶ÁÈ¡Æøѹ´«¸ÐÆ÷µÄADÖµ
    //Ïò¿ØÖƼĴæÆ÷дÈ벻ͬµÄÊýÖµ,µÈ´ýʱ¼ä²»Í¬,ͬʱÊä³öÊý¾ÝµÄλÊýÒ²ÊDz»Í¬µÄ¡£
    //       0X34   4.5ms    16λÊý¾Ý
    //       0x74   7.5      17λÊý¾Ý
    //       0xb4   13.5   18λÊý¾Ý
    //       0xf4   25.5   19λÊý¾Ý
    BMP180_I2C1WriteByte(BMP180_REG_CTRL_MEAS,0X34);
    delay_ms(5);
    BMP180_I2C2ReadData(BMP180_REG_OUT_MSB,buffer,2);
    delay_ms(5);
    UP = buffer<<8 | buffer;
    B6 = B5-4000;
    X1 = (B2*(B6*B6>>12))>>11;
    X2 = AC2*B6>>11;
    X3 = X1+X2;
    B3 = ((AC1<<2)+X3+2)>>2;
    X1 = AC3*B6>>13;
    X2 = (B1*(B6*B6/4096))>>16;
    X3 = ((X1+X2)+2)>>2;
    B4 = AC4*(u32)(X3+32768)>>15;
    B7 = ((u32)UP-B3)*50000;
    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;
    P = P+(X1+X2+3791)/16;//µ¥Î»PaΪʲôÔÚÕâÀïʹÓÃÓÒÒÆÀ´×ö³ý·¨¾Í²»ÐÐÄØ?
    Pressure = (float)(P)/1000;   //µ¥Î»£ºKPa´óÆøѹǿ
   
    temp1 = P*1.0/Standard_Pressure;
    temp2 = (double)pow(temp1,0.2);
    temp3 = (double)(1-temp2);
    Altitude = 44330*(temp3);
   
    printf("temp1=%f,temp2=%f,temp3=%f\r\n",temp1,temp2,temp3);
   
    printf("UP=%d,P=%d,Pressure=%4.3fKPaAltitude=%4.3fm\r\n",UP,P,Pressure,Altitude);      
}

两个嘴巴笑110 发表于 2014-9-26 14:50:09

中文注释显示有点问题,给大家查看代码,带来一点不方便哈。

希望使用过这个模块的朋友给我一个解决的方法。

小弟在此谢谢了。

两个嘴巴笑110 发表于 2014-9-26 14:51:25

对了,还有数据类型的定义。

我在这里上贴上。
s32 UT;//ζÈADÖµ    long   int32_t
s32 UP;//ÆøѹADÖµ    long
static s16 AC1,AC2,AC3;//short    int16_t
static u16 AC4,AC5,AC6;      //unsigned shortuint16_t
static s16 B1,B2,MB,MC,MD; //short
s32 X1,X2,X3;//Á¿»¯Î¶ȺÍÆøѹµÄÖмä±äÁ¿long
u32 B4;//unsigned longuint32_t
s32 B3,B5,B6,B7; //long
s32 P;//°ëÁ¿»¯µÄÆøѹֵ
s32 T;//°ëÁ¿»¯µÄζÈÖµ
float Temperature; //ζÈÖµµ¥Î»ÉãÊ϶È
float Pressure; //Æøѹֵ   µ¥Î»:KPa
float Altitude;//º£°Î¸ß¶È   µ¥Î»£ºm

两个嘴巴笑110 发表于 2014-9-26 14:55:25

在发一个串口的调试结果。

bass 发表于 2014-9-26 15:00:45

bmp085就用过 用的是模拟iic stm32的硬件iic不好用 呀

bass 发表于 2014-9-26 15:02:59

我记得我做的时候这条复杂的公式我的MCU运算不了 我是把数据交给上位机PC去处理的 又快又准

两个嘴巴笑110 发表于 2014-9-26 15:06:21

bass 发表于 2014-9-26 15:02
我记得我做的时候这条复杂的公式我的MCU运算不了 我是把数据交给上位机PC去处理的 又快又准 ...

那您的意思,这就是硬伤了。

两个嘴巴笑110 发表于 2014-9-26 15:07:39

两个嘴巴笑110 发表于 2014-9-26 15:06
那您的意思,这就是硬伤了。

主要是我在飞控上检测,我想送到遥控上,在5110上显示。
所以我这里就不好用上位机了。

还有什么其他的方法么?

bass 发表于 2014-9-26 15:08:22

两个嘴巴笑110 发表于 2014-9-26 15:06
那您的意思,这就是硬伤了。

你能读出数据 证明IIC应该没问题啦 应该是数据处理出问题吧 菜鸟看法 大神请喷

两个嘴巴笑110 发表于 2014-9-26 15:09:27

bass 发表于 2014-9-26 15:08
你能读出数据 证明IIC应该没问题啦 应该是数据处理出问题吧 菜鸟看法 大神请喷 ...

对啊。我的驱动应该是没有问题的,主要就是数据处理上面。

bass 发表于 2014-9-26 15:10:44

两个嘴巴笑110 发表于 2014-9-26 15:07
主要是我在飞控上检测,我想送到遥控上,在5110上显示。
所以我这里就不好用上位机了。



你把你那条公式放在上位机试试处理看 我当时放在mcu也出现了各种问题 但是换在PC就没问题 也许真的是太复杂了

两个嘴巴笑110 发表于 2014-9-26 15:19:29

bass 发表于 2014-9-26 15:10
你把你那条公式放在上位机试试处理看 我当时放在mcu也出现了各种问题 但是换在PC就没问题 也许真的是太复 ...

我没有这方面的上位机啊。
你可以共享一个不?

bass 发表于 2014-9-26 15:37:09

那个上位机是我同学写的 好久前的事儿了 他电脑都换了好几次了 估计都不见了 你也可以把数据保存到excel 然后让excel 处理吧 虽然麻烦点 不好意思

两个嘴巴笑110 发表于 2014-9-26 15:58:15

bass 发表于 2014-9-26 15:37
那个上位机是我同学写的 好久前的事儿了 他电脑都换了好几次了 估计都不见了 你也可以把数据保存到excel 然 ...

好的,谢谢你哈。

生来孤独 发表于 2014-11-3 12:15:08

是你没有理解数据手册吧,细细看看,意思是先要按照自己当前的高度计算出当前海平面大气压的值P0。然后再利用每上升10m,气压上升1.2hPa计算当前高度。先要计算海平面气压基准值。

vanyway 发表于 2017-12-16 13:59:53

看到最后发现 还是要数学基础啊

liyo2012 发表于 2024-1-23 22:18:13

STC 的一转就卡机,
页: [1]
查看完整版本: BMP180气压传感器的数据处理问题。STM32硬件IIC驱动