Direcciones de calibración del sensor de temperatura STM32F103

Soy nuevo en el mundo ARM y uso el microcontrolador ARM STM32F103C8T6. Quiero que funcione 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 contienen números de calibración de fábrica a 30 y 110 grados.

El problema es que no hay nada al respecto ni en la hoja de datos ni en el Manual de referencia . Solo 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 incluso estos datos de calibración de fábrica? ¿Tengo que autocalibrar 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

"Lo busqué y descubrí que hay dos direcciones de solo lectura en la memoria que contienen números de calibración de fábrica a 30 y 110 grados". ¿Dónde obtuvo esta información?
@BruceAbbott otras familias STM32 tienen estos números, indicados en su hoja de datos. Lo busqué y lo usan para obtener mejores resultados, mira esto

Respuestas (2)

La biblioteca STM32Cube por su parte incluye una o dos macros auxiliares para calcular la temperatura a partir de una lectura ADC del sensor de temperatura interno. El Manual de usuario de 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 pieza 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_TEMPERATUREy __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS.

Algunas piezas del 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 usan la __LL_ADC_CALC_TEMPERATUREmacro. Esta macro utiliza los valores de calibración de la ROM para mejorar la precisión de la medición de temperatura.

Otras piezas del STM32 no tienen valores de calibración de temperatura en la ROM. Estas partes usan la __LL_ADC_CALC_TEMPERATURE_TYP_PARAMSmacro. Esta macro utiliza los valores "típicos" Avg_Slopey los V25toma 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 los usaría __LL_ADC_CALC_TEMPERATURE_TYP_PARAMScon 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_Slopey V25en la ROM. Luego sustituya sus valores de calibración personalizados por los valores típicos de la hoja de datos.

Si solo está buscando alguna referencia sobre cómo usar el sensor de temperatura, ¡ esto podría ayudarlo! ¡Las páginas 234 y 235 tienen lo que estás buscando!

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

Lectura de la temperatura

Para usar el sensor:

  1. Seleccione el canal de entrada ADCx_IN16.
  2. Seleccione un tiempo de muestra de 17,1 µs
  3. Establezca el bit TSVREFE en el registro de control ADC 2 (ADC_CR2) para despertar el sensor de temperatura del modo de apagado.
  4. Inicie la conversión ADC configurando el bit ADON (o mediante un disparador externo).
  5. Leer el resultado V S mi norte S mi datos en el registro de datos ADC
  6. Obtenga la temperatura usando la siguiente fórmula:

T mi metro pag mi r a t tu r mi ( i norte ° C ) = ( V 25 V S mi norte S mi ) / A v gramo S yo o pag mi + 25

Dónde, V 25 = V S mi norte S mi valor para 25° C y

Avg_Slope = Pendiente promedio para la curva entre temperatura y VSENSE (dada 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. Entonces, si está buscando resultados muy precisos, es mejor que use un sensor externo. O hay que calcular empíricamente las variaciones de temperatura del procesador con respecto al sensor de temperatura. No creo que haya datos disponibles relacionados con esto y tenga en cuenta que la fórmula anterior es solo una aproximación lineal.

He leído esto, pero el problema es que las constantes en esta fórmula tienen un rango (especificado en la hoja de datos) y no un número único. ¿Cómo puedo determinar estas constantes con precisión?
@dub-dub Usaría los valores típicos de la hoja de datos. Si eso no es lo suficientemente bueno, debe realizar una calibración personalizada de cada unidad durante la fabricación y almacenar los valores personalizados en la ROM.