sensor de temperatura STM32L011 - salida casi constante

0

Estoy tratando de usar el sensor de temperatura interno de STM32L011 (placa Nucleo-32), pero obtengo una lectura casi constante (código ADC) en el rango de 100-120 (decimal) que cambia poco o nada con la temperatura (I he intentado presionar un soldador contra el chip y el spray para congelar). Por otro lado, la medición de Vcc interna funciona bien.

Mi TS_CAL2 es 928 (decimal), aunque no lo estoy usando todavía para nada.

Mi código:

void adc_init(void){
RCC_APB2ENR |= BIT9; // Turn on ADC
ADC_CFGR2 = BIT31/*CKMODE1*/ | BIT30/*CKMODE0*/; //ADC clock is PCLK/1

ADC_CCR = BIT25/*LFMEN*/; //low frequency mode (ADC is clocked from APB 2MHz)
ADC_CCR |= BIT22/*VREFEN*/; //enable reference voltage

ADC_IER |= BIT11 /*EOCALIE*/ | BIT2 /*EOCIE*/; //enable interrupts for end of calibration and end of conversion
ISER = BIT12; //enable ADC interrupt vector in NVIC

ADC_CR = BIT31; //start ADC calibration
cpu_sleep(); //ISR should wake up the CPU when calibration is done
while ((ADC_CR & BIT31)); //wait for calibration complete (in case something else woke up the CPU)

ADC_CR |= BIT0; //enable ADC
}

uint32_t adc_get_temperature(void){
ADC_CCR |= BIT23/*TSEN*/; //enable internal temperature sensor
ADC_CCR |= BIT22/*VREFEN*/; //enable internal voltage reference
ADC_CHSELR = BIT18; //select channel 18 (internal voltage sensor)
ADC_CR |=  BIT2/*ADSTART*/; //trigger a conversion

cpu_sleep(); //ISR should wake up the CPU

while ( (ADC_CR & BIT2) ); //wait for end of conversion (in case something else woke up the CPU)
uint32_t conversion_result = ADC_DR;

return conversion_result;
}
    
pregunta filo

2 respuestas

1

Gracias por tu ayuda. Al final, fue un problema de temporización: el tiempo de muestreo en ADC_SMPR fue demasiado corto y también en el encendido no esperé lo suficiente para que el sensor de temperatura se estabilice. Funciona bien ahora.

    
respondido por el filo
2

Le recomendaría que eche un vistazo a los ejemplos de stm32 ( STM32CubeL0 ):

Tienen un ejemplo de cómo leer el sensor de temperatura interno. Están utilizando la biblioteca HAL, pero puede volver a rastrear fácilmente el código para que comprenda qué registros se están configurando y en qué orden.

    
respondido por el staringlizard

Lea otras preguntas en las etiquetas