mpl115A2 i2c pressure and temperature sensor
Dependents: HTTPClient_SuperTweet_MPL115A2 mpl115a2_display_local
MPL115A2.cpp
- Committer:
- joeh
- Date:
- 2012-05-07
- Revision:
- 1:6dbe3322f203
- Parent:
- 0:5a72175e5cb2
File content as of revision 1:6dbe3322f203:
/****************************************************************************** * Includes ******************************************************************************/ #include "MPL115A2.h" #include "mbed.h" /****************************************************************************** * Constructors ******************************************************************************/ MPL115A2::MPL115A2(I2C *i2c, const PinName shdnPin): _i2c_address(0xc0), _i2c(i2c), _shdnPin(shdnPin),_debug(false),_pc(NULL) { } MPL115A2::MPL115A2(I2C *i2c, Serial *pc, const PinName shdnPin): _i2c_address(0xc0), _i2c(i2c), _shdnPin(shdnPin), _pc(pc), _debug(true) { } /****************************************************************************** * Global Functions ******************************************************************************/ void MPL115A2::ReadSensor() { int res; //wakeup _shdnPin=1; _bShutdown = false; wait(0.001); // wait the device to be ready // start AD conversions char cmd[2]; cmd[0]=0x12; cmd[1]=0x01; res = _i2c->write(_i2c_address,cmd,2); if(_debug) { if(res==0) { _pc->printf("Success: Requested temp and pressure \n"); } else { _pc->printf("Failed : Requested temp and pressure %d\n", res); } } wait(0.01); cmd[0]=0x00; res = _i2c->write(_i2c_address,cmd,1); if(_debug) { if(res==0) { _pc->printf("Success: Select temp and pressure register \n"); } else { _pc->printf("Failed : Select temp and pressure register %d\n", res); } } // compensation char data[4]; res = _i2c->read(_i2c_address, data, 4); if(_debug) { if(res==0) { _pc->printf("Success: Read temp and pressure register \n"); } else { _pc->printf("Failed : Read temp and pressure register %d\n", res); } } if(res == 0) { _uiPadc = (unsigned short) data[0] << 8; _uiPadc += (unsigned short) data[1] & 0x00FF; _uiTadc = (unsigned short) data[2] << 8; _uiTadc += (unsigned short) data[3] & 0x00FF; // Coefficient 9 equation compensation _uiPadc = _uiPadc >> 6; _uiTadc = _uiTadc >> 6; } } /********************************************************** * GetPressure * Gets the current pressure from the sensor. * * @return float - The local pressure in kPa **********************************************************/ float MPL115A2::GetPressure() { short siPcomp; int lt1, lt2, lt3, si_c11x1, si_a11, si_c12x2; int si_a1, si_c22x2, si_a2, si_a1x1, si_y1, si_a2x2; // Step 1 c11x1 = c11 * Padc lt1 = (int) _sic11; lt2 = (int) _uiPadc; lt3 = lt1*lt2; si_c11x1 = (int) lt3; // Step 2 a11 = b1 + c11x1 lt1 = ((int)_sib1)<<14; lt2 = (int) si_c11x1; lt3 = lt1 + lt2; si_a11 = (int)(lt3>>14); // Step 3 c12x2 = c12 * Tadc lt1 = (int) _sic12; lt2 = (int) _uiTadc; lt3 = lt1*lt2; si_c12x2 = (int)lt3; // Step 4 a1 = a11 + c12x2 lt1 = ((int)si_a11<<11); lt2 = (int)si_c12x2; lt3 = lt1 + lt2; si_a1 = (int) lt3>>11; // Step 5 c22x2 = c22*Tadc lt1 = (int)_sic22; lt2 = (int)_uiTadc; lt3 = lt1 * lt2; si_c22x2 = (int)(lt3); // Step 6 a2 = b2 + c22x2 lt1 = ((int)_sib2<<15); lt2 = ((int)si_c22x2>1); lt3 = lt1+lt2; si_a2 = ((int)lt3>>16); // Step 7 a1x1 = a1 * Padc lt1 = (int)si_a1; lt2 = (int)_uiPadc; lt3 = lt1*lt2; si_a1x1 = (int)(lt3); // Step 8 y1 = a0 + a1x1 lt1 = ((int)_sia0<<10); lt2 = (int)si_a1x1; lt3 = lt1+lt2; si_y1 = ((int)lt3>>10); // Step 9 a2x2 = a2 * Tadc lt1 = (int)si_a2; lt2 = (int)_uiTadc; lt3 = lt1*lt2; si_a2x2 = (int)(lt3); // Step 10 pComp = y1 + a2x2 lt1 = ((int)si_y1<<10); lt2 = (int)si_a2x2; lt3 = lt1+lt2; // Fixed point result with rounding siPcomp = ((int)lt3>>13); if(_debug) { _pc->printf("Success: Calculated Pressure Compesation Value %d\n", siPcomp); } // decPcomp is defined as a floating point number // Conversion to decimal value from 1023 ADC count value // ADC counts are 0 to 1023, pressure is 50 to 115kPa respectively return (((650.0/1023.0)*siPcomp)+500); } /********************************************************** * GetTemperature * Gets the current temperature from the sensor. * * @return float - The local pressure in °C **********************************************************/ float MPL115A2::GetTemperature() { return (25 + ((_uiTadc - 498.0) / -5.35)); } /********************************************************** * Begin * Gets the coefficients from the sensor. * **********************************************************/ void MPL115A2::begin() { short sia0MSB, sia0LSB; short sib1MSB, sib1LSB; short sib2MSB, sib2LSB; short sic12MSB, sic12LSB; short sic11MSB, sic11LSB; short sic22MSB, sic22LSB; //wakeup _shdnPin=1; _bShutdown = false; wait(0.001); // wait the device to be ready //send request for coefficients char cmd[1]; cmd[0] = 0x04; _i2c->write(_i2c_address, cmd, 1); // read out coefficients char coeff[12]; int res = _i2c->read(_i2c_address, coeff, 12); if (res == 0) { sia0MSB = coeff[0]; sia0LSB = coeff[1]; sib1MSB = coeff[2]; sib1LSB = coeff[3]; sib2MSB = coeff[4]; sib2LSB = coeff[5]; sic12MSB = coeff[6]; sic12LSB = coeff[7]; sic11MSB = coeff[8]; sic11LSB = coeff[9]; sic22MSB = coeff[10]; sic22LSB = coeff[11]; // Placing coefficients into 16-bit Variables // a0 _sia0 = (signed int) sia0MSB << 8; _sia0 += (signed int) sia0LSB & 0x00FF; // b1 _sib1 = (signed int) sib1MSB << 8; _sib1 += (signed int) sib1LSB & 0x00FF; // b2 _sib2 = (signed int) sib2MSB << 8; _sib2 += (signed int) sib2LSB & 0x00FF; // c12 _sic12 = (signed int) sic12MSB << 8; _sic12 += (signed int) sic12LSB & 0x00FF; // c11 _sic11 = (signed int) sic11MSB << 8; _sic11 += (signed int) sic11LSB & 0x00FF; // c22 _sic22 = (signed int) sic22MSB << 8; _sic22 += (signed int) sic22LSB & 0x00FF; } } void MPL115A2::shutdown() { _shdnPin = 0; _bShutdown = true; }