2019-02-04 10:03:10 +01:00
|
|
|
/*
|
|
|
|
* adc.cpp
|
|
|
|
*
|
|
|
|
* Created on: 03.10.2014
|
|
|
|
* Author: wn
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <msp430g2553.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <float.h>
|
|
|
|
|
|
|
|
#include "measure.h"
|
|
|
|
#include "PontCoopScheduler.h"
|
|
|
|
#include "pattern.h"
|
|
|
|
|
|
|
|
|
2019-02-12 11:33:01 +01:00
|
|
|
const float R_REF = 1000.0;
|
2019-02-04 10:03:10 +01:00
|
|
|
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() {
|
2019-02-09 17:54:18 +01:00
|
|
|
|
2019-02-04 10:03:10 +01:00
|
|
|
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 {
|
2019-02-12 20:40:22 +01:00
|
|
|
r = ((((float)N_MAX) / ((float)nAvg)) - 1.0) * R_REF;
|
2019-02-04 10:03:10 +01:00
|
|
|
}
|
2019-02-12 20:40:22 +01:00
|
|
|
float t = ((r / PT1000_R0) - 1) / PT1000_Coeff;
|
2019-02-04 10:03:10 +01:00
|
|
|
|
|
|
|
uint8_t temperature = (t < 0) ? 0 : ((uint8_t)t);
|
|
|
|
|
|
|
|
// do something with the temperature
|
|
|
|
patternSetTemperature(temperature);
|
|
|
|
|
|
|
|
averagingCnt = 0;
|
|
|
|
averagingSum = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-09 17:54:18 +01:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2019-02-11 13:25:20 +01:00
|
|
|
void measureStartConversion() {
|
|
|
|
ADC10CTL0 |= ENC | ADC10SC;
|
|
|
|
schAdd(measureCollectAndProcessConversion, NULL, MEASURE_FETCH_RESULT_DELAY, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-02-09 17:54:18 +01:00
|
|
|
void measureInit() {
|
2019-02-12 11:33:01 +01:00
|
|
|
ADC10CTL0 = SREF_0 | ADC10SHT_3 | ADC10SR | ADC10ON;
|
2019-02-09 17:54:18 +01:00
|
|
|
ADC10CTL1 = INCH_0;
|
|
|
|
ADC10AE0 = BIT0;
|
|
|
|
|
2019-02-11 13:25:20 +01:00
|
|
|
schAdd(measureStartConversion, NULL, 0, 100);
|
|
|
|
// schAdd(measureTestExec, NULL, 0, 10000);
|
2019-02-09 17:54:18 +01:00
|
|
|
}
|
|
|
|
|
2019-02-04 10:03:10 +01:00
|
|
|
|