大家好,【廣州工控傳感★科技】MS5837-30BA水深傳感器事業(yè)部,張工。
深度計(jì)就是測(cè)量水下機(jī)器人垂直方向位置的重要傳感器。
目前,常用的航模級(jí)水下壓力深度計(jì)是MS5837-30BA水深傳感器,該傳感器I2C接口,內(nèi)部AD分辨率達(dá)24位,傳感器配上防水外殼就成為一款分辨率達(dá)2mm測(cè)量深度200米的深度傳感器。此外該傳感器還具有壓力值溫漂修正的功能,也可以作為溫度計(jì)使用。該款傳感器是I2C接口的,(地址:1110110X WRITE:0,READ:1),通過(guò)這一通信模式,可以得到出產(chǎn)標(biāo)定的參數(shù)、實(shí)時(shí)檢測(cè)的壓力值和溫度值。
標(biāo)定參數(shù)
這個(gè)傳感器有個(gè)優(yōu)點(diǎn),每個(gè)傳感器出廠時(shí),都進(jìn)行了標(biāo)定,標(biāo)定的參數(shù)會(huì)固化保存在傳感器的寄存器中,以便使用者進(jìn)行讀取,從而進(jìn)行修正。標(biāo)定參數(shù)如下表:
I2C地址指令如下,C0~C6對(duì)應(yīng)0xA0~0xAE,其中C0指令得到的16位數(shù)據(jù),前4位是CRC校驗(yàn)位,后12位是出產(chǎn)編號(hào),其余的就是參數(shù)對(duì)應(yīng)的地址指令。
通過(guò)I2C讀取了標(biāo)定參數(shù):
C0 0xB001 45057D B-1011是四位CRC校驗(yàn)位
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校驗(yàn)程序如下:
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水深傳感器由于得到的標(biāo)定參數(shù)都是固化的,所以只需在初始化的時(shí)候讀一次即可。在獲取標(biāo)定參數(shù)之后,分為兩個(gè)步驟,第一步是利用標(biāo)定參數(shù)和測(cè)量的值,獲取壓力和溫度值,通過(guò)標(biāo)定參數(shù)進(jìn)行軟件補(bǔ)償;第二步是對(duì)壓力值進(jìn)行溫度補(bǔ)償。
第一步 壓力和溫度獲取和軟件補(bǔ)償
如圖1,在得到固定的校驗(yàn)參數(shù)以后,結(jié)合得到的標(biāo)定參數(shù) 可得到獲取24位精度的壓力(D1)和溫度(D2)
圖中MS5837-30BA水深傳感器和溫度讀取以及軟件補(bǔ)償
第二步 溫度補(bǔ)償
在得到第一步的溫度和壓力后,對(duì)壓力值進(jìn)行溫度補(bǔ)償,步驟如圖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所示,先是讀取標(biāo)定值,然后依次對(duì)壓力和溫度的24位數(shù)據(jù)進(jìn)行讀取。讀取前,需要對(duì)其進(jìn)行轉(zhuǎn)換(conversion),不同采樣率和采樣對(duì)象,對(duì)應(yīng)不同的指令,指令如圖4。不同的采樣率對(duì)應(yīng)不同的轉(zhuǎn)換時(shí)間,見(jiàn)下:
-
傳感器
+關(guān)注
關(guān)注
2548文章
50678瀏覽量
752010 -
壓力傳感器
+關(guān)注
關(guān)注
35文章
2154瀏覽量
163311
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論