82 lines
1.8 KiB
C++
82 lines
1.8 KiB
C++
#include "clock.hpp"
|
|
|
|
#include <math.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
#include "flash/flash.hpp"
|
|
#include "io/io.hpp"
|
|
#include "uart/uart.hpp"
|
|
|
|
#define ADC_INT_VECTOR
|
|
#include "adc/adc.hpp"
|
|
|
|
#define UART0_INT_VECTORS
|
|
#include "uart/hardware0.hpp"
|
|
|
|
static constexpr auto SERIES_RESISTOR = 9951;
|
|
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()
|
|
{
|
|
uart::Uart0<> serial;
|
|
serial.init();
|
|
|
|
serial << F("Thermistor reader\r\n");
|
|
|
|
using adc_conf = adc::Config<adc::SingleMode>;
|
|
|
|
adc::Adc<adc_conf, io::P, io::P::C0> adcPin;
|
|
adcPin.init();
|
|
|
|
while (true) {
|
|
const auto adcSample = sampleAdc(adcPin, 1000);
|
|
const auto thermistorResistance = getResistance(adcSample);
|
|
const auto temperature = getTemperature(thermistorResistance);
|
|
|
|
char floatBuffer[16];
|
|
|
|
sprintf(floatBuffer, "%.2f", adcSample);
|
|
serial << F("Read ADC: ") << floatBuffer << F("\r\n");
|
|
sprintf(floatBuffer, "%.2f", thermistorResistance);
|
|
serial << F("Resistance: ") << floatBuffer << F("\r\n");
|
|
sprintf(floatBuffer, "%.2f", temperature);
|
|
serial << F("Temperature: ") << floatBuffer << F(" C \r\n");
|
|
|
|
_delay_ms(1000);
|
|
}
|
|
|
|
serial.flushTx();
|
|
|
|
return 0;
|
|
}
|