OpenEdv-开源电子网

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

气压计MS5611读出来的数据非常不准确

[复制链接]

3

主题

13

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-8-7
在线时间
0 小时
发表于 2014-9-1 15:57:01 | 显示全部楼层 |阅读模式
5金钱
读出来的数据经过解算 气压大于标准大气压 而且变化幅度很大 而且气压竟然和温度有对应关系
这是我之前测试的时候得到的三组数据
P:100881.98  T:26.60
P:101418.71  T:18.80
P:101955.44  T:31.00
气压差为536.73   温度差为2.2度 
不知道为什么会出现这种情况

以下是部分代码,希望有经验的前辈多多指教!
[mw_shl_code=c,true]u32 MS561101BA_DO_CONVERSION(u8 command) { u32 conversion=0; u32 conv1,conv2,conv3; IIC_Start(); IIC_Send_Byte(MS561101BA_SlaveAddress); while(IIC_Wait_Ack()); IIC_Send_Byte(command); while(IIC_Wait_Ack()); IIC_Stop(); Delay_Ms(20); IIC_Start(); IIC_Send_Byte(MS561101BA_SlaveAddress); while(IIC_Wait_Ack()); IIC_Send_Byte(0x00); while(IIC_Wait_Ack()); IIC_Stop(); IIC_Start(); IIC_Send_Byte(MS561101BA_SlaveAddress+1); while(IIC_Wait_Ack()); conv1=IIC_Read_Byte(1); conv2=IIC_Read_Byte(1); conv3=IIC_Read_Byte(0); IIC_Stop(); conversion= (conv1<<16) + (conv2<<8) + conv3; return conversion; } //读取数字温度 void MS561101BA_GetTemperature(u8 OSR_Temp) { D2_Temp= MS561101BA_DO_CONVERSION(OSR_Temp); Delay_Ms(10); dT=D2_Temp - (((u32)Cal_C[5])<<8); Temperature=D2_Temp;//2000+dT*((u32)Cal_C[6])/8388608.0; } //读取数字气压 void MS561101BA_GetPressure(u8 OSR_Pres) { float Aux,OFF2,SENS2; //温度校验值 D1_Pres= MS561101BA_DO_CONVERSION(OSR_Pres); Delay_Ms(10); OFF=(u32)(Cal_C[2]<<16)+((u32)Cal_C[4]*dT)/128.0; SENS=(u32)(Cal_C[1]<<15)+((u32)Cal_C[3]*dT)/256.0; //温度补偿 /*if(Temperature < 2000)// second order temperature compensation when under 20 degrees C { Temperature2 = (dT*dT) / 0x80000000; Aux = (Temperature-2000)*(Temperature-2000); OFF2 = 2.5*Aux; SENS2 = 1.25*Aux; if(Temperature < -1500) { Aux = (Temperature+1500)*(Temperature+1500); OFF2 = OFF2 + 7*Aux; SENS2 = SENS + 5.5*Aux; } }else //(Temperature > 2000) { Temperature2 = 0; OFF2 = 0; SENS2 = 0; } Temperature = Temperature - Temperature2; OFF = OFF - OFF2; SENS = SENS - SENS2; */ Pressure=D1_Pres;//(D1_Pres*SENS/2097152.0-OFF)/32768.0; } [/mw_shl_code]


最佳答案

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

你可以参考这篇博客:http://blog.csdn.net/xian_z/article/details/76461696
Sorrow is hushed into peace in my heart like the evening among the silent trees.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-10-24
在线时间
1 小时
发表于 2014-9-1 15:57:02 | 显示全部楼层
回复

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2014-9-1 17:29:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2014-9-1 19:57:32 | 显示全部楼层
看着没啥问题,你可以试着降低温度或者升高温度来确认下气压值是否跟着改变。实际气压会和温度有关系,但是一般是几十差不多,不应该像你这样大的偏差。
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2014-9-1 20:01:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-8-7
在线时间
0 小时
 楼主| 发表于 2014-9-2 11:03:07 | 显示全部楼层
回复【4楼】hexboot:
---------------------------------
数据其实是相当稳定 读几十次都不会有变化。。所以均值应该是不行的。。
它的变化是非常迟钝的 我升高两米可能都没有变化 然后再高一点会发生一次差值巨大的突变
MS5611的数据手册中号称其精度可以达到10cm 我感觉这个状态连3m都没有
Sorrow is hushed into peace in my heart like the evening among the silent trees.
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-8-7
在线时间
0 小时
 楼主| 发表于 2014-9-2 11:03:54 | 显示全部楼层
回复【2楼】hexboot:
---------------------------------
应该要小于50cm 我是想用它来做飞行器的高度测试
Sorrow is hushed into peace in my heart like the evening among the silent trees.
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1832
金钱
1832
注册时间
2014-6-27
在线时间
980 小时
发表于 2014-9-2 11:40:56 | 显示全部楼层
回复【6楼】Phoenix_2011:
---------------------------------
我弄过一个测气压水压的,MS5541,温度是不稳定的,但是气压水压可以的,转换成高度或者深度最大误差100cm,只要大概可以就行了,不要那么精准的。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1832
金钱
1832
注册时间
2014-6-27
在线时间
980 小时
发表于 2014-9-2 11:42:02 | 显示全部楼层
回复【6楼】Phoenix_2011:
---------------------------------
最大误差应该是10cm,写错了。
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-8-7
在线时间
0 小时
 楼主| 发表于 2014-9-2 14:11:50 | 显示全部楼层
回复【7楼】TinyBoy:
---------------------------------
那为什么我的数据那么不准呢 能不能给点代码
Sorrow is hushed into peace in my heart like the evening among the silent trees.
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1832
金钱
1832
注册时间
2014-6-27
在线时间
980 小时
发表于 2014-9-2 14:41:19 | 显示全部楼层
回复【9楼】Phoenix_2011:
---------------------------------
 我的不是用IIC写的,对你没用处我发现校准那个地方计算比较多,如果你能读出数据,看看校准对不对。
回复

使用道具 举报

26

主题

193

帖子

8

精华

金牌会员

Rank: 6Rank: 6

积分
1800
金钱
1800
注册时间
2012-8-23
在线时间
57 小时
发表于 2014-9-2 14:48:43 | 显示全部楼层
用过BMP180,感觉挺准的
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-8-7
在线时间
0 小时
 楼主| 发表于 2014-9-3 21:04:21 | 显示全部楼层
回复【10楼】TinyBoy:
---------------------------------
spi的代码也可以啊。。我不一定非要用i2c。。
Sorrow is hushed into peace in my heart like the evening among the silent trees.
回复

使用道具 举报

17

主题

158

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
金钱
388
注册时间
2012-12-17
在线时间
62 小时
发表于 2014-9-4 11:31:04 | 显示全部楼层
回复【11楼】beyond696:
---------------------------------
今天准,换了明天可能差了10来米,不信你自己试看看哦。好像气压高度计都是这样,跟天气有很大关系
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2013-8-18
在线时间
6 小时
发表于 2015-7-7 17:09:44 | 显示全部楼层
试一试发送指令后加入相应延时
回复

使用道具 举报

7

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2014-11-7
在线时间
0 小时
发表于 2015-7-8 17:27:19 | 显示全部楼层
在使用这个时,在芯片上面垫一层海绵会好很多。。不然跳动的确会很大
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2015-10-25
在线时间
0 小时
发表于 2015-10-25 21:24:40 | 显示全部楼层
温度对气压值的干扰很大,需要做温漂补偿。没有测试过ms5611,但在对沛喆fbm320和bmp280的对比测试中沛喆的气压芯片抗温度干扰性能明显胜于bmp280
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-12-11
在线时间
1 小时
发表于 2015-12-11 17:11:52 | 显示全部楼层
回复【10楼】TinyBoy:
---------------------------------
请问怎样直接自己写MS5611传感器的SPI驱动代码?(目前自己正在准备气压计的底层驱动,不过没有相关经验,只能参照别人的代码)
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1832
金钱
1832
注册时间
2014-6-27
在线时间
980 小时
发表于 2015-12-12 17:24:38 | 显示全部楼层
回复【17楼】mc1930:
---------------------------------
我没有MS5611的SPI驱动代码,我写过MS5541的驱动,现在找不到了,SPI接口,都是标准的接口,你写出SPI的读写函数,其他根据IC资料进行操作就行了。
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-12-14 09:19:48 | 显示全部楼层
以前搞过ms5611 用的spi,我也发现温度会从很高变的很低,这个跟你定义变量的符号有关系,最好都用float类型,气压变动那么大或许也跟温度有关系。你先改改看。
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-1-16
在线时间
7 小时
发表于 2016-2-24 12:00:09 | 显示全部楼层
楼主我的读数好奇怪,温度竟然4000多度?求指导
43]`1`VWF1CRVI3L10Z5LE2.png
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-1-16
在线时间
7 小时
发表于 2016-2-24 12:01:09 | 显示全部楼层
u32 MS5611_Do_Conversion(u8 Command)
{
        u32 Con1, Con2, Con3, Conversion;
        IIC_Start();     //起始信号
        IIC_Send_Byte(MS5611_SlaveAddress + 0x00);   //IIC选择MS5611 + 读/写数据位
        while(IIC_Wait_Ack());                                        //等待应答
        IIC_Send_Byte(Command);
        while(IIC_Wait_Ack());                                        //等待应答
        IIC_Stop();          //停止信号
       
        delay_ms(20);
       
        IIC_Start();     //起始信号
        IIC_Send_Byte(MS5611_SlaveAddress + 0x00);   //IIC选择MS5611 + 读/写数据位
        while(IIC_Wait_Ack());                                        //等待应答
        IIC_Send_Byte(MS5611_ADC_RD);                //ADC Command
        while(IIC_Wait_Ack());                                        //等待应答
        IIC_Stop();          //停止信号
       
        IIC_Start();     //起始信号
        IIC_Send_Byte(MS5611_SlaveAddress + 0x01);   //IIC选择MS5611 + 读/写数据位
        while(IIC_Wait_Ack());                                        //等待应答
        Con1 = IIC_Read_ByteS(1);      //读取ADC的结果
        Con2 = IIC_Read_ByteS(1);
        Con3 = IIC_Read_ByteS(0);
        IIC_Stop();      //停止信号

        Conversion = (Con1 << 16) | (Con2 << 8) | Con3;  //整合24位数据
       
        return Conversion;
}
void MS5611_GetTemp(u8 OSR_Temp)
{
        D2_Temp= MS5611_Do_Conversion(OSR_Temp);        //得到24位数字温度值
        delay_ms(10);
       
        dT=D2_Temp - (((u32)Factory_C[5]) << 8);                        //官方计算公式
        Temperature=2000+dT*((u32)Factory_C[6])/8388608.0;
       
       
}
一样的计算公式
回复

使用道具 举报

4

主题

20

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-1-16
在线时间
7 小时
发表于 2016-2-24 13:43:43 | 显示全部楼层
温度的问题解决了,是数据类型出错,正确的温度数据类型应该使用数据手册上推荐的int 32.,但是气压依然存在较大误差
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-4-7
在线时间
1 小时
发表于 2016-4-7 20:50:28 | 显示全部楼层
气压计怎么读取磁力计的数值,如何转换成高度各位大神
回复

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-22
在线时间
29 小时
发表于 2016-4-25 19:44:53 | 显示全部楼层
a136009394 发表于 2016-2-24 13:43
温度的问题解决了,是数据类型出错,正确的温度数据类型应该使用数据手册上推荐的int 32.,但是气压依然存 ...

请问你最后的气压值和实际大概相差多少?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-10-26
在线时间
0 小时
发表于 2016-10-26 15:58:35 | 显示全部楼层
求大神解答ms5611可以用来测人的肺活量吗?可以的话该怎么设计呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-10-27 21:44:00 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2020-6-10
在线时间
0 小时
发表于 2017-1-4 20:38:29 | 显示全部楼层
各位大牛打扰一下,现在在用MS4525DO(数字量输出)这款气压传感器,用SPI读取数据,遇到个问题就是读出的数据会跳变(压力的变化趋势正确,但是基准值会发生跳变),有时复位一下,压力值就直接变0了。请教各位大侠们有什么地方需要注意的?
回复

使用道具 举报

5

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-9-29
在线时间
23 小时
发表于 2017-8-8 14:53:20 | 显示全部楼层
我以前写的程序 当时测的很稳

ms5611 F4.zip

5.78 MB, 下载次数: 1303

回复

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-9-16
在线时间
15 小时
发表于 2017-12-7 15:36:41 | 显示全部楼层
9xzsqfzx4 发表于 2017-8-8 14:53
我以前写的程序 当时测的很稳

读PROM的值时有问题吧?for (i=1;i<=6;i++) 应该是for (i=0;i<=6;i++)
回复

使用道具 举报

4

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-9-16
在线时间
15 小时
发表于 2017-12-11 12:01:43 | 显示全部楼层
a136009394 发表于 2016-2-24 12:01
u32 MS5611_Do_Conversion(u8 Command)
{
        u32 Con1, Con2, Con3, Conversion;

大神,你好,为什么我做转换时MS5611_Do_Conversion,读出的Con1、Con2、Con3都是为0的,但是ack都有应答啊。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 18:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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