Estoy jugando con una placa Nucleo-F103RB STM32 y estoy tratando de medir la temperatura ambiente utilizando su sensor interno. Activo el ADC y obtengo datos normalmente a través de la función HAL_ADC_GetValue()
(el valor es alrededor de 1700 - 1800 y varía con la temperatura como debería), pero el problema es que obtengo números realmente extraños al convertir a Celsius usando la fórmula dada en manual, a saber: $$ \ frac {V_ {25} - V_ {ADC}} {AvgSlope} + 25 $$ (aproximadamente 70-80 grados cuando la temperatura real no es más que 25).
Sospecho que tiene que ver con la forma en que estoy convirtiendo el valor de ADC en voltios, pero obviamente no puedo ver algo malo, así que vine a preguntar aquí.
El código está aquí:
#include "TempMsr.h"
volatile uint32_t sensorData = 0;
volatile uint32_t temp = 0;
uint32_t getTemp(ADC_HandleTypeDef* ADCHandle)
{
sensorData = HAL_ADC_GetValue(ADCHandle);
temp = ((V25 * 1000 - sensorData * 0.8) / AVGSLOPE) + 25;
//V25 and sensorData must be in mV for this formula to work, as the
//AVGSLOPE value is given in mV/oC
//the 0.8 multiplication comes from dividing the max ADC voltage (3.3V) with its resolution (12 bits => 4096) which is 0.8mV/ADC unit
return temp;
}
Su archivo de cabecera:
#ifndef TEMPMSR_H_
#define TEMPMSR_H_
#include "stm32f1xx_hal.h"
#define AVGSLOPE 4.3
//average slope of T-V chart according to datasheet pg 79
//(min is 4 mV/C, max 4.6, default (4.3): typical)
#define V25 1.43
//voltage of temperature sensor at 25C according to datasheet pg 79 (in V)
//(min is 1.34, max is 1.52, default(1.43): typical)
uint32_t getTemp(ADC_HandleTypeDef* ADCHandle);
#endif /* TEMPMSR_H_ */
Gracias de antemano!
EDITAR: Acabo de notar en el manual de referencia que el sensor tiene un sesgo (de hasta + - 45 grados) debido al proceso de fabricación, que es diferente en cada chip y no tengo ninguno Lo calculé para mi MCU particular, ni lo incluí en la fórmula. ¿Podría ser este el problema?