找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4932|回复: 37
打印 上一主题 下一主题
收起左侧

用两个BMP280测试室内外压差发现压差不稳定老是变化很大!

[复制链接]
楼主
ID:975054 发表于 2021-10-30 09:25 | 显示全部楼层
首先:设计目的?就是想用在哪里?
其次:传感器的气压测试精度一般足够了的,就看具体想怎么应用了。
气压传感器计算得到的高度一般用在短周期内的(海拔高度)相对值。比如坐垂直电梯,电梯启动前记录一个高度,电梯上升到3层,记录一个高度,两个高度的高度差是准确的。
如果需要用在绝对场合,可以输入当前位置的高度作为计算的初始值,然后运动观察高度变化就是准确的。不过如果时间长了,也会容易出现高度漂移的问题。如果项目要求长时间获取准确高度值且频率要求高,就需要融合其他传感器进行处理,比如GPS。气压传感器精度本身足够高的,误差主要是长时间工作后的正常温漂,而转换后的高度误差最大的来自大气压日差、年差(纬度不同、天气不同,早晚往往变化很大的都有10hPa了,对应海拔高度都有80-100米了,可以搜关键词“气压日差或年差”,你可以看看手机里面的天气预报,里面就有气压一项)。
我之前有个小项目持续改进研究了一年,跟这个气压直接有关。模拟气压传感控制最简方案的搞完了,现在想超低功耗数字化改进一下。。。MS5611或BMP380+STC8G+后面的控制执行装置。。。。。。也在头疼中(本人是老射频工程师,编程没怎么搞过,也硬着头皮上!找外协又不合适,反正不着急,自己抓紧玩就是了。。。。。。精度和轻量化倒不是主要问题了、设备的可靠性才是关键(以前老看别人天天上班就pin包、拷机,现在我也拼一拼,呵呵)。。。共勉。。
回复

使用道具 举报

沙发
ID:975054 发表于 2021-10-30 09:28 | 显示全部楼层
气压传感器计算得到的高度一般用在短周期内的(海拔高度)相对值。比如坐垂直电梯,电梯启动前记录一个高度,电梯上升到3层,记录一个高度,两个高度的高度差是准确的。
如果需要用在绝对场合,可以输入当前位置的高度作为计算的初始值,然后运动观察高度变化就是准确的。不过如果时间长了,也会出现高度漂移问题。如果项目要求长时间获取准确高度值且频率要求高,就需要融合其他传感器进行处理,比如GPS。气压精度本身较高,误差主要是长时间工作后的温漂,而转换后的高度误差最大的来自气压日差(往往有10hPa了)。。。。。。研究了一年有关技术。。。
回复

使用道具 举报

板凳
ID:975054 发表于 2021-11-21 22:20 | 显示全部楼层
终于搞清楚了,我用的是STC8 硬件I2C+BMP280方案,暂时只需要气压读数。不知道你们具体用的什么MCU? 软硬件I2C又不同,具体细节太多。。。。

testBMP280ID:
bmp280 id is right...
0101 1000
temp                    press
0000 0000 0000 0001 1000 1011 1000 1111
回复

使用道具 举报

地板
ID:975054 发表于 2021-11-23 02:27 | 显示全部楼层
今天广州实测海拔比天气预报的多约940Pa相当于低80米,短时间变化约5Pa倒很好了。拿小软管堵住孔稍微大力吹吸气约相差2.5-3Kpa很正常。
回复

使用道具 举报

5#
ID:975054 发表于 2021-11-23 21:00 | 显示全部楼层
我用的是STC8H+280硬件I2C,11.0592MhZ:发现I2C总线速度设置对读数有一定影响:100Kbit/S左右时较好,200Kbit/S左右时最差。原因不明。
回复

使用道具 举报

6#
ID:975054 发表于 2021-11-23 21:01 | 显示全部楼层
测试记录:1123:102080(13℃/1015):+580+10楼360总误差+940Pa约80米,短时间才飘5Pa、吸气99337-2743吹气105016+2936:很正常!
//                  101931(13℃/1017):+231+10楼360总误差+591Pa约50米,算比较准了(设置改2f、50后)飘1pa。
//                总线速率原来80K(E0)改100K(DA)后:101987(1019)更准确!总差不到+400pa33米!最漂亮!后面先用100Kbit/速率!
//                                                        第2次:102060(1014)+1Kpa误差稍大,猛吹气107059(+5Kpa正常)猛吸气97215(+4.8Kpa正常)。可归位ok;  注意当时预报变化极大。
//                总线速率原来80K(E0)改 50K(F2)后:101993(1019)也准确!总差不到+400pa33米!吹气中死机scl常低可重写也不行,后来拆下280插回后又可以了,可能吹气太猛压到了?以后留意。
//                                                        第2次:102050(1018)+0.5Kpa40米不错!猛吹气105121(+3.1Kpa正常)猛吸气96468(+5.6Kpa正常)。可归位ok;
//                总线速率原来80K(E0)改120K(D5)后:102162(1015)+1.02Kpa80米偏大!猛吹气104924(+2.8Kpa正常)猛吸气 98210(+3.9Kpa正常)。可归位ok;
//                                                        第2次:102107(1019)+0.57Kpa47米不错!猛吹气104793(+2.7Kpa正常)猛吸气 98260(+3.8Kpa正常)。可归位ok;
//                总线速率原来80K(E0)改200K(CC)后:120840(1016)+19Kpa误差太大! 猛吹气123732(+2.9Kpa正常)猛吸气115154(+5.7Kpa稍大)。可归位ok;
//                                                        第2次:120840(1016)           误差太大!不知道原因??
//                总线速率原来80K(E0)改400K(C5)后: 99120(1019)-2.78Kpa误差大! 猛吹气101528(+2.4Kpa正常)猛吸气 93656(+5.5Kpa稍大)。可归位ok;
回复

使用道具 举报

7#
ID:975054 发表于 2021-12-7 02:56 | 显示全部楼层
Y_G_G 发表于 2021-11-24 00:14
几个月前就是这个帖子,让我下决心去学C语言的,还买了3片回来对比
IIC只要是时序对了,给器件足够的响应时 ...

我全部程序优化弄完了(加了很多比较判断、显示及控制的代码)。结果:气压数据之前总是偏高5hpa,现在却总是偏低约1KPa,莫名其妙查半天没查出来。另外,温度始终显示十几二十几度,不对,没有小数点。公式应该没有错,反复试了有符号无符号的变化。  还有I2C总线速度影响还是很大,不过100K以下都很稳定,200K以上几乎乱来了。也不知道哪里原因。有些地方加了个延迟几百ms,代码就不往下执行了。。。。。。
回复

使用道具 举报

8#
ID:975054 发表于 2021-12-7 03:01 | 显示全部楼层
串口显示:Program Size: data=23.2 xdata=111 code=7105;
         Hello!...                                                      //问候语;
         test......OK!                                                //自检结果:OK,否则告警:"test...error";
         SW1=OFF......SW2=OFF..........Hset = 100m            //拨码开关设置状态(1:OFF,0:ON);
           T = 00000000 00000000 00010111 ...T = 22℃            //初始温度:二进制,十进制;       
         P0= 00000001 10000111 00101100 ...P = 100140Pa( 96m) //初始气压:二进制,十进制,海拔;
           ---------------------------------------------------- //以下循环显示;
         T = 00000000 00000000 00010110 ...T = 22℃                 //实时温度(二进制+十进制);
         P = 00000001 10000111 00100101 ...P = 100133Pa( 97m) //实时气压(海拔):二进制,十进制;                       
                                            P0 = 100141Pa( 96m) //初始气压(海拔):二进制,十进制;
重新下载前几天的代码气压都高1000pa,反复核对了很多设置几乎一样。3片280模块都一样。莫名其妙。
回复

使用道具 举报

9#
ID:975054 发表于 2021-12-7 03:05 | 显示全部楼层
ax6808 发表于 2021-12-7 03:01
串口显示:Program Size: data=23.2 xdata=111 code=7105;
         Hello!...                                                      //问候语 ...

我家里海拔大概40米,温度大概16度
回复

使用道具 举报

10#
ID:975054 发表于 2021-12-23 10:07 | 显示全部楼层
我项目需要,专门研究过气压早晚日差、年差等等。正常的变化。普通测量恩本用不到那么绝对准确,只要相对稳定就好,具体误差可以直接自己加一个适当的修订值。
回复

使用道具 举报

11#
ID:975054 发表于 2021-12-23 10:10 | 显示全部楼层
ax6808 发表于 2021-11-23 21:01
测试记录:1123:102080(13℃/1015):+580+10楼360总误差+940Pa约80米,短时间才飘5Pa、吸气99337-2743吹 ...

总线速率问题搞清楚了:原来我为了偷懒,把延时及其他函数里的变量i,j数据类型定义到全局变量里了, 改回局部变量后,好多问题都一并解决了,包括总线速率.
回复

使用道具 举报

12#
ID:975054 发表于 2021-12-23 10:17 | 显示全部楼层
Y_G_G 发表于 2021-12-7 12:10
估计是你代码的问题,这个片子是支持高速IIC的,人家支持3.4MHZ的,就算是缩水,也不会缩水那么多的

谢谢!最后查清楚了,确实是STC8的代码问题,读修订参数变量前,得延时一下就不会有问题了,不然读数会不准(数值往往减少一点).....对所有变量值进行显示逐一排查才找到问题所在.
回复

使用道具 举报

13#
ID:975054 发表于 2021-12-23 10:31 | 显示全部楼层
Y_G_G 发表于 2021-7-5 19:43
压力传感器这一块,其实误差是相对比较大,它不比电阻电流这些参数
正常来说,1%的误差是正常的,我们这有一 ...

关于280的两个浮点和定点计算公式,我STC8G都可以实现了,特别注意变量数据类型定义不同。定点的都定义为long,浮点公式var1,var2, T,p为double代码还少了400多字节,为了稳定,还加了static...;
static long    t_fine,adc_T, adc_P,var1,var2, T, p;        //定点公式用;
//static double var1,var2, T,p                               //浮点公式四个改double;
最后很稳定,但定点公式计算结果总是不能转换为显示小数点1位就好,小数点里面具体值总是0,其他都很正常;
回复

使用道具 举报

14#
ID:975054 发表于 2021-12-23 16:55 | 显示全部楼层
Y_G_G 发表于 2021-12-23 11:22
在keil虽然可以声明double类型,但数据实际上还是float
stc8g有1K的SRAM,进行BMP280的运算是没有什么问题 ...

嗯!就是就是。
显示精度都足够的了,只是绝对误差问题(我都是自己直接加修订值了)。
之前不知道,公式里外变量都得带类型,最后显示也有多种格式,还好只是显示问题,不影响原来数值的比较判断等应用。
回复

使用道具 举报

15#
ID:975054 发表于 2022-2-10 17:51 | 显示全部楼层
目前基本正常,最后的主要问题:
(1) dig_P1 为unsigned short,但我读出来显示总是负数(但好像不影响最终结果),其他参数都正常; 不知道哪里错了,统一定义和读取显示的。
(2)计算气压时,已加手册公式里的一句:if (var1 == 0) { retune 0};
但最后一个var1不知为何读出来都总是0,于是我又在后面再加了一句“if (var1 == 0) { retune0};不然继续算下去最终读数总是低1850Pa(但没用到dig_P7、8、9);
P: var1 = ...;
var2 = ...;
var2 = ...;
var2 = ...;
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; //这个 var1读出来总是0???
if (var1 == 0.0) return 0; // 于是自己再加了1句:更准了(后面2句无效)!
var2 = p*((double)dig_P8)/32768.0;
p = p+(var1+var2+((double)dig_P7))/16.0;
return p;
(3)GY-63模块如此便宜,真不敢相信是否原装货?
(4)其实16位足够一般人用了,用BMP180也够了,模块还小不少,价钱倒还贵一点停产了,不知道什么库存或拆件?MS5611也试过只接4脚就可用,但贵很多很多暂无必要。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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