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;
}