MPL115A2 (I2C) Pressure sensor interface
Dependents: MPL115A2Sample dataloger_for_modelrocket ARLISS2012_Hidaka
MPL115A2.cpp@2:d77bd4340924, 2011-05-14 (annotated)
- Committer:
- yamaguch
- Date:
- Sat May 14 17:29:51 2011 +0000
- Revision:
- 2:d77bd4340924
0.91
Who changed what in which revision?
User | Revision | Line number | New 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 | } |