Direcciones de calibración del sensor de temperatura STM32F103

1

Soy nuevo en el mundo ARM y uso el microcontrolador ARM STM32F103C8T6. Quiero hacer funcionar el sensor de temperatura interno del micro. Puedo obtener algunos datos pero no estoy seguro de cómo convertir estos números en temperatura. Lo busqué y descubrí que hay dos direcciones de solo lectura en la memoria que mantienen los números de calibración de fábrica a 30 y 110 grados.

El problema es que no hay nada al respecto en hoja de datos o Manual de referencia . Sólo hay algunos mínimos y máximos para los parámetros. Creo que usar el promedio de estos valores puede afectar la precisión. Así que estoy confundido. ¿Cómo debo hacer esta conversión? ¿Necesito estos datos de calibración de fábrica? ¿Tengo que calibrar automáticamente el ADC en este caso?

Aquí está el código que usé hasta ahora:

 #include "stm32f103xb.h"
 int main(void)
{

// Select a clock source for ADC


RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;     // Enable ADC1 to use APB2 BUS
RCC->CR |= RCC_CR_HSION;  // set the internal clock on (8MHz)
while((RCC->CR & RCC_CR_HSIRDY) == 0){}     // wait until HSI is ready

RCC->CFGR &= ~(RCC_CFGR_HPRE);  // set AHB prescaler to 1
RCC->CFGR &= ~(RCC_CFGR_PPRE2); // set APB2 prescaler to 1 (PCLK2)
RCC->CFGR |= RCC_CFGR_ADCPRE;   // use ADC prescaler

// Select a Sampling rate
ADC1->SMPR1 |= ADC_SMPR1_SMP16;
ADC1->SQR3 |= ADC_SQR3_SQ1_4; //set to convert the channel 16 fitst

// enable temperature sensor
ADC1->CR2 |= ADC_CR2_TSVREFE;

// ADC Calibration
// Power up the ADC and then Calibrate it
ADC1->CR2 |= ADC_CR2_ADON | ADC_CR2_CAL | ADC_CR2_CONT;
// wait until the calibration is completed and reseted
while((ADC1->CR2 & ADC_CR2_CAL) == 1){}


while(1)
{
    // Start 
    ADC1->CR2 |= ADC_CR2_ADON;
    while((ADC1->SR & ADC_SR_EOC) == 0){} // wait for end of conversion
    // Print the results on LCD
    LCDSendInstruction(LCD_CLEAR);
    LCDSendInteger(ADC1->DR,8);

}
}

Gracias de antemano: D

    
pregunta dub-dub

2 respuestas

4

La biblioteca STM32Cube para su pieza incluye una o dos macros auxiliares para calcular la temperatura a partir de una lectura ADC del sensor de temperatura interno. El Manual del usuario para los controladores HAL y de capa baja (LL) describe estas macros. La implementación difiere de una familia STM32 a otra, así que asegúrese de obtener la información para su parte en particular. Incluso si no va a utilizar la biblioteca STM32Cube, puede consultar el código fuente para ver un ejemplo de cómo se implementan las macros de temperatura.

Las dos macros son __LL_ADC_CALC_TEMPERATURE y __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS .

Algunas piezas STM32 tienen valores de calibración de temperatura que se miden durante la fabricación del dispositivo y se programan en la ROM. Estas partes utilizan la macro __LL_ADC_CALC_TEMPERATURE . Esta macro utiliza los valores de calibración de la ROM para mejorar la precisión de la medición de temperatura.

Otras piezas STM32 no tienen valores de calibración de temperatura en la ROM. Estas partes utilizan la macro __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS . Esta macro utiliza los valores "típicos" para Avg_Slope y V25 tomados de la hoja de datos del dispositivo.

Creo que la familia STM32F1 no tiene valores de calibración de temperatura en la ROM, por lo que utilizaría __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS con los parámetros típicos de la hoja de datos del dispositivo.

Si desea mejorar las lecturas de temperatura, puede calibrar cada una de sus unidades durante la producción y almacenar los valores de calibración personalizados para Avg_Slope y V25 en la ROM. Luego sustituya sus valores de calibración personalizados por los valores típicos de la hoja de datos.

    
respondido por el kkrambo
2

Si está buscando alguna referencia sobre cómo usar el sensor de temperatura, esto puede ayudarte. ¡Las páginas 234 y 235 tienen lo que estás buscando!

Para completar la respuesta, cito el uso como se describe en el documento

  

Leyendo la temperatura

     

Para usar el sensor:

     
  1. Seleccione el canal de entrada ADCx_IN16.
  2.   
  3. Seleccione un tiempo de muestra de 17.1 µs
  4.   
  5. Establezca el bit TSVREFE en el registro de control ADC 2 (ADC_CR2) para activar el   Sensor de temperatura del modo de apagado.
  6.   
  7. Inicie la conversión de ADC configurando el bit ADON (o mediante un activador externo).
  8.   
  9. Lea los \ $ V_ {SENSE} \ $ datos resultantes en el registro de datos ADC
  10.   
  11. Obtenga la temperatura usando la siguiente fórmula:
  12.   

\ $ Temperatura (en ° C) = {(V_ {25} - V_ {SENSE}) / Avg_ {Slope}} + 25 \ $

     

Donde, \ $ V_ {25} = V_ {SENSE} \ $ valor para 25 ° C y

     

Avg_Slope = Pendiente promedio para la curva entre la temperatura y VSENSE (dado en   mV / ° C o µV / ° C).

Finalmente, ¡tenga cuidado con el efecto sobre la precisión de las lecturas debido al calor generado por el propio procesador!

EDITAR: las constantes tienen un rango porque se ven afectadas por las variaciones de calor en el propio procesador. Por lo tanto, si está buscando resultados muy precisos, es mejor utilizar un sensor externo. O tiene que calcular empíricamente las variaciones de temperatura del procesador con respecto al sensor de temperatura. No creo que haya información disponible relacionada con esto y tenga en cuenta que la fórmula anterior es solo una aproximación lineal.

    
respondido por el charansai

Lea otras preguntas en las etiquetas