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

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

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

标定参数

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

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

通过I2C读取了标定参数:

C0 0xB001 45057D B-1011是四位CRC校验位

C1 0x857C 34172D SENS

C2 0x872B 34603D OFF

C3 0x4E6E 20078D TCS

C4 0x5327 21287D TCO

C5 0x665A 26202D T_REF

C6 0x661E 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 < 16; cnt++) // operation is performed on bytes

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 << 1) ^ 0x3000;

15.else n_rem = (n_rem << 1);

16.}

17.}

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

19.return (n_rem ^ 0x00);

求解步骤

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

第一步 压力和温度获取和软件补偿

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

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

第二步 温度补偿

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

1.//Second order compensation

2.if((Ms5837_Temp/100)<20){ //Low temp

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)<-15){ //Very low temp

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)<20){ //Low temp

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)<-15){ //Very low temp

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。不同的采样率对应不同的转换时间,见下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Arduino是一种开源的硬件和软件平台,可以用于构建各种电子设备。MS5837是一种数字压力传感器,可以测量深度和气压。将它们一起使用可以构建各种水下设备,例如水下机器人和潜水计。 Arduino MS5837模块可以通过I2C接口与Arduino控制器通信,从而实现读取传感器数据的功能。该模块还配备了板载电路,以确保传感器的准确性和稳定性。用户可以通过编程来读取传感器数据并进行处理,例如制作用于监测水体温度和压力的水下计。 Arduino MS5837模块可以用于许多应用,例如水下探测,海洋科学研究,水下照相和水下机器人等等。该模块具有低功耗和较高的精度,可以在恶劣的环境下进行长期操作。它还采用了良好的设计,方便用户进行组装和操作。总体来说,Arduino MS5837模块是一款非常优秀的水下探测器件,可以极大地帮助用户进行水下科学研究和实验。 ### 回答2: Arduino ms5837是一种气压传感器,可以用于测量水下的气压。这种传感器可以通过Arduino控制板与其他电路进行交互,并且可以使用I2C或SPI协议进行通信。 这种传感器有很多应用,例如在潜水装备中测量气压以确定潜水员的深度,或者在水下机器人中用于导航或控制船只的深度。 Arduino ms5837通常使用10个引脚进行连接,在使用这个传感器之前,你需要理解它的规格和特性,并且需要正确地配置它。 总之,Arduino ms5837是一种非常实用的气压传感器,能够提供准确的水下气压测量数据,为许多水文学和水下测量应用提供了重要的数据支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值