1. 程式人生 > >MS5837-30BA壓力傳感器的使用

MS5837-30BA壓力傳感器的使用

保存 load -i pen emp per 指令 分享 sheet

碩士畢業設計做的是水下機器人。深度計就是測量水下機器人垂直方向位置的重要傳感器。

目前,常用的航模級水下壓力深度計是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校驗程序如下:

unsigned char crc4(unsigned int n_prom[]) // n_prom defined as 8x unsigned int (n_prom[8])
{ int cnt; // simple counter unsigned int n_rem=0; // crc remainder unsigned char n_bit; n_prom[0]=((n_prom[0]) & 0x0FFF); // CRC byte is replaced by 0 n_prom[7]=0; // Subsidiary value, set to 0 for (cnt = 0; cnt < 16; cnt++) // operation is performed on bytes { // choose LSB or MSB if (cnt%2==1) n_rem ^= (unsigned short) ((n_prom[cnt>>1]) & 0x00FF); else n_rem ^= (unsigned short) (n_prom[cnt>>1]>>8); for (n_bit = 8; n_bit > 0; n_bit--) { if (n_rem & (0x8000)) n_rem = (n_rem << 1) ^ 0x3000; else n_rem = (n_rem << 1); } } n_rem= ((n_rem >> 12) & 0x000F); // final 4-bit remainder is CRC code return (n_rem ^ 0x00); }

求解步驟

由於得到的標定參數都是固化的,所以只需在初始化的時候讀一次即可。在獲取標定參數之後,分為兩個步驟,第一步是利用標定參數和測量的值,獲取壓力和溫度值,通過標定參數進行軟件補償;第二步是對壓力值進行溫度補償。

第一步 壓力和溫度獲取和軟件補償

如圖1,在得到固定的校驗參數以後,結合得到的標定參數 可得到獲取24位精度的壓力(D1)和溫度(D2)

// 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。

//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

datasheet

ENG_DS_MS5837-30BA_B1

MS5837-30BA壓力傳感器的使用