#ifndef STA_SENSORS_MS5607_HPP #define STA_SENSORS_MS5607_HPP #include #include #include namespace sta { // Class to represent a MS5607 pressure sensor which is used with SPI class MS5607 { public: // Different OSR levels for the sensor enum OsrLevel { _256 = 0, _512 = 1, _1024 = 2, _2048 = 3, _4096 = 4 }; MS5607(SpiDevice* device, OsrLevel osr=OsrLevel::_1024); // Request Calculation of uncompensated pressure // Takes a few ms -> Call, then do sth. else, then get Pressure with function // If calculation already running, do nothing void requestAdcReadout(uint32_t curTime); // Function to get Pressure // Parameter should be Temperature in Celsius * 100 (e.g. 20.3 deg. C -> 2030) // If currently still processing, use old value // If currently not processing, start processing to minmize potential wating times int32_t getPressure(int32_t temp, uint32_t curTime); // Parameterless version of function above // Calls getTemperature, to get temp // NOT RECOMMENDED int32_t getPressure(); // Getter for temperature // Deprecated because of time constrains // NOT RECOMMENDED int32_t getTemperature(); void changeOsrLevel(OsrLevel newOsr) { // Don't I need to write this to the sensor? this->osr_ = newOsr; } private: // Helper method to keep code clean void pulseCS(uint32_t ms=1) { this->device_->endTransmission(); sta::delayMs(ms); this->device_->beginTransmission(); } // Last Presure Value meassured; Used to give any output if still calculating ADC int32_t lastPresVal; // Value to store, when adc was started // On STM32 with HAL_GetTick() (Gives ms since startup) uint32_t adcStartTime; // STA internal object for SPi abstraction SpiDevice* device_; OsrLevel osr_; // 6 Different constants; Includes Offsets, references etc. uint16_t sens, off, tcs, tco, t_ref, tempsens; // All possible commands to send to the sensor enum Operations { RESET = 0x1E, READ_PROM = 0xA2, D1_CONVERSION = 0x40, D2_CONVERSION = 0x50, ADC_RESULT = 0x00 }; // Request pure ADC converted values from the sensor // Calculations with offset required uint32_t readPressure(); // Read temp should not be used, rather give temp from e.g. SCA3300 as parameter to readPres uint32_t readTemp(); // Calculate pure ADC values to final pressure/temperature values int32_t calculatePressure(uint32_t d1, int32_t dT); int32_t calculateTemperature(uint32_t d2); void reset(); void readPROM(); // Constants for waiting const char RESET_DELAY = 2800; // in uS // Function to get the delay times needed for different OSR Levels // Values not found in datasheet (facepalm) // Thus partly googled, partly tested out static uint8_t delayTimes(OsrLevel level) { switch (level) { case _256: return } } }; } #endif // ifndef STA_SENSORS_MS5607_HPP