Reverted a few changes but fixed a few issues

This commit is contained in:
dario 2024-05-17 00:42:53 +02:00
parent cdb9b4a1d2
commit c0eb36fbe0
2 changed files with 67 additions and 35 deletions

View File

@ -35,6 +35,16 @@ namespace sta
*/ */
using DelayUsFunc = void (*)(uint32_t); using DelayUsFunc = void (*)(uint32_t);
/**
* @brief Represents the two different supported sensors.
*
*/
enum Version
{
_MS5611,
_MS5607
};
/** /**
* @brief Different OSR levels for the sensor * @brief Different OSR levels for the sensor
* *
@ -81,6 +91,10 @@ namespace sta
ADC_RESULT = 0x00 ADC_RESULT = 0x00
}; };
/**
* @brief Represents the two datatypes available for this sensor.
*
*/
enum DataType enum DataType
{ {
PRESSURE, PRESSURE,
@ -91,23 +105,25 @@ namespace sta
* @brief SPI driver for the MS56xx pressure sensor series. * @brief SPI driver for the MS56xx pressure sensor series.
* *
* @param device The SPI device for bus communication. * @param device The SPI device for bus communication.
* @param version The version of the sensor that the driver is used for.
* @param delay Function for triggering microsecond delays. * @param delay Function for triggering microsecond delays.
* @param osr The oversampling rate for the sensor. * @param osr The oversampling rate for the sensor.
* *
* @note Set PS pin to low for SPI. Maximum SPI frequency 20MHz, mode 0 and 3 are supported. * @note Set PS pin to low for SPI. Maximum SPI frequency 20MHz, mode 0 and 3 are supported.
*/ */
MS56xx(SPIDevice * device, DelayUsFunc delay, OsrLevel osr = OsrLevel::_1024); MS56xx(SPIDevice * device, Version version, DelayUsFunc delay, OsrLevel osr = OsrLevel::_1024);
/** /**
* @brief I2C driver for the MS56xx pressure sensor series. * @brief I2C driver for the MS56xx pressure sensor series.
* *
* @param device The I2C device for bus communication. * @param device The I2C device for bus communication.
* @param version The version of the sensor that the driver is used for.
* @param delay Function for triggering microsecond delays. * @param delay Function for triggering microsecond delays.
* @param osr The oversampling rate for the sensor. * @param osr The oversampling rate for the sensor.
* *
* @note Set PS pin to high for I2C. Chip select pin represents LSB of address. * @note Set PS pin to high for I2C. Chip select pin represents LSB of address.
*/ */
MS56xx(I2CDevice * device, DelayUsFunc delay, OsrLevel osr = OsrLevel::_1024); MS56xx(I2CDevice * device, Version version, DelayUsFunc delay, OsrLevel osr = OsrLevel::_1024);
/** /**
* @brief Initialize the driver. Computes the pressure value at altitude 0. * @brief Initialize the driver. Computes the pressure value at altitude 0.
@ -125,18 +141,6 @@ namespace sta
*/ */
void setOsr(OsrLevel osr); void setOsr(OsrLevel osr);
/**
* @brief
*
* @param type
* @param blocking
*/
void requestData(DataType type);
void requestPressure();
void requestTemperature();
/** /**
* @brief Reads the current pressure value from the sensor. Obtains the temperature value from the interal sensor. * @brief Reads the current pressure value from the sensor. Obtains the temperature value from the interal sensor.
* *
@ -176,6 +180,13 @@ namespace sta
*/ */
void reset(); void reset();
/**
* @brief Request an ADC readout from the sensor.
*
* @param type The type of data to read.
*/
void requestData(DataType type);
/** /**
* @brief Read all constants from the PROM * @brief Read all constants from the PROM
* *
@ -235,6 +246,8 @@ namespace sta
private: private:
// STA internal object for SPi abstraction // STA internal object for SPi abstraction
Device * device_; Device * device_;
Version version_;
Version type_;
DelayUsFunc delay_; DelayUsFunc delay_;
OsrLevel osr_; OsrLevel osr_;
Intf intf_; Intf intf_;

View File

@ -9,18 +9,20 @@
namespace sta namespace sta
{ {
MS56xx::MS56xx(SPIDevice * device, DelayUsFunc delay, OsrLevel level /* = OsrLevel::_1024 */) MS56xx::MS56xx(SPIDevice * device, Version version, DelayUsFunc delay, OsrLevel osr = OsrLevel::_1024)
: device_{device}, : device_{device},
version_{version},
delay_{delay}, delay_{delay},
osr_{level}, osr_{osr},
intf_{Intf::SPI}, intf_{Intf::SPI},
C_{} C_{}
{ {
STA_ASSERT(device != nullptr); STA_ASSERT(device != nullptr);
} }
MS56xx::MS56xx(I2CDevice * device, DelayUsFunc delay, OsrLevel osr /* = OsrLevel::_1024 */) MS56xx::MS56xx(I2CDevice * device, Version version, DelayUsFunc delay, OsrLevel osr /* = OsrLevel::_1024 */)
: device_{device}, : device_{device},
version_{version},
delay_{delay}, delay_{delay},
osr_{osr}, osr_{osr},
intf_{Intf::I2C}, intf_{Intf::I2C},
@ -64,21 +66,20 @@ namespace sta
// Request the ADC to read new data. // Request the ADC to read new data.
busCommand(op + 2*this->osr_); busCommand(op + 2*this->osr_);
}
void MS56xx::requestPressure() delay_(osrDelay());
{
requestData(PRESSURE);
}
void MS56xx::requestTemperature()
{
requestData(TEMPERATURE);
} }
float MS56xx::getPressure(Unit unit /* = Unit::hPa */) float MS56xx::getPressure(Unit unit /* = Unit::hPa */)
{ {
requestData(TEMPERATURE);
uint8_t buffer[3] = { 0x00, 0x00, 0x00 }; uint8_t buffer[3] = { 0x00, 0x00, 0x00 };
busRead(MS56xx::Operations::ADC_RESULT, buffer, 3);
uint32_t D2 = buffer[0] << 16 | buffer[1] << 8 | buffer[2];
dT_ = D2 - C_[5];
requestData(PRESSURE);
busRead(MS56xx::Operations::ADC_RESULT, buffer, 3); busRead(MS56xx::Operations::ADC_RESULT, buffer, 3);
uint32_t D1 = buffer[0] << 16 | buffer[1] << 8 | buffer[2]; uint32_t D1 = buffer[0] << 16 | buffer[1] << 8 | buffer[2];
@ -86,8 +87,10 @@ namespace sta
float sens = C_[1] + dT_ * C_[3]; float sens = C_[1] + dT_ * C_[3];
// The pressure in Pa. // The pressure in Pa.
float pressure = (D1 * sens * 4.76837158205E-7 - offset) * 3.051757813E-5 * 0.01; float pressure = (D1 * sens * 4.76837158205E-7 - offset) * 3.051757813E-5;
// TODO: conversion
// Convert to desired unit.
pressure = convertPressure(pressure, unit);
return pressure; return pressure;
} }
@ -100,7 +103,7 @@ namespace sta
uint32_t D2 = buffer[0] << 16 | buffer[1] << 8 | buffer[2]; uint32_t D2 = buffer[0] << 16 | buffer[1] << 8 | buffer[2];
dT_ = D2 - C_[5]; dT_ = D2 - C_[5];
return 2000 + dT_ * C_[6] * 0.01; return (2000 + dT_ * C_[6]) * 0.01;
} }
void MS56xx::setPressureReference(float pressRef, float altRef, Unit unit /* = Unit::hPa */) void MS56xx::setPressureReference(float pressRef, float altRef, Unit unit /* = Unit::hPa */)
@ -133,12 +136,28 @@ namespace sta
void MS56xx::initConstants() void MS56xx::initConstants()
{ {
C_[0] = 1; C_[0] = 1;
C_[1] = 65536L;
C_[2] = 131072; switch (version_)
C_[3] = 7.8125E-3; {
C_[4] = 0.015625; case _MS5607:
C_[5] = 256; C_[1] = 65536L;
C_[6] = 1.1920928955E-7; C_[2] = 131072;
C_[3] = 7.8125E-3;
C_[4] = 0.015625;
C_[5] = 256;
C_[6] = 1.1920928955E-7;
break;
case _MS5611:
C_[1] = 32768L;
C_[2] = 65536L;
C_[3] = 3.90625E-3;
C_[4] = 7.8125E-3;
C_[5] = 256;
C_[6] = 1.1920928955E-7;
default:
break;
}
} }
inline float MS56xx::convertPressure(float pressure, Unit unit) inline float MS56xx::convertPressure(float pressure, Unit unit)