概述
本文將介紹如何使用 LPS28DFW 傳感器來讀取的壓強數據,來估算水下深度,可以利用液體靜壓的原理。
水壓計算
對于水平地面的固體對地面產生的壓強,由于壓力大小等于重力,計算固體壓力時一般都會先計算壓力后計算壓強,所以 F=G 在固體中經常用到,但同時我們又要明確知道壓力與重力的不同。對于液體計算公式的由來,同一深度朝各個方向都有壓強且相等;密度相同時,深度越深壓強越大;深度相同
時,密度越大壓強越大。這只是定性的關系,對于定量關系則是建立了一個規則形狀的液柱,設想
液柱下方平面的壓強就是該位置的液體壓強大小。如下圖所示,液柱對平面的壓力等于液柱所受
的重力,借助于公式的變形 F=G=mg=ρVg=ρgSh ,從而推出 P=F/S=ρgh 。由于液體同一深度朝各個方向都有壓強且相等,所以這個公式就可以普遍計算同一深度其他位置的液體壓強大小。
其中:
● P 是液體的壓力(即氣壓計測得的壓力值),
● ρ 是液體的密度(通常在20°C下水密度為1000 kg/m3)
● g 是重力加速度(通常取9.8 m/s2),
● h 是液體的深度。
設置速率和分辨率
對于 LPS28DFW 氣壓傳感器,CTRL_REG1(10h)和 CTRL_REG2(11h)的主要設置如下:
CTRL_REG1(10h)
● ODR[3:0]:輸出數據速率選擇。默認值:0000。具體的配置值見數據表 19。
● AVG[2:0]:平均值選擇。默認值:000。具體的配置值見數據表 20。
CTRL_REG2(11h)
● BOOT:重新啟動內存內容。默認值:0(0:正常模式;1:重新啟動內存內容)。
● FS_MODE:全量程選擇。默認值:0(0:模式1,全量程高達1260 hPa;1:模式2,全量程高達4060 hPa)。
● LFPF_CFG:低通濾波器配置。默認值:0(0:ODR/4;1:ODR/9)。
● EN_LPFP:啟用壓力數據上的低通濾波器。默認值:0(0:禁用;1:啟用)。
● BDU:塊數據更新。默認值:0(0:連續更新;1:直到讀取了 MSB 和 LSB 之前,輸出寄存器不更新)。
● SWRESET:軟件復位。默認值:0(0:正常模式;1:軟件復位)。復位完成時位自動清零。
● ONESHOT:啟用一次性模式。默認值:0(0:空閑模式;1:獲取新的數據集)。
設置輸出數據速率 (md.odr = LPS28DFW_1Hz):將輸出數據速率設置為每秒 1 次(1Hz)。較低的數據速率通常可以減少噪聲,從而提高測量的準確性。
設置平均值 (md.avg = LPS28DFW_512_AVG):選擇 512 次平均。這意味著傳感器將獲取 512 個樣本并計算它們的平均值作為最終輸出。平均更多的樣本可以顯著減少隨機噪聲,從而提高數據的穩定性和準確性。
設置低通濾波器 (md.lpf = LPS28DFW_LPF_ODR_DIV_9):低通濾波器設置為 ODR/9,這將進一步平滑輸出數據,消除高頻噪聲。
設置全量程 (md.fs = LPS28DFW_1260hPa):選擇全量程為 1260hPa。這種較低的全量程可能更適合于測量較小的壓力變化,進一步提高測量精度。
應用這些設置 (lps28dfw_mode_set(&dev_ctx, &md)):最后,這些配置通過 lps28dfw_mode_set 函數應用于傳感器。
這樣的設置組合有助于提高 LPS28DFW 傳感器的精度,特別是通過降低噪聲和增加測量穩定性。這些設置對于需要高精度測量的應用場景特別有用。
/* Set Output Data Rate */ md.odr = LPS28DFW_1Hz; md.avg = LPS28DFW_512_AVG; md.lpf = LPS28DFW_LPF_ODR_DIV_9; md.fs = LPS28DFW_1260hPa; lps28dfw_mode_set(&dev_ctx, &md);
輪詢讀取數據
水下每增加一定深度,水的壓力就會增加。這個增加的壓力與水的深度成正比。公式中減去的 氣壓值 是為了將傳感器讀數調整為相對于大氣壓的壓力。這是因為傳感器測得的是絕對壓力,包括了大氣壓在內。
公式中的密度和重力加速度用的是標準單位(千克每立方米和米每平方秒),而壓強用的是百帕。因此,計算出的水深是以米為單位的。最后,為了將結果以更易讀的形式(厘米)展示,乘以了 100*100。
while(1) { /* Read output only if new values are available */ lps28dfw_all_sources_get(&dev_ctx, &all_sources); if ( all_sources.drdy_pres | all_sources.drdy_temp ) { lps28dfw_data_get(&dev_ctx, &md, &data); if(i==0) { open_h =data.pressure.hpa; printf("first pressure:%6.2fhPa,temperature:%6.2frn",open_h,data.heat.deg_c); i++; } else { float h; h=(data.pressure.hpa-open_h)/(1000*9.8);//水深=壓強/(水密度*重力加速度) //1百帕 (hPa)= 100 Pa = 1 mbar1千帕 (kPa)= 1000 Pa = 10 hPa printf("pressure:%6.2fhPa,h:%6.2f cm,temperature:%6.2frn",data.pressure.hpa,h*100*100,data.heat.deg_c); } } }
測試結果
10cm測試情況如下。
15cm測試情況如下。
20cm測試情況如下。
25cm測試情況如下。
-
mcu
+關注
關注
146文章
17148瀏覽量
351186 -
檢測
+關注
關注
5文章
4488瀏覽量
91471 -
Studio
+關注
關注
2文章
190瀏覽量
28689 -
氣壓計
+關注
關注
1文章
55瀏覽量
18257
發布評論請先 登錄
相關推薦
評論