MPL115A2 (I2C) Pressure sensor interface

Dependents:   MPL115A2Sample dataloger_for_modelrocket ARLISS2012_Hidaka

Committer:
yamaguch
Date:
Sat May 14 17:29:51 2011 +0000
Revision:
2:d77bd4340924
0.91

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 2:d77bd4340924 1 #include "MPL115A2.h"
yamaguch 2:d77bd4340924 2
yamaguch 2:d77bd4340924 3 #define c2f(ch, cl, nbits, fbits, zpad) float(short(ch << 8 | cl) >> 16 - nbits) / (1 << fbits + zpad)
yamaguch 2:d77bd4340924 4
yamaguch 2:d77bd4340924 5 int MPL115A2::read(float *pressure, char *data) {
yamaguch 2:d77bd4340924 6 const char id = 0x60 << 1;
yamaguch 2:d77bd4340924 7 char cmd[2] = {0x12, 0x01}; // read both
yamaguch 2:d77bd4340924 8 char buf[16];
yamaguch 2:d77bd4340924 9
yamaguch 2:d77bd4340924 10 if (i2c.write(id, cmd, 2) != 0)
yamaguch 2:d77bd4340924 11 return -1;
yamaguch 2:d77bd4340924 12
yamaguch 2:d77bd4340924 13 wait_ms(1);
yamaguch 2:d77bd4340924 14
yamaguch 2:d77bd4340924 15 cmd[0] = 0;
yamaguch 2:d77bd4340924 16
yamaguch 2:d77bd4340924 17 if (i2c.write(id, cmd, 1, true) != 0)
yamaguch 2:d77bd4340924 18 return -1;
yamaguch 2:d77bd4340924 19
yamaguch 2:d77bd4340924 20 if (i2c.read(id, buf, 16) == 0) {
yamaguch 2:d77bd4340924 21 float padc = buf[0] << 2 | buf[1] >> 6;
yamaguch 2:d77bd4340924 22 float tadc = buf[2] << 2 | buf[3] >> 6;
yamaguch 2:d77bd4340924 23 float a0 = c2f(buf[4], buf[5], 16, 3, 0);
yamaguch 2:d77bd4340924 24 float b1 = c2f(buf[6], buf[7], 16, 13, 0);
yamaguch 2:d77bd4340924 25 float b2 = c2f(buf[8], buf[9], 16, 14, 0);
yamaguch 2:d77bd4340924 26 float c12 = c2f(buf[10], buf[11], 14, 13, 9);
yamaguch 2:d77bd4340924 27 float c11 = c2f(buf[12], buf[13], 11, 10, 11);
yamaguch 2:d77bd4340924 28 float c22 = c2f(buf[14], buf[15], 11, 10, 15);
yamaguch 2:d77bd4340924 29
yamaguch 2:d77bd4340924 30 float pcomp = a0 + (b1 + c11 * padc + c12 * tadc) * padc + (b2 + c22 * tadc) * tadc;
yamaguch 2:d77bd4340924 31
yamaguch 2:d77bd4340924 32 if (pressure != 0)
yamaguch 2:d77bd4340924 33 *pressure = pcomp * 650 / 1023 + 500;
yamaguch 2:d77bd4340924 34
yamaguch 2:d77bd4340924 35 if (data != 0)
yamaguch 2:d77bd4340924 36 memcpy(data, buf, 16);
yamaguch 2:d77bd4340924 37
yamaguch 2:d77bd4340924 38 return 0;
yamaguch 2:d77bd4340924 39 }
yamaguch 2:d77bd4340924 40
yamaguch 2:d77bd4340924 41 return -1;
yamaguch 2:d77bd4340924 42 }
yamaguch 2:d77bd4340924 43
yamaguch 2:d77bd4340924 44 float MPL115A2::readPressure() {
yamaguch 2:d77bd4340924 45 float pressure;
yamaguch 2:d77bd4340924 46 return read(&pressure, 0) == 0 ? pressure : 0;
yamaguch 2:d77bd4340924 47 }