大家好,我是【廣州工控傳感★科技】MS5837-30BA傳感器事業部,張工。
MS5837-30BA水深壓力傳感器模塊包括一個高線性壓力芯片和一個低功耗24位ADC,內部校準系數。提供精確的數字24位壓力和溫度值以及不同的操作模式,允許優化轉換速度和電流消耗。高分辨率的溫度輸出允許在沒有任何附加傳感器的情況下實現高度計和溫度計功能。MS5837-30BA可以通過IC總線接口連接到任何微控制器。通信協議簡單,無需對設備內部寄存器進行編程。

MS5837-30BA
一. MS5837-30BA水深傳感器解讀
1.簡介:無人機實現定高飛行要依靠高度數據,那么水下航行器想要實現定深航行同樣需要垂直方向的位置數據,也就是深度,我們使用MS5837-30BA這款壓力傳感器來測量水深。關于MS5837的使用網上有很多教程,其實都不用看,看數據手冊就行了,寫得非常非常全面。什么?看不懂英文?好的我已經把它翻譯了一遍,可以說是非常非常詳細了,相信我,看了數據手冊,就會寫驅動程序了。

MS5837-30BA

MS5837-30BA
2. 性能參數
MS5837-30BA可以配置成不同的ADC轉換精度,用OSR表示,精度越高轉換越慢,下表顯示了不同精度對應的轉換時間。每次讀ADC轉換數據前要先發送轉換命令,必須要按照最大的轉換時間去寫一個延時,延時時間夠了才能繼續發送讀轉換完成的數據,不然數據是錯的。比如OSR=4096時轉換時間是7.40-9.04,那么延時時間可以設置成10ms.

3. 典型電路
MS5837使用IIC通訊,典型應用電路如下圖。經典的IIC通訊電路。

4. 深度數據解算算法
(1) 一階算法
數據解算算法說明書里給了流程圖

翻譯成算法語言:
1) 開始。限定了工作條件,壓力測量值0~ 30Bar,溫度值范圍-20~85℃,參考溫度20℃。這個參考溫度會用到。
2) 從PROM中讀校準參數。一共六個值C1-C6,這組值出廠已經校準過了。其物理含義嘛請看英文表述,不懂也沒關系,我們會計算就行了。后面給了推薦的數據類型都為unsigned int16,數據位數16位,數值范圍0~65536,最后一列是示例值。這組校準參數是每次上電后必須從傳感器內部的PROM中讀取一次的,這6個數據C1-C6后面解算要用。
3)讀數字壓力D1與數字溫度和D2,這是MS5837輸出的24位模數轉換值。推薦數據類型為unsigned int32。這兩個數據是原始數據,還不準,需要經過C1-C6這組校準參數去校準。
4) 計算溫度。

好地,到這里讀到校準后的溫度值了。
5) 計算溫度補償后的壓力。

提到了一堆物理命名,不用管,應用公式去計算就行了。好的,到這里我們得到溫度補償后的壓力值了。
(2) 二階算法
上面使用的是一階溫度補償算法,說明書里給了二階溫度補償后的算法流程圖:

相應算法在框圖中表示得很清楚哈,命名都為你命好了。最后得到的結果就是TEMP2和P2,也就是二階算法計算的溫度和壓力。
5. IIC讀數據的寄存器與時序
仔細看看,算法其實很明了,數據的類型,命名都按說明書里推薦的來就行了。那么現在我們只關注怎么去讀數據,IIC讀數據的關鍵,一是寄存器地址,二是通信時序。 說明書里寫得很詳細。
(1)MS5837命令
MS5837只有5個基本命令:
1、復位
2、讀取出廠校準值C1-C6
3、數據D1轉換(壓力值數據)
4、數據D2轉換(溫度值數據)
5、讀取ADC的轉換結果(24位溫度值與壓力值)
每條I2C通信消息已啟動條件開始,以停止條件結束。MS5837-30BA地址是1110110x(寫:x=0,讀:x=1)。即寫0xEC,讀0xED.
(2)寄存器地址
寄存器地址在下表給出

五個命令對應的寄存器地址顯示的很詳細了。
1、復位命令寄存器是0x1E ;
2、讀取出廠校準值C1-C6,看最后一欄,bit4-bit6為000-111,C1-C6對應的地址為0xA2-0xAC;
3、數據D1轉換(壓力值數據),注意這是個寫命令。這里不同的精度對應地址不一樣,對應選擇就行,比如OSR=4096,地址為0x48;
4、數據D2轉換(溫度值數據),注意這是個寫命令。這里不同的精度對應地址不一樣,對應選擇就行,比如OSR=4096,地址為0x58;
5、讀轉換結果,地址0x00.
(3)通信時序
進一步,繼續看通信時序,這里一步都不能錯,包括有沒有應答信號。
復位命令

寫代碼的時候按照其時序進行就可以了,示例如下:

讀PROM指令(讀校準系數C1-C6)
PROM的讀取命令由用戶在復位后執行一次。校準參數存儲在7個地址中,占據112bits的內存空間(每個數據16位)。讀PROM命令是8bits,返回數據16bit(MSB模式,也就是高位在低地址)。PROM讀指令包含兩步,第一步設置系統進入PROM讀模式,第二步讀返回結果。
以讀C3為例:寄存器地址0xA0+3*2

MS5837返回數據位16位:

這一段同樣的,寫代碼的時候按照其時序進行就可以了,注意前面提到了校準系數有6個,依次讀六次就行了。示例如下:

好的,現在我們會讀PROM中的校準系數了。
數據D1/D2轉換
轉換命令用于啟動未補償的壓力(D1)或未補償的溫度(D2)轉換。經過轉換之后,使用ADC讀命令,結果以MSB模式輸出。注意了,每次必須先發送轉換命令,而且需要等轉換完成,再發送讀ADC命令,這樣就能讀到正確的D1或D2數據。
比如 分辨率=4096,數據類型=D1,
IIC指令啟動壓力轉換(地址0x48)

讀ADC數據
等待10ms等轉換完成(轉換時間查表),轉換完成之后發送ADC讀命令(0x00)

MS5837的返回數據為24位:

好的,用代碼表示上面三步的時序

好的,現在我們會讀D1和D2了,結合前面讀到的C1-C6,就可以開心的使用算法流程用一階算法或二階算法計算溫度與壓力了,知道了壓力就可以計算深度了。
二. STM32讀取水深傳感器驅動程序
經過上面的解讀,相信你已經啥都會了,現在一起來寫一下驅動代碼。
建立一個MS5837.h和MS5837.c的文件(IIC的驅動就略去不貼了,這里我用的IIC0用以與IIC區分)
MS5837.h文件內容:

MS5837.h文件先按照說明書定義一些變量:

然后添加初始換、復位、讀數據等函數:

通過調用 void MS5837_Getdata(float * outTemp, float * outPress)就可以讀到經過二階算法解算的溫度與壓力值,當然了這個值是絕對壓力值,與大氣壓結合經過計算就能算出深度了。
三. 傳感任務增加讀水深的應用程序
現在我們繼續封裝,回到我們之前創建的sensor.h和sensor.c文件,在sensor.c文件中添加以下代碼

這個地方我人為的給大氣壓賦了一個比正常偏小的值,這樣算出來的深度永遠為正的,對于定深控制是沒有影響的。當然了你可以初始化時用MS5837將大氣壓讀出來,再作為測量的大氣壓值。
當然了,可以濾一下波,還是滑動平均濾波

現在,封裝完畢,來到我們的main函數,在之前創建的 sensor_task中添加讀深度的代碼,更新后如下(建議與上一章對照看)

到這里讀水深的任務就完成啦。
-
傳感器
+關注
關注
2560文章
52133瀏覽量
761272 -
芯片
+關注
關注
459文章
51882瀏覽量
433110
發布評論請先 登錄
相關推薦
評論