jylhy 发表于 2023-10-28 00:48 你查下气象台的气压数据就知道怎么回事了,气压高度本来就不准,如果准了这个世界就没有“风”这个东西了。 |
ax6808 发表于 2021-10-30 09:25 长时间使用后(最近这天气降温),高度漂移确实明显,不知道老哥有没有什么方法处理 |
目前基本正常,最后的主要问题: (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脚就可用,但贵很多很多暂无必要。 |
Y_G_G 发表于 2021-12-23 11:22 嗯!就是就是。 显示精度都足够的了,只是绝对误差问题(我都是自己直接加修订值了)。 之前不知道,公式里外变量都得带类型,最后显示也有多种格式,还好只是显示问题,不影响原来数值的比较判断等应用。 |
学习到了 还是要了解啊 |
ax6808 发表于 2021-12-23 10:31 在keil虽然可以声明double类型,但数据实际上还是float stc8g有1K的SRAM,进行BMP280的运算是没有什么问题的,不需要加static的 我都是直接复制数据手册中的代码用,测试一段时间,暂时没有发现什么问题 但这玩意好像也没啥用,因为我自己手上就有MS5805,感觉BMP280就低档了很多,你说当个温度计看嘛......自己又DIY了一个HDC1080,HDC1080温度精度是0.2摄氏度,要比这高出很多......所以,这玩意就当摆设了... |
Y_G_G 发表于 2021-7-5 19:43 关于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,其他都很正常; |
Y_G_G 发表于 2021-12-7 12:10 谢谢!最后查清楚了,确实是STC8的代码问题,读修订参数变量前,得延时一下就不会有问题了,不然读数会不准(数值往往减少一点).....对所有变量值进行显示逐一排查才找到问题所在. |
ax6808 发表于 2021-11-23 21:01 总线速率问题搞清楚了:原来我为了偷懒,把延时及其他函数里的变量i,j数据类型定义到全局变量里了, 改回局部变量后,好多问题都一并解决了,包括总线速率. |
我项目需要,专门研究过气压早晚日差、年差等等。正常的变化。普通测量恩本用不到那么绝对准确,只要相对稳定就好,具体误差可以直接自己加一个适当的修订值。 |
ax6808 发表于 2021-12-7 02:56 估计是你代码的问题,这个片子是支持高速IIC的,人家支持3.4MHZ的,就算是缩水,也不会缩水那么多的 |
ax6808 发表于 2021-12-7 03:01 我家里海拔大概40米,温度大概16度 |
串口显示: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模块都一样。莫名其妙。 |
Y_G_G 发表于 2021-11-24 00:14 我全部程序优化弄完了(加了很多比较判断、显示及控制的代码)。结果:气压数据之前总是偏高5hpa,现在却总是偏低约1KPa,莫名其妙查半天没查出来。另外,温度始终显示十几二十几度,不对,没有小数点。公式应该没有错,反复试了有符号无符号的变化。 还有I2C总线速度影响还是很大,不过100K以下都很稳定,200K以上几乎乱来了。也不知道哪里原因。有些地方加了个延迟几百ms,代码就不往下执行了。。。。。。 |
ax6808 发表于 2021-11-23 21:00 几个月前就是这个帖子,让我下决心去学C语言的,还买了3片回来对比 IIC只要是时序对了,给器件足够的响应时间,速率对数据是没有影响的,只要每次读取之前先检测一下ADC完成标志位就可以了 每片之间的数据误差还是有的,总体来说,也就对得起那几块的元件吧 MS系列的就要高端一些了,我用过MS5805,误差就要小很多,当然,价格就得在后面加个0了 |
测试记录: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; |
我用的是STC8H+280硬件I2C,11.0592MhZ:发现I2C总线速度设置对读数有一定影响:100Kbit/S左右时较好,200Kbit/S左右时最差。原因不明。 |
今天广州实测海拔比天气预报的多约940Pa相当于低80米,短时间变化约5Pa倒很好了。拿小软管堵住孔稍微大力吹吸气约相差2.5-3Kpa很正常。 |
终于搞清楚了,我用的是STC8 硬件I2C+BMP280方案,暂时只需要气压读数。不知道你们具体用的什么MCU? 软硬件I2C又不同,具体细节太多。。。。 testBMP280ID: bmp280 id is right... 0101 1000 temp press 0000 0000 0000 0001 1000 1011 1000 1111 |
气压传感器计算得到的高度一般用在短周期内的(海拔高度)相对值。比如坐垂直电梯,电梯启动前记录一个高度,电梯上升到3层,记录一个高度,两个高度的高度差是准确的。 如果需要用在绝对场合,可以输入当前位置的高度作为计算的初始值,然后运动观察高度变化就是准确的。不过如果时间长了,也会出现高度漂移问题。如果项目要求长时间获取准确高度值且频率要求高,就需要融合其他传感器进行处理,比如GPS。气压精度本身较高,误差主要是长时间工作后的温漂,而转换后的高度误差最大的来自气压日差(往往有10hPa了)。。。。。。研究了一年有关技术。。。 ![]() |
首先:设计目的?就是想用在哪里? 其次:传感器的气压测试精度一般足够了的,就看具体想怎么应用了。 气压传感器计算得到的高度一般用在短周期内的(海拔高度)相对值。比如坐垂直电梯,电梯启动前记录一个高度,电梯上升到3层,记录一个高度,两个高度的高度差是准确的。 如果需要用在绝对场合,可以输入当前位置的高度作为计算的初始值,然后运动观察高度变化就是准确的。不过如果时间长了,也会容易出现高度漂移的问题。如果项目要求长时间获取准确高度值且频率要求高,就需要融合其他传感器进行处理,比如GPS。气压传感器精度本身足够高的,误差主要是长时间工作后的正常温漂,而转换后的高度误差最大的来自大气压日差、年差(纬度不同、天气不同,早晚往往变化很大的都有10hPa了,对应海拔高度都有80-100米了,可以搜关键词“气压日差或年差”,你可以看看手机里面的天气预报,里面就有气压一项)。 我之前有个小项目持续改进研究了一年,跟这个气压直接有关。模拟气压传感控制最简方案的搞完了,现在想超低功耗数字化改进一下。。。MS5611或BMP380+STC8G+后面的控制执行装置。。。。。。也在头疼中(本人是老射频工程师,编程没怎么搞过,也硬着头皮上!找外协又不合适,反正不着急,自己抓紧玩就是了。。。。。。精度和轻量化倒不是主要问题了、设备的可靠性才是关键(以前老看别人天天上班就pin包、拷机,现在我也拼一拼,呵呵)。。。共勉。。 |
Hephaestus 发表于 2021-7-12 16:24 谢谢老哥的意见。如果这传感器真是这样那我是真的松口气了,就怕我是不是程序哪没搞对,想看看其他人的经验 |
按datasheet,你的数据已经很好了。非要强迫症想追求完美,那就买更贵的传感器好了,买不起就要忍着。 |
难道就没有人用过bmp280来做压差的吗? |
Y_G_G 发表于 2021-7-5 19:43 谢谢哥的宝贵意见,我今天继续研究研究 |
triggerfan 发表于 2021-7-5 17:21 压力传感器这一块,其实误差是相对比较大,它不比电阻电流这些参数 正常来说,1%的误差是正常的,我们这有一个瑞士进口的校准的机子,我看到品检抽检的时候误差也是有些大 你现不用去考虑什么温度的,这个肯定是有影响的,一个温度漂移性能好点的电压基准源IC都要十几块钱 这压力传感器才几块钱,内部的参考电压稳定也不会是军工级的了,参考电压一变化,ADC的结果就变化了 你最好是先确认程序的正确性,读取和处理函数一定得是正确,这一点才是最重要的 确定了这一点,你再看一下其它的问题 |
Y_G_G 发表于 2021-7-5 16:50 感谢老哥的意见,我用的pic单片机,手册上有关于八位单片机的计算公式,不过由于加了其他传感器,所以我把传感器内部修剪参数和得到的数据都交给上位机让上位机来计算了。现在测量的时候差值还是不稳定,还是有点往一个方向飘,头疼,感觉这样根本做不了产品。 ![]() |
这个IC我没有用过,所以,并不是很懂 对于压力传感器,两个传感器之间的比对,我们这一般取的是绝对精度,并不是取相对精度,只要不超过这个范围值,我们都认为是正确的,但大多数的时候,压力传感器还是和相对精度差不了多少的 我这用的是MS5805,这个精确有比BMP高很多,海拔最大精度是0.02米,但我们在生产中测试数据是以不超过1米来进行生产的 BMP280采集到数据之后,要把测量值和内部的校准值进行计算之后,才能得到真正的数值 不知道你是用51还是STM32 不会STM32,不知道 如果是Keil C51的话,Keil C51只支持最大32位整型数据,而这个传感器的计算需要用到64位数据的运算的,需要在Keil环境下.使用32位数据进行64位运算才行的 |
我看了一下这传感器的数据手册,像你这个数据是正常的呀 不是看相对精度的,要看绝对精度的最大误差是±1.7hPa ,±1.2hPa是典型值,还不包括温度漂移,你可以试下用摸一下或者发热的东西试一下,尝试让其中一个传感器温度产生比较大的变化,看一下 早上大气压和下午的大气压不一样,这不是正常的吗?你是做这个项目的,你不会不知道每天大气压都是不一定的吗?一天的大气压相关三五百Pa是正常的呀 |
根据测试情况来看好像每组传感器,有的组气压差变化不大,挺稳定,有的组中其中一个传感器会突变,就像上图的第一个传感器,相差300pa,然后有时候又变回去。这会是什么问题呢?传感器工作模式?I2C读写时序?还是说传感器需要循环得重新给F4和F5写数据配置工作状态? |
devcang 发表于 2021-7-2 16:02 这个是测试的一组数据 |
devcang 发表于 2021-7-2 16:02 bmp280相对精度±12pa,按理说同样两个传感器的压差不应该变化这么大。 |
devcang 发表于 2021-7-2 16:02 您好!可是两个传感器都是紧挨在一起放着的,然后外面拿带洞的壳子罩着放在一起的 ![]() |
气压差,在不同的时间测试,是存在的。除非测试的环境是封闭的。 |