mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
+ 0.1.04
+ changed float to double (for platforms which support it) + changed divisions in multiplications + fixed uint32_t readADC() + reduced size of C array by 1 float + added second order temperature compensation
This commit is contained in:
parent
2e5b971a8f
commit
0a3df91ed3
@ -2,11 +2,16 @@
|
|||||||
// FILE: MS5611.cpp
|
// FILE: MS5611.cpp
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// Erni - testing/fixes
|
// Erni - testing/fixes
|
||||||
// VERSION: 0.1.03
|
// VERSION: 0.1.04
|
||||||
// PURPOSE: MS5611 Temperature & Humidity library for Arduino
|
// PURPOSE: MS5611 Temperature & Humidity library for Arduino
|
||||||
// URL:
|
// URL:
|
||||||
//
|
//
|
||||||
// HISTORY:
|
// HISTORY:
|
||||||
|
// 0.1.04 changed float to double (for platforms which support it)
|
||||||
|
// changed divisions in multiplications
|
||||||
|
// fixed uint32_t readADC()
|
||||||
|
// reduced size of C array by 1 float
|
||||||
|
// added second order temperature compensation
|
||||||
// 0.1.03 changed math to float [test version]
|
// 0.1.03 changed math to float [test version]
|
||||||
// 0.1.02 fixed bug return value read()
|
// 0.1.02 fixed bug return value read()
|
||||||
// fixed bug #bits D2
|
// fixed bug #bits D2
|
||||||
@ -39,8 +44,10 @@ MS5611::MS5611(uint8_t address)
|
|||||||
void MS5611::init()
|
void MS5611::init()
|
||||||
{
|
{
|
||||||
reset();
|
reset();
|
||||||
for (int reg = 0; reg < 8; reg++)
|
for (int reg = 0; reg < 7; reg++)
|
||||||
{
|
{
|
||||||
|
// C[0] not used; this way indices match datasheet.
|
||||||
|
// C[7] == CRC skipped.
|
||||||
C[reg] = readProm(reg);
|
C[reg] = readProm(reg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -50,21 +57,47 @@ int MS5611::read(uint8_t bits)
|
|||||||
// VARIABLES NAMES BASED ON DATASHEET
|
// VARIABLES NAMES BASED ON DATASHEET
|
||||||
convert(0x40, bits);
|
convert(0x40, bits);
|
||||||
if (_result) return _result;
|
if (_result) return _result;
|
||||||
int32_t D1 = readADC();
|
uint32_t D1 = readADC();
|
||||||
if (_result) return _result;
|
if (_result) return _result;
|
||||||
|
|
||||||
convert(0x50, bits);
|
convert(0x50, bits);
|
||||||
if (_result) return _result;
|
if (_result) return _result;
|
||||||
int32_t D2 = readADC();
|
uint32_t D2 = readADC();
|
||||||
if (_result) return _result;
|
if (_result) return _result;
|
||||||
|
|
||||||
// PAGE 7/20 of the datasheet
|
// TODO the multiplications of these constants can be done in init()
|
||||||
float dT = D2 - (C[5] * 256L);
|
// but first they need to be verified.
|
||||||
_temperature = 2000 + (dT * C[6])/8388608L;
|
|
||||||
|
// TEMP & PRESS MATH - PAGE 7/20
|
||||||
|
double dT = D2 - C[5] * 256L;
|
||||||
|
_temperature = 2000 + dT * C[6] * 1.1920928955E-7;
|
||||||
|
|
||||||
float offset = (C[2] * 65536L) + (C[4] * dT ) / 128L;
|
double offset = C[2] * 65536L + dT * C[4] * 7.8125E-3;
|
||||||
float sens = C[1] * 32768L + (C[3] * dT ) / 256L;
|
double sens = C[1] * 32768L + dT * C[3] * 3.90625E-3;
|
||||||
_pressure = (((D1 * sens)/2097152L) - offset) / 32768L;
|
|
||||||
|
// SECOND ORDER COMPENSATION - PAGE 8/20
|
||||||
|
// COMMENT OUT < 20 CORRECTION IF NOT NEEDED
|
||||||
|
if (_temperature < 20)
|
||||||
|
{
|
||||||
|
double T2 = dT * dT * 4.6566128731E-10;
|
||||||
|
double t = _temperature - 2000;
|
||||||
|
double offset2 = 2.5 * t * t;
|
||||||
|
double sens2 = 1.25 * t * t * t;
|
||||||
|
// COMMENT OUT < -15 CORRECTION IF NOT NEEDED
|
||||||
|
if (_temperature < -15)
|
||||||
|
{
|
||||||
|
t = _temperature + 1500;
|
||||||
|
t = t * t;
|
||||||
|
offset2 += 7 * t;
|
||||||
|
sens2 += 5.5 * t;
|
||||||
|
}
|
||||||
|
_temperature -= T2;
|
||||||
|
offset -= offset2;
|
||||||
|
sens -= sens2;
|
||||||
|
}
|
||||||
|
// END SECOND ORDER COMPENSATION
|
||||||
|
|
||||||
|
_pressure = (D1 * sens * 4.76837158205E-7 - offset) * 3.051757813E-5;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -108,7 +141,7 @@ uint16_t MS5611::readProm(uint8_t reg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t MS5611::readADC()
|
uint32_t MS5611::readADC()
|
||||||
{
|
{
|
||||||
command(0x00);
|
command(0x00);
|
||||||
if (_result == 0)
|
if (_result == 0)
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// FILE: MS5611.h
|
// FILE: MS5611.h
|
||||||
// AUTHOR: Rob Tillaart
|
// AUTHOR: Rob Tillaart
|
||||||
// Erni - testing/fixes
|
// Erni - testing/fixes
|
||||||
// VERSION: 0.1.03
|
// VERSION: 0.1.04
|
||||||
// PURPOSE: MS5611 Temperature & Pressure library for Arduino
|
// PURPOSE: MS5611 Temperature & Pressure library for Arduino
|
||||||
// URL:
|
// URL:
|
||||||
//
|
//
|
||||||
@ -20,7 +20,7 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MS5611_LIB_VERSION "0.1.03"
|
#define MS5611_LIB_VERSION "0.1.04"
|
||||||
|
|
||||||
#define MS5611_READ_OK 0
|
#define MS5611_READ_OK 0
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void reset();
|
void reset();
|
||||||
void convert(uint8_t ADDR, uint8_t bits);
|
void convert(uint8_t ADDR, uint8_t bits);
|
||||||
int32_t readADC();
|
uint32_t readADC();
|
||||||
uint16_t readProm(uint8_t reg);
|
uint16_t readProm(uint8_t reg);
|
||||||
void command(uint8_t command);
|
void command(uint8_t command);
|
||||||
|
|
||||||
@ -46,7 +46,8 @@ private:
|
|||||||
int32_t _temperature;
|
int32_t _temperature;
|
||||||
int32_t _pressure;
|
int32_t _pressure;
|
||||||
int _result;
|
int _result;
|
||||||
float C[8];
|
double C[7];
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user