STM32 MCU - El sensor de temperatura da valores extraños

2

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?

    
pregunta lightspot21

4 respuestas

1

No soy experto en C, tal vez

Tienes que analizar uint para flotar, luego calcular, luego analizar nuevamente a uint, si el resultado tiene que ser uint.

{
    sensorData = HAL_ADC_GetValue(ADCHandle);
    temp = (uint32_t)(((V25 * 1000.0 - (float)sensorData * 0.8) / AVGSLOPE) + 25.0);

    //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;
}
    
respondido por el Marko Buršič
0

Un sensor de temperatura en chip no va a medir la temperatura del aire ambiente, va a medir la temperatura del chip del que forma parte. Un sensor de temperatura integrado en un microcontrolador mide la temperatura del microcontrolador, que debería ser significativamente más alta que la temperatura del aire ambiente si el microcontrolador está haciendo algún trabajo.

    
respondido por el Elliot Alderson
0

Habiendo hecho anteriormente la detección de temperatura en un STM32, tengo una razón para creer que la fórmula es incorrecta, mientras que una documentación anterior del STM32F207 tenía la fórmula correcta.

Como la pendiente es positiva, las mediciones más grandes (valor ADC o voltaje) significan una temperatura más grande. Así que la fórmula debería tener (Vadc-V25), no (V25-Vadc).

Aún su punto en las compensaciones es válido. La medición V25 tiene una tolerancia de +/- 90 mV que se calcula a una tolerancia de alrededor de +/- 21 grados centígrados. La documentación de ST ha declarado que no es precisa para medir temperaturas absolutas sin calibración, mientras que puede usarse para rastrear cambios en la temperatura. En la práctica, ha sido lo suficientemente preciso sin calibración para controlar un ventilador para evitar que un producto se sobrecaliente.

    
respondido por el Justme
0

En STM32F0 y STM32L4 con los que estamos trabajando en este momento, el sensor de temperatura interno está precalibrado durante la producción y también se puede calibrar durante el tiempo de funcionamiento con la referencia de voltaje interno.

El cálculo de la temperatura también es diferente del valor normal de adc al cálculo de voltaje porque incluye los valores de calibración.

Tal vez su controlador tenga la misma característica. La descripción debe estar disponible en el capítulo de ADC en el Manual de referencia. Yo diría que la resolución en nuestra aplicación es de +/- 1 grado.

    
respondido por el A.R.C.

Lea otras preguntas en las etiquetas