BMP180

Fork of BMP180 by Kevin Gillepsie

Committer:
brdarji
Date:
Tue Jul 05 07:09:02 2016 +0000
Revision:
1:817fb4e66714
Parent:
0:b2219e6e444b
BMP180 ;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kgills 0:b2219e6e444b 1 #include "BMP180.h"
kgills 0:b2219e6e444b 2
kgills 0:b2219e6e444b 3 //******************************************************************************
kgills 0:b2219e6e444b 4 BMP180::BMP180(PinName sda, PinName scl)
kgills 0:b2219e6e444b 5 {
kgills 0:b2219e6e444b 6 i2c_ = new I2C(sda, scl);
kgills 0:b2219e6e444b 7 i2c_owner = true;
kgills 0:b2219e6e444b 8
kgills 0:b2219e6e444b 9 i2c_->frequency(400000);
kgills 0:b2219e6e444b 10 }
kgills 0:b2219e6e444b 11
kgills 0:b2219e6e444b 12 //******************************************************************************
kgills 0:b2219e6e444b 13 BMP180::BMP180(I2C *i2c) :
kgills 0:b2219e6e444b 14 i2c_(i2c)
kgills 0:b2219e6e444b 15 {
kgills 0:b2219e6e444b 16 i2c_owner = false;
kgills 0:b2219e6e444b 17 }
kgills 0:b2219e6e444b 18
kgills 0:b2219e6e444b 19 //******************************************************************************
kgills 0:b2219e6e444b 20 BMP180::~BMP180()
kgills 0:b2219e6e444b 21 {
kgills 0:b2219e6e444b 22 if(i2c_owner) {
kgills 0:b2219e6e444b 23 delete i2c_;
kgills 0:b2219e6e444b 24 }
kgills 0:b2219e6e444b 25 }
kgills 0:b2219e6e444b 26
kgills 0:b2219e6e444b 27 //******************************************************************************
kgills 0:b2219e6e444b 28 int BMP180::init(void)
kgills 0:b2219e6e444b 29 {
kgills 0:b2219e6e444b 30 char addr;
kgills 0:b2219e6e444b 31 char data[22];
kgills 0:b2219e6e444b 32 int i;
kgills 0:b2219e6e444b 33
kgills 0:b2219e6e444b 34 if (checkId() != 0) {
brdarji 1:817fb4e66714 35
kgills 0:b2219e6e444b 36 return -1;
kgills 0:b2219e6e444b 37 }
kgills 0:b2219e6e444b 38
kgills 0:b2219e6e444b 39 addr = REG_ADDR_AC1;
kgills 0:b2219e6e444b 40 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
kgills 0:b2219e6e444b 41 return -1;
kgills 0:b2219e6e444b 42 }
kgills 0:b2219e6e444b 43
kgills 0:b2219e6e444b 44 if (i2c_->read(I2C_ADDR, data, 22) != 0) {
kgills 0:b2219e6e444b 45 return -1;
kgills 0:b2219e6e444b 46 }
kgills 0:b2219e6e444b 47
kgills 0:b2219e6e444b 48 for (i = 0; i < 11; i++) {
kgills 0:b2219e6e444b 49 calib.value[i] = (data[2*i] << 8) | data[(2*i)+1];
kgills 0:b2219e6e444b 50 }
kgills 0:b2219e6e444b 51
kgills 0:b2219e6e444b 52 return 0;
kgills 0:b2219e6e444b 53 }
kgills 0:b2219e6e444b 54
kgills 0:b2219e6e444b 55 //******************************************************************************
kgills 0:b2219e6e444b 56 int BMP180::reset(void)
kgills 0:b2219e6e444b 57 {
kgills 0:b2219e6e444b 58 char data;
kgills 0:b2219e6e444b 59
kgills 0:b2219e6e444b 60 data = REG_ADDR_RESET;
kgills 0:b2219e6e444b 61 if (i2c_->write(I2C_ADDR, &data, 1) != 0) {
kgills 0:b2219e6e444b 62 return -1;
kgills 0:b2219e6e444b 63 }
kgills 0:b2219e6e444b 64
kgills 0:b2219e6e444b 65 data = 0xB6;
kgills 0:b2219e6e444b 66 if (i2c_->write(I2C_ADDR, &data, 1) != 0) {
kgills 0:b2219e6e444b 67 return -1;
kgills 0:b2219e6e444b 68 }
kgills 0:b2219e6e444b 69
kgills 0:b2219e6e444b 70 return 0;
kgills 0:b2219e6e444b 71 }
kgills 0:b2219e6e444b 72
kgills 0:b2219e6e444b 73 //******************************************************************************
kgills 0:b2219e6e444b 74 int BMP180::checkId(void)
kgills 0:b2219e6e444b 75 {
kgills 0:b2219e6e444b 76 char addr;
kgills 0:b2219e6e444b 77 char data;
kgills 0:b2219e6e444b 78
kgills 0:b2219e6e444b 79 addr = REG_ADDR_ID;
kgills 0:b2219e6e444b 80 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
kgills 0:b2219e6e444b 81 return -1;
kgills 0:b2219e6e444b 82 }
kgills 0:b2219e6e444b 83
kgills 0:b2219e6e444b 84 if (i2c_->read(I2C_ADDR, &data, 1) != 0) {
kgills 0:b2219e6e444b 85 return -1;
kgills 0:b2219e6e444b 86 }
kgills 0:b2219e6e444b 87
kgills 0:b2219e6e444b 88 if (data != 0x55) {
kgills 0:b2219e6e444b 89 return -1;
kgills 0:b2219e6e444b 90 }
kgills 0:b2219e6e444b 91
kgills 0:b2219e6e444b 92 return 0;
kgills 0:b2219e6e444b 93 }
kgills 0:b2219e6e444b 94
kgills 0:b2219e6e444b 95 //******************************************************************************
kgills 0:b2219e6e444b 96 int BMP180::startPressure(BMP180::oversampling_t oss)
kgills 0:b2219e6e444b 97 {
kgills 0:b2219e6e444b 98 char data[2];
kgills 0:b2219e6e444b 99
kgills 0:b2219e6e444b 100 data[0] = REG_ADDR_CTRL;
kgills 0:b2219e6e444b 101 data[1] = CTRL_REG_PRESS_0 | ((oss & 0x3) << 6);
kgills 0:b2219e6e444b 102 oss_ = oss;
kgills 0:b2219e6e444b 103
kgills 0:b2219e6e444b 104 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
kgills 0:b2219e6e444b 105 return -1;
kgills 0:b2219e6e444b 106 }
kgills 0:b2219e6e444b 107
kgills 0:b2219e6e444b 108 return 0;
kgills 0:b2219e6e444b 109 }
kgills 0:b2219e6e444b 110
kgills 0:b2219e6e444b 111 //******************************************************************************
kgills 0:b2219e6e444b 112 int BMP180::getPressure(int *pressure)
kgills 0:b2219e6e444b 113 {
kgills 0:b2219e6e444b 114 char addr, byte[3];
kgills 0:b2219e6e444b 115 uint32_t up;
kgills 0:b2219e6e444b 116 int32_t b6, x1, x2, x3, b3, p;
kgills 0:b2219e6e444b 117 uint32_t b4, b7;
kgills 0:b2219e6e444b 118
kgills 0:b2219e6e444b 119 addr = REG_ADDR_DATA;
kgills 0:b2219e6e444b 120 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
kgills 0:b2219e6e444b 121 return -1;
kgills 0:b2219e6e444b 122 }
kgills 0:b2219e6e444b 123
kgills 0:b2219e6e444b 124 if (i2c_->read(I2C_ADDR, byte, 3) != 0) {
kgills 0:b2219e6e444b 125 return -1;
kgills 0:b2219e6e444b 126 }
kgills 0:b2219e6e444b 127
kgills 0:b2219e6e444b 128 up = ((byte[0] << 16) | (byte[1] << 8) | byte[2]) >> (8 - oss_);
kgills 0:b2219e6e444b 129
kgills 0:b2219e6e444b 130 b6 = b5 - 4000;
kgills 0:b2219e6e444b 131 x1 = (b6 * b6) >> 12;
kgills 0:b2219e6e444b 132 x1 *= calib.b2;
kgills 0:b2219e6e444b 133 x1 >>= 11;
kgills 0:b2219e6e444b 134 x2 = calib.ac2 * b6;
kgills 0:b2219e6e444b 135 x2 >>= 11;
kgills 0:b2219e6e444b 136 x3 = x1 + x2;
kgills 0:b2219e6e444b 137 b3 = (((((int32_t)calib.ac1) * 4 + x3) << oss_) + 2);
kgills 0:b2219e6e444b 138 b3 >>= 2;
kgills 0:b2219e6e444b 139
kgills 0:b2219e6e444b 140 x1 = (calib.ac3 * b6) >> 13;
kgills 0:b2219e6e444b 141 x2 = (calib.b1 * ((b6 * b6) >> 12)) >> 16;
kgills 0:b2219e6e444b 142 x3 = (x1 + x2 + 2) >> 2;
kgills 0:b2219e6e444b 143 b4 = (calib.ac4 * (uint32_t)(x3 + 32768)) >> 15;
kgills 0:b2219e6e444b 144 b7 = ((uint32_t)up - b3) * (50000 >> oss_);
kgills 0:b2219e6e444b 145 p = ((b7 < 0x80000000) ? ((b7 << 1) / b4) : ((b7 / b4) * 2));
kgills 0:b2219e6e444b 146 x1 = p >> 8;
kgills 0:b2219e6e444b 147 x1 *= x1;
kgills 0:b2219e6e444b 148 x1 = (x1 * 3038) >> 16;
kgills 0:b2219e6e444b 149 x2 = (-7357 * p) >> 16;
kgills 0:b2219e6e444b 150 p += (x1 + x2 + 3791) >> 4;
kgills 0:b2219e6e444b 151
kgills 0:b2219e6e444b 152 *pressure = p;
kgills 0:b2219e6e444b 153
kgills 0:b2219e6e444b 154 return 0;
kgills 0:b2219e6e444b 155 }
kgills 0:b2219e6e444b 156
kgills 0:b2219e6e444b 157 //******************************************************************************
kgills 0:b2219e6e444b 158 int BMP180::startTemperature(void)
kgills 0:b2219e6e444b 159 {
kgills 0:b2219e6e444b 160 char data[2] = { REG_ADDR_CTRL, CTRL_REG_TEMP };
kgills 0:b2219e6e444b 161
kgills 0:b2219e6e444b 162 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
kgills 0:b2219e6e444b 163 return -1;
kgills 0:b2219e6e444b 164 }
kgills 0:b2219e6e444b 165
kgills 0:b2219e6e444b 166 return 0;
kgills 0:b2219e6e444b 167 }
kgills 0:b2219e6e444b 168
kgills 0:b2219e6e444b 169 //******************************************************************************
kgills 0:b2219e6e444b 170 int BMP180::getTemperature(float *tempC)
kgills 0:b2219e6e444b 171 {
kgills 0:b2219e6e444b 172 char addr, byte[2];
kgills 0:b2219e6e444b 173 uint16_t ut;
kgills 0:b2219e6e444b 174 int32_t x1, x2;
kgills 0:b2219e6e444b 175
kgills 0:b2219e6e444b 176 addr = REG_ADDR_DATA;
kgills 0:b2219e6e444b 177 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
kgills 0:b2219e6e444b 178 return -1;
kgills 0:b2219e6e444b 179 }
kgills 0:b2219e6e444b 180
kgills 0:b2219e6e444b 181 if (i2c_->read(I2C_ADDR, byte, 2) != 0) {
kgills 0:b2219e6e444b 182 return -1;
kgills 0:b2219e6e444b 183 }
kgills 0:b2219e6e444b 184
kgills 0:b2219e6e444b 185 ut = (byte[0] << 8) | byte[1];
kgills 0:b2219e6e444b 186
kgills 0:b2219e6e444b 187 x1 = ((ut - calib.ac6) * calib.ac5) >> 15;
kgills 0:b2219e6e444b 188 x2 = (calib.mc << 11) / (x1 + calib.md);
kgills 0:b2219e6e444b 189 b5 = x1 + x2;
kgills 0:b2219e6e444b 190
kgills 0:b2219e6e444b 191 *tempC = (float)(b5 + 8) / 160;
kgills 0:b2219e6e444b 192
kgills 0:b2219e6e444b 193 return 0;
kgills 0:b2219e6e444b 194 }
kgills 0:b2219e6e444b 195
kgills 0:b2219e6e444b 196 //******************************************************************************
kgills 0:b2219e6e444b 197 int BMP180::getTemperature(int16_t *tempCx10)
kgills 0:b2219e6e444b 198 {
kgills 0:b2219e6e444b 199 char addr, byte[2];
kgills 0:b2219e6e444b 200 uint16_t ut;
kgills 0:b2219e6e444b 201 int32_t x1, x2;
kgills 0:b2219e6e444b 202
kgills 0:b2219e6e444b 203 addr = REG_ADDR_DATA;
kgills 0:b2219e6e444b 204 if (i2c_->write(I2C_ADDR, &addr, 1) != 0) {
kgills 0:b2219e6e444b 205 return -1;
kgills 0:b2219e6e444b 206 }
kgills 0:b2219e6e444b 207
kgills 0:b2219e6e444b 208 if (i2c_->read(I2C_ADDR, byte, 2) != 0) {
kgills 0:b2219e6e444b 209 return -1;
kgills 0:b2219e6e444b 210 }
kgills 0:b2219e6e444b 211
kgills 0:b2219e6e444b 212 ut = (byte[0] << 8) | byte[1];
kgills 0:b2219e6e444b 213
kgills 0:b2219e6e444b 214 x1 = ((ut - calib.ac6) * calib.ac5) >> 15;
kgills 0:b2219e6e444b 215 x2 = (calib.mc << 11) / (x1 + calib.md);
kgills 0:b2219e6e444b 216 b5 = x1 + x2;
kgills 0:b2219e6e444b 217
kgills 0:b2219e6e444b 218 *tempCx10 = (b5 + 8) >> 4;
kgills 0:b2219e6e444b 219
kgills 0:b2219e6e444b 220 return 0;
kgills 0:b2219e6e444b 221 }