找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3609|回复: 1
打印 上一主题 下一主题
收起左侧

MS5837-30BA压力传感器的使用

[复制链接]
跳转到指定楼层
楼主
硕士毕业设计做的是水下机器人。深度计就是测量水下机器人垂直方向位置的重要传感器。
目前,常用的航模级水下压力深度计是MS5837-30BA压力传感器,该传感器I2C接口,量程为绝压0~30Bar(0~3Mpa),内部AD分辨率达24位,传感器配上防水外壳就成为一款分辨率达2mm测量深度200米的深度传感器。此外该传感器还具有压力值温漂修正的功能,也可以作为温度计使用。
该款传感器是I2C接口的,(地址:1110110X WRITE:0,READ:1),通过这一通信模式,可以得到出产标定的参数、实时检测的压力值和温度值。
标定参数这个传感器有个优点,每个传感器出厂时,都进行了标定,标定的参数会固化保存在传感器的寄存器中,以便使用者进行读取,从而进行修正。标定参数如下表:
表1 内部参数
IIC地址指令如下,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);
  20. }
复制代码

求解步骤
由于得到的标定参数都是固化的,所以只需在初始化的时候读一次即可。在获取标定参数之后,分为两个步骤,第一步是利用标定参数和测量的值,获取压力和温度值,通过标定参数进行软件补偿;第二步是对压力值进行温度补偿。
第一步 压力和温度获取和软件补偿
如图1,在得到固定的校验参数以后,结合得到的标定参数 可得到获取24位精度的压力(D1)和温度(D2)
1
2
3
4
5
6
7
8
// Terms called
dT = D2-(uint32_t)(C[5])*256L;
SENS = (int64_t)(C[1])*32768L+((int64_t)(C[3])*dT)/256L;
OFF = (int64_t)(C[2])*65536L+((int64_t)(C[4])*dT)/128L;
     
//Temp and P conversion
Ms5837_Temp = 2000L+(int64_t)(dT)*C[6]/8388608LL;
Ms5837_P = (D1*SENS/(2097152L)-OFF)/(8192l);






图1 压力和温度读取以及软件补偿
第二步 温度补偿
在得到第一步的温度和压力后,对压力值进行温度补偿,步骤如图2。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Second order compensation
  if((Ms5837_Temp/100)<20){         //Low temp
    Ti = (3*(int64_t)(dT)*(int64_t)(dT))/(8589934592LL);
    OFFi = (3*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/2;
    SENSi = (5*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/8;
    if((Ms5837_Temp/100)<-15){    //Very low temp
      OFFi = OFFi+7*(Ms5837_Temp+1500l)*(Ms5837_Temp+1500l);
      SENSi = SENSi+4*(Ms5837_Temp+1500l)*(Ms5837_Temp+1500l);
    }
  }
  else if((Ms5837_Temp/100)>=20){    //High temp
    Ti = 2*(dT*dT)/(137438953472LL);
    OFFi = (1*(Ms5837_Temp-2000)*(Ms5837_Temp-2000))/16;
    SENSi = 0;
  }
   
  OFF2 = OFF-OFFi;           //Calculate pressure and temp second order
  SENS2 = SENS-SENSi;
   
  Ms5837_Temp = (Ms5837_Temp-Ti);
  Ms5837_P = (((D1*SENS2)/2097152l-OFF2)/8192l);







图2 温度补偿流程

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

图3 IIC读取流程图
图4 指令
图5 采样率与转换时间
每个步骤I2C具体流程见datasheet P10-11

datasheetENG_DS_MS5837-30BA_B1
学习,学习,还是学习

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:586837 发表于 2019-7-19 13:11 | 只看该作者
最近我也在做这个,但是在stm32读i2c上碰见了问题,没有stm32的基础,不会用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表