From 7505f04558d353bb89556e29e63f98864839615c Mon Sep 17 00:00:00 2001 From: dario Date: Sun, 28 Apr 2024 10:56:42 +0200 Subject: [PATCH] Changes to make use of previous temperature measurements --- include/sta/drivers/MS56xx.hpp | 9 ++++-- src/MS56xx.cpp | 54 ++++++++++++---------------------- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/include/sta/drivers/MS56xx.hpp b/include/sta/drivers/MS56xx.hpp index 651ff73..e90dffe 100644 --- a/include/sta/drivers/MS56xx.hpp +++ b/include/sta/drivers/MS56xx.hpp @@ -119,9 +119,10 @@ namespace sta * @brief Reads the current pressure value from the sensor. Obtains the temperature value from the interal sensor. * * @param unit Specifies the unit for the pressure measurement. Default is hPa. + * @param cachedTemp Specifies if a cached temperature value should be used. * @return int32_t The measured value in the specified unit. */ - float getPressure(Unit unit = Unit::hPa); + float getPressure(Unit unit = Unit::hPa, bool cachedTemp = false); /** * @brief Reads the current temperature value from the sensor. @@ -129,7 +130,7 @@ namespace sta * @return int32_t The measured temperature. * @note There are better sensors for temperature measurements than the MS56xx. */ - int32_t getTemperature(); + float getTemperature(); /** * @brief Provide a reference pressure value at a reference altitude in order to estimate the sealevel pressure. @@ -216,6 +217,8 @@ namespace sta OsrLevel osr_; Intf intf_; + float dT_; + // Pressure at sealevel. Use the standard atmosphere per default. float sealevel_ = 1013.25; @@ -227,4 +230,4 @@ namespace sta }; } -#endif // ifndef STA_SENSORS_MS5607_HPP \ No newline at end of file +#endif // ifndef STA_SENSORS_MS5607_HPP diff --git a/src/MS56xx.cpp b/src/MS56xx.cpp index 0222708..0868e26 100644 --- a/src/MS56xx.cpp +++ b/src/MS56xx.cpp @@ -53,7 +53,7 @@ namespace sta delay_(MS56xx::RESET_DELAY); } - float MS56xx::getPressure(Unit unit /* = Unit::hPa */) + float MS56xx::getPressure(Unit unit /* = Unit::hPa */, bool cachedTemp /* = false */) { // Request the ADC to read pressure values. busCommand(MS56xx::Operations::D1_CONVERSION + 2*this->osr_); @@ -66,39 +66,23 @@ namespace sta uint32_t D1 = 0x00 | buffer[0] << 16 | buffer[1] << 8 | buffer[2]; - // Request the ADC to read temperature values. - busCommand(MS56xx::Operations::D2_CONVERSION + 2*this->osr_); - - // 8.22 ms conversion according to the datasheet. - delay_(osrDelay()); - - busRead(MS56xx::Operations::ADC_RESULT, buffer, 3); - - uint32_t D2 = buffer[0] << 16 | buffer[1] << 8 | buffer[2]; - - float dT = D2 - C_[5]; - float offset = C_[2] + dT * C_[4]; - float sens = C_[1] + dT * C_[3]; - - /* - if (temperature < 2000) + if (!cachedTemp) { - float T2 = dT * dT * 4.6566128731E-10; - float t = (temperature - 2000) * (temperature - 2000); - float offset2 = 2.5 * t; - float sens2 = 1.25 * t; - // COMMENT OUT < -1500 CORRECTION IF NOT NEEDED - if (temperature < -1500) - { - t = (temperature + 1500) * (temperature + 1500); - offset2 += 7 * t; - sens2 += 5.5 * t; - } - temperature -= T2; - offset -= offset2; - sens -= sens2; + // Request the ADC to read temperature values. + busCommand(MS56xx::Operations::D2_CONVERSION + 2*this->osr_); + + // 8.22 ms conversion according to the datasheet. + delay_(osrDelay()); + + busRead(MS56xx::Operations::ADC_RESULT, buffer, 3); + + uint32_t D2 = buffer[0] << 16 | buffer[1] << 8 | buffer[2]; + + dT_ = D2 - C_[5]; } - */ + + float offset = C_[2] + dT_ * C_[4]; + float sens = C_[1] + dT_ * C_[3]; // The pressure in Pa. float pressure = (D1 * sens * 4.76837158205E-7 - offset) * 3.051757813E-5; @@ -107,7 +91,7 @@ namespace sta return pressure * 0.01; } - int32_t MS56xx::getTemperature() + float MS56xx::getTemperature() { // Request the ADC to read temperature values. busCommand(MS56xx::Operations::D2_CONVERSION + 2*this->osr_); @@ -120,8 +104,8 @@ namespace sta uint32_t D2 = buffer[0] << 16 | buffer[1] << 8 | buffer[2]; - float dT = D2 - C_[5]; - float temperature = 2000 + dT * C_[6]; + dT_ = D2 - C_[5]; + float temperature = 2000 + dT_ * C_[6]; return temperature * 0.01; }