Refactor thermistor code into static class

This commit is contained in:
BlackMark 2020-03-30 17:01:48 +02:00
parent 2575863048
commit eee348d851
4 changed files with 58 additions and 36 deletions

View File

@ -1,7 +1,5 @@
#include "clock.hpp" #include "clock.hpp"
#include <math.h>
#include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include "flash/flash.hpp" #include "flash/flash.hpp"
@ -14,37 +12,7 @@
#define UART0_INT_VECTORS #define UART0_INT_VECTORS
#include "uart/hardware0.hpp" #include "uart/hardware0.hpp"
static constexpr auto SERIES_RESISTOR = 9951; #include "thermistor.hpp"
static constexpr auto THERMISTOR_NOMINAL = 9270;
static constexpr auto BETA_COEFFICIENT = 3212;
static constexpr auto NOMINAL_TEMPERATURE = 25;
template <typename Adc>
double sampleAdc(Adc &adcPin, uint16_t numSamples = 100)
{
double samples = 0;
for (uint16_t i = 0; i < numSamples; ++i)
samples += adcPin.read();
return samples / numSamples;
}
double getResistance(double adcSample)
{
return SERIES_RESISTOR * adcSample / (1023 - adcSample);
}
double getTemperature(double resistance)
{
double steinhart = resistance / THERMISTOR_NOMINAL;
steinhart = log(steinhart);
steinhart /= BETA_COEFFICIENT;
steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15);
steinhart = 1.0 / steinhart;
steinhart -= 273.15;
return steinhart;
}
int main() int main()
{ {
@ -58,10 +26,12 @@ int main()
adc::Adc<adc_conf, io::P, io::P::C0> adcPin; adc::Adc<adc_conf, io::P, io::P::C0> adcPin;
adcPin.init(); adcPin.init();
Thermistor temp;
while (true) { while (true) {
const auto adcSample = sampleAdc(adcPin, 1000); const auto adcSample = temp.sampleAdc(adcPin, 1000);
const auto thermistorResistance = getResistance(adcSample); const auto thermistorResistance = temp.getResistance(adcSample);
const auto temperature = getTemperature(thermistorResistance); const auto temperature = temp.getTemperature(thermistorResistance);
char floatBuffer[16]; char floatBuffer[16];

19
thermistor/thermistor.cpp Normal file
View File

@ -0,0 +1,19 @@
#include "thermistor.hpp"
#include <math.h>
double Thermistor::getResistance(double adcSample)
{
return SERIES_RESISTOR * adcSample / (1023 - adcSample);
}
double Thermistor::getTemperature(double resistance)
{
double steinhart = resistance / THERMISTOR_NOMINAL;
steinhart = log(steinhart);
steinhart /= BETA_COEFFICIENT;
steinhart += 1.0 / (NOMINAL_TEMPERATURE + 273.15);
steinhart = 1.0 / steinhart;
steinhart -= 273.15;
return steinhart;
}

View File

@ -212,6 +212,12 @@
<Compile Include="main.cpp"> <Compile Include="main.cpp">
<SubType>compile</SubType> <SubType>compile</SubType>
</Compile> </Compile>
<Compile Include="thermistor.cpp">
<SubType>compile</SubType>
</Compile>
<Compile Include="thermistor.hpp">
<SubType>compile</SubType>
</Compile>
<Compile Include="uart\config.hpp"> <Compile Include="uart\config.hpp">
<SubType>compile</SubType> <SubType>compile</SubType>
</Compile> </Compile>

27
thermistor/thermistor.hpp Normal file
View File

@ -0,0 +1,27 @@
#pragma once
#include <stdint.h>
class Thermistor {
public:
template <typename Adc>
static double sampleAdc(Adc &adcPin, uint16_t numSamples = 100)
{
double samples = 0;
for (uint16_t i = 0; i < numSamples; ++i)
samples += adcPin.read();
return samples / numSamples;
}
static double getResistance(double adcSample);
static double getTemperature(double resistance);
private:
static constexpr auto SERIES_RESISTOR = 9951;
static constexpr auto THERMISTOR_NOMINAL = 9270;
static constexpr auto BETA_COEFFICIENT = 3212;
static constexpr auto NOMINAL_TEMPERATURE = 25;
};