From 167b0dd204d11b670c2bcb6697faa3ccced73e01 Mon Sep 17 00:00:00 2001 From: Fabrizio Monti <fabrizio.monti@skywarder.eu> Date: Thu, 29 May 2025 11:05:38 +0200 Subject: [PATCH] [ENGINE] Added thermocouple. --- src/Engine/Buses.h | 1 + src/Engine/Configs/SensorsConfig.h | 6 +++++ src/Engine/Sensors/Sensors.cpp | 37 ++++++++++++++++++++++++++++++ src/Engine/Sensors/Sensors.h | 6 +++++ 4 files changed, 50 insertions(+) diff --git a/src/Engine/Buses.h b/src/Engine/Buses.h index 3efddfc12..08d2283f5 100644 --- a/src/Engine/Buses.h +++ b/src/Engine/Buses.h @@ -39,6 +39,7 @@ public: Boardcore::SPIBus& getLIS2MDL() { return spi3; } Boardcore::SPIBus& getLSM6DSRX() { return spi3; } Boardcore::SPIBus& getADS131M08() { return spi4; } + Boardcore::SPIBus& getThermocouple() { return spi1; } Boardcore::USART& getHILUart() { return usart4; } diff --git a/src/Engine/Configs/SensorsConfig.h b/src/Engine/Configs/SensorsConfig.h index fe21e84b3..19bbf69de 100644 --- a/src/Engine/Configs/SensorsConfig.h +++ b/src/Engine/Configs/SensorsConfig.h @@ -173,6 +173,12 @@ constexpr float TANK_P1_TEMP = 34.0f; } // namespace Kulite +namespace MAX31856 +{ +constexpr Hertz PERIOD = 10_hz; +constexpr bool ENABLED = true; +} // namespace MAX31856 + namespace InternalADC { constexpr Boardcore::InternalADC::Channel VBAT_CH = diff --git a/src/Engine/Sensors/Sensors.cpp b/src/Engine/Sensors/Sensors.cpp index 657c256fd..360dab1f7 100644 --- a/src/Engine/Sensors/Sensors.cpp +++ b/src/Engine/Sensors/Sensors.cpp @@ -55,6 +55,9 @@ bool Sensors::start() tankTempInit(); } + if (Config::Sensors::MAX31856::ENABLED) + thermocoupleInit(); + if (Config::Sensors::InternalADC::ENABLED) internalAdcInit(); @@ -141,6 +144,11 @@ TemperatureData Sensors::getTankTempLastSample() return tankTemp ? tankTemp->getLastSample() : TemperatureData{}; } +TemperatureData Sensors::getThermocoupleLastSample() +{ + return thermocouple ? thermocouple->getLastSample() : TemperatureData{}; +} + VoltageData Sensors::getBatteryVoltageLastSample() { auto sample = getInternalADCLastSample(); @@ -196,6 +204,9 @@ std::vector<SensorInfo> Sensors::getSensorInfos() if (tankTemp) infos.push_back(manager->getSensorInfo(tankTemp.get())); + if (thermocouple) + infos.push_back(manager->getSensorInfo(thermocouple.get())); + return infos; } else @@ -507,6 +518,25 @@ void Sensors::tankTempInit() void Sensors::tankTempCallback() { sdLogger.log(getTankTempLastSample()); } +void Sensors::thermocoupleInit() +{ + SPIBusConfig spiConfig = MAX31856::getDefaultSPIConfig(); + spiConfig.clockDivider = SPI::ClockDivider::DIV_32; + + thermocouple = std::make_unique<MAX31856>( + getModule<Buses>()->getThermocouple(), + sensors::thermocouple::cs::getPin(), spiConfig, + MAX31856::ThermocoupleType::K_TYPE); // TODO: verify the type +} + +void Sensors::thermocoupleCallback() +{ + if (!thermocouple) + return; + + sdLogger.log(getThermocoupleLastSample()); +} + bool Sensors::sensorManagerInit() { SensorManager::SensorMap_t map; @@ -606,6 +636,13 @@ bool Sensors::sensorManagerInit() map.emplace(std::make_pair(tankTemp.get(), info)); } + if (thermocouple) + { + SensorInfo info("MAX31856", Config::Sensors::MAX31856::PERIOD, + [this]() { thermocoupleCallback(); }); + map.emplace(std::make_pair(thermocouple.get(), info)); + } + manager = std::make_unique<SensorManager>(map, &getSensorsScheduler()); return manager->start(); } diff --git a/src/Engine/Sensors/Sensors.h b/src/Engine/Sensors/Sensors.h index 7294874e8..73bb192eb 100644 --- a/src/Engine/Sensors/Sensors.h +++ b/src/Engine/Sensors/Sensors.h @@ -32,6 +32,7 @@ #include <sensors/LIS2MDL/LIS2MDL.h> #include <sensors/LPS22DF/LPS22DF.h> #include <sensors/LSM6DSRX/LSM6DSRX.h> +#include <sensors/MAX31856/MAX31856.h> #include <sensors/SensorManager.h> #include <sensors/analog/TrafagPressureSensor.h> #include <utils/DependencyManager/DependencyManager.h> @@ -64,6 +65,7 @@ public: Boardcore::PressureData getCCPressLastSample(); Boardcore::TemperatureData getTankTempLastSample(); Boardcore::VoltageData getBatteryVoltageLastSample(); + Boardcore::TemperatureData getThermocoupleLastSample(); std::vector<Boardcore::SensorInfo> getSensorInfos(); @@ -80,6 +82,7 @@ protected: std::unique_ptr<Boardcore::LSM6DSRX> lsm6dsrx1; std::unique_ptr<Boardcore::ADS131M08> ads131m08; std::unique_ptr<Boardcore::InternalADC> internalAdc; + std::unique_ptr<Boardcore::MAX31856> thermocouple; // Analog sensors std::unique_ptr<Boardcore::TrafagPressureSensor> oxTopTankPressure; @@ -112,6 +115,9 @@ private: void internalAdcInit(); void internalAdcCallback(); + void thermocoupleInit(); + void thermocoupleCallback(); + void oxTopTankPressureInit(); void oxTopTankPressureCallback(); -- GitLab