/* * 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 = 1000.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 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 = ((((float)N_MAX) / ((float)nAvg)) - 1.0) * R_REF; } 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; } } void measureTestExec() { static uint8_t t = 0; static int8_t dir = 1; if (t == 0) { dir = 1; } if (t == 50) { dir = -1; } t += dir; patternSetTemperature(t); } void measureStartConversion() { ADC10CTL0 |= ENC | ADC10SC; schAdd(measureCollectAndProcessConversion, NULL, MEASURE_FETCH_RESULT_DELAY, 0); } void measureInit() { ADC10CTL0 = SREF_0 | ADC10SHT_3 | ADC10SR | ADC10ON; ADC10CTL1 = INCH_0; ADC10AE0 = BIT0; schAdd(measureStartConversion, NULL, 0, 100); // schAdd(measureTestExec, NULL, 0, 10000); }