![]() |
發布時間: 2021-7-2 13:05
正文摘要:用的BMP280 bmp280_WriteByte(0xf4, 0xff); bmp280_WriteByte(0xf5, 0x1c); //000 111 00 溫度和壓力測量精度最高,然后濾波開最高,正常模式,主循環里100ms讀取一次。 做項目的時 ... |
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 您好!可是兩個傳感器都是緊挨在一起放著的,然后外面拿帶洞的殼子罩著放在一起的 ![]() |
氣壓差,在不同的時間測試,是存在的。除非測試的環境是封閉的。 |