MS5837-30BA水深传感器使用指南

MS5837-30BA水深传感器使用指南
2022年05月31日 17:44 广州工控传感科技有限公司

大家好,【广州工控传感★科技】MS5837-30BA水深传感器事业部,张工。

深度计就是测量水下机器人垂直方向位置的重要传感器。

目前,常用的航模级水下压力深度计是MS5837-30BA水深传感器,该传感器I2C接口,内部AD分辨率达24位,传感器配上防水外壳就成为一款分辨率达2mm测量深度200米的深度传感器。此外该传感器还具有压力值温漂修正的功能,也可以作为温度计使用。该款传感器是I2C接口的,(地址:1110110X WRITE:0,READ:1),通过这一通信模式,可以得到出产标定的参数、实时检测的压力值和温度值。

MS5837-30BA水深传感器

标定参数

这个传感器有个优点,每个传感器出厂时,都进行了标定,标定的参数会固化保存在传感器的寄存器中,以便使用者进行读取,从而进行修正。标定参数如下表:

IC地址指令如下,C0~C6对应0xA0~0xAE,其中C0指令得到的16位数据,前4位是CRC校验位,后12位是出产编号,其余的就是参数对应的地址指令。

通过I2C读取了标定参数:

C00xB00145057D B-1011是四位CRC校验位

C10x857C 34172D SENS

C20x872B 34603D OFF

C30x4E6E 20078D TCS

C40x532721287D TCO

C50x665A 26202D T_REF

C60x661E 26142D TEMPSENS

crc校验程序如下:

1.unsigned char crc4(unsigned int n_prom[])// n_prom defined as 8x unsigned int (n_prom[8])

2.{

3.int cnt;// simple counter

4.unsigned int n_rem=0;// crc remainder

5.unsigned char n_bit;

6.n_prom[0]=((n_prom[0]) & 0x0FFF);// CRC byte is replaced by 0

7.n_prom[7]=0;// Subsidiary value, set to 0

8.for (cnt=0; cnt

9.{// choose LSB or MSB

10.IF (cnt%2==1) n_rem ^=(unsigned short)((n_prom[cnt>>1]) & 0x00FF);

11.else n_rem ^=(unsigned short)(n_prom[cnt>>1]>>8);

12.for (n_bit=8; n_bit > 0; n_bit--)

13.{

14.if (n_rem & (0x8000)) n_rem=(n_rem

15.else n_rem=(n_rem

16.}

17.}

18.n_rem=((n_rem >> 12) & 0x000F);// final 4-bit remainder is CRC code

19.return (n_rem^0x00);

求解步骤

MS583730BA01-50水深传感器由于得到的标定参数都是固化的,所以只需在初始化的时候读一次即可。在获取标定参数之后,分为两个步骤,第一步是利用标定参数和测量的值,获取压力和温度值,通过标定参数进行软件补偿;第二步是对压力值进行温度补偿。

MS583730BA01-50传感器

第一步 MS5837-30BA26传感器压力和温度获取和软件补偿

如图1,在得到固定的校验参数以后,结合得到的标定参数可得到获取24位精度的压力(D1)和温度(D2)

1.

// Terms called

2.dT = D2-(uint32_t)(C[5])*256L;

3.SENS=(int64_t)(C[1])*32768L+((int64_t)(C[3])*dT)/256L;

4.OFF=(int64_t)(C[2])*65536L+((int64_t)(C[4])*dT)/128L;

5.

6.//Temp and P conversion

7.Ms5837_Temp=2000L+(int64_t)(dT)*C[6]/8388608LL;

8.Ms5837_P=(D1*SENS/(2097152L)-OFF)/(8192l);

图中MS5837-30BA水深传感器和温度读取以及软件补偿

第二步温度补偿

在得到第一步的温度和压力后,对压力值进行温度补偿,步骤如图2。

1.//Second order compensation

2.if((Ms5837_Temp/100)

3.Ti=(3*(int64_t)(dT)*(int64_t)(dT))/(8589934592LL);

4.OFFi=(3*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/2;

5.SENSi=(5*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/8;

6.if((Ms5837_Temp/100)

7.OFFi = OFFi+7*(Ms5837_Temp+1500l)*(Ms5837_Temp+1500l);

8.SENSi = SENSi+4*(Ms5837_Temp+1500l)*(Ms5837_Temp+1500l);

1.//Second order compensation

2.if((Ms5837_Temp/100)

3.Ti=(3*(int64_t)(dT)*(int64_t)(dT))/(8589934592LL);

4.OFFi=(3*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/2;

5.SENSi=(5*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/8;

6.if((Ms5837_Temp/100)

7.OFFi = OFFi+7*(Ms5837_Temp+1500l)*(Ms5837_Temp+1500l);

8.SENSi = SENSi+4*(Ms5837_Temp+1500l)*(Ms5837_Temp+1500l);

9.}

10.}11.else if((Ms5837_Temp/100)>=20){//High temp

12.Ti=2*(dT*dT)/(137438953472LL);

13.OFFi=(1*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/16;

14.SENSi=0;

15.}

16.

17.OFF2=OFF-OFFi;//Calculate pressure and temp second order

18.SENS2=SENS-SENSi;

19.

20.Ms5837_Temp=(Ms5837_Temp-Ti);

21.Ms5837_P=(((D1*SENS2)/2097152l-OFF2)/8192l);

I2C接口读取流程

流程图如图3所示,先是读取标定值,然后依次对压力和温度的24位数据进行读取。读取前,需要对其进行转换(conversion),不同采样率和采样对象,对应不同的指令,指令如图4。不同的采样率对应不同的转换时间,见下:

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部