/* * thermometer.c * * Created on: Jun 13, 2017 * Author: wn */ #include "stm32f1xx_hal.h" #include "thermometer.h" #include extern ADC_HandleTypeDef hadc1; #define NUM_OF_CONV 10 uint16_t adcBuf[NUM_OF_CONV]; volatile uint32_t value; const float R_REF = 1000.0; const uint16_t N_MAX = 4095; const float PT1000_R0 = 1000.0; const float PT1000_Coeff = 3.85e-3; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { HAL_ADC_Stop_DMA(hadc); uint32_t sum = 0; for (uint8_t i = 0; i < NUM_OF_CONV; i++) { sum += adcBuf[i]; } uint32_t avg = sum / NUM_OF_CONV; value = avg; } void thermometerStartCycle(void *handle) { HAL_ADC_Start_DMA(&hadc1, ((uint32_t*)adcBuf), NUM_OF_CONV); } void thermometerInit() { HAL_ADCEx_Calibration_Start(&hadc1); schAdd(thermometerStartCycle, NULL, 0, 100); } uint32_t thermometerGetValue() { float r = R_REF / ((((float)N_MAX) / ((float)value)) - 1.0); float t = ((r / PT1000_R0) - 1) / PT1000_Coeff; uint32_t tn = (t < 0) ? 0 : (uint16_t)t; return tn; }