From d3e3967bee0ccb7fa0b0339c7fa4d2f09bb1ece6 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 4 Feb 2019 10:03:10 +0100 Subject: [PATCH] add measurement, stolen from tea thermometer --- Makefile | 2 +- measure.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ measure.h | 20 +++++++++++++ pattern.c | 8 ++++++ pattern.h | 5 ++++ 5 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 measure.c create mode 100644 measure.h diff --git a/Makefile b/Makefile index 8e07030..ec87fe6 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CC=msp430-gcc CFLAGS=-O3 -g0 -Wall -mmcu=msp430g2553 -std=gnu99 -I hottislib LDFLAGS=-mmcu=msp430g2553 -blinky1.elf: main.o led.o time.o pattern.o PontCoopScheduler.o myrand.o +blinky1.elf: main.o led.o time.o pattern.o PontCoopScheduler.o myrand.o measure.o $(CC) -o $@ $(LDFLAGS) $^ PontCoopScheduler.o: hottislib/PontCoopScheduler.c hottislib/PontCoopScheduler.h diff --git a/measure.c b/measure.c new file mode 100644 index 0000000..9ace202 --- /dev/null +++ b/measure.c @@ -0,0 +1,84 @@ +/* + * adc.cpp + * + * Created on: 03.10.2014 + * Author: wn + */ + +#include +#include +#include +#include +#include + +#include "measure.h" +#include "PontCoopScheduler.h" +#include "pattern.h" + + +const float R_REF = 3000.0; +const uint16_t N_MAX = 1023; +const float PT1000_R0 = 1000.0; +const float PT1000_Coeff = 3.85e-3; + + +const uint32_t MEASURE_CYCLE = 20; +const uint32_t MEASURE_FETCH_RESULT_DELAY = 5; +const uint8_t AVERAGING_CYCLES = 50; + + + +void measureInit() { + ADC10CTL0 = SREF1 | ADC10SHT_3 | ADC10SR | REFOUT | REFON | REF2_5V | ADC10ON; + ADC10CTL1 = INCH_3; + ADC10AE0 = BIT3; +} + +void measureCollectAndProcessConversion(); + +void measureStartConversion(void *handleArg) { + ADC10CTL0 |= ENC | ADC10SC; + schAdd(measureCollectAndProcessConversion, NULL, MEASURE_FETCH_RESULT_DELAY, 0); +} + +void measureCollectAndProcessConversion() { + static uint32_t averagingSum = 0; + static uint8_t averagingCnt = 0; + + uint16_t n = 0xffff; + if ((ADC10CTL0 & ADC10IFG) != 0) { + n = ADC10MEM; + ADC10CTL0 &= ~(ADC10IFG | ENC); + } + + if (n != 0xffff) { + averagingSum += n; + averagingCnt++; + } + + if (averagingCnt == AVERAGING_CYCLES) { + uint32_t nAvg = averagingSum / averagingCnt; + + // process adcValue + // store result in variable temperature + float r = 0.0; + if (nAvg == 0) { + r = 0.0; + } else if (nAvg == N_MAX) { + r = FLT_MAX; + } else { + r = R_REF / ((((float)N_MAX) / ((float)nAvg)) - 1.0); + } + float t = (r / PT1000_R0 - 1) / PT1000_Coeff; + + uint8_t temperature = (t < 0) ? 0 : ((uint8_t)t); + + // do something with the temperature + patternSetTemperature(temperature); + + averagingCnt = 0; + averagingSum = 0; + } +} + + diff --git a/measure.h b/measure.h new file mode 100644 index 0000000..ed21065 --- /dev/null +++ b/measure.h @@ -0,0 +1,20 @@ +/* + * adc.h + * + * Created on: 03.10.2014 + * Author: wn + */ + +#ifndef MEASURE_H_ +#define MEASURE_H_ + +#include + + + + +void measureInit(); +void measureStartConversion(); + + +#endif /* MEASURE_H_ */ diff --git a/pattern.c b/pattern.c index 8f4c483..8654b4e 100644 --- a/pattern.c +++ b/pattern.c @@ -4,6 +4,14 @@ #include #include "myrand.h" + +uint8_t temperature = 20; + + +void patternSetTemperature(uint8_t t) { + temperature = t; +} + /* * traversing the whole matrix void patternExec() { diff --git a/pattern.h b/pattern.h index 1d2bff0..acc1b4b 100644 --- a/pattern.h +++ b/pattern.h @@ -1,8 +1,13 @@ #ifndef PATTERN_H_ #define PATTERN_H_ +#include + + void patternExec(); void patternInit(); +void patternSetTemperature(uint8_t t); + #endif /* PATTERN_H_ */