Reading temperature sensor built into STM32F103RB chips

Dependencies:   mbed

Committer:
hudakz
Date:
Mon Mar 28 08:14:41 2016 +0000
Revision:
2:bd6594739176
Parent:
1:09a5e83ea18f
Child:
4:f5c604b5eceb
Updated

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 2:bd6594739176 1 /*
hudakz 2:bd6594739176 2 * Reading built-in temperature sensor of STM32F103RB chip on NUCLEO-F103RB board
hudakz 2:bd6594739176 3 */
hudakz 0:dfdf46225b14 4
hudakz 0:dfdf46225b14 5 #include "mbed.h"
hudakz 0:dfdf46225b14 6
hudakz 2:bd6594739176 7 /*
hudakz 2:bd6594739176 8 * STM32F103x data-sheet:
hudakz 2:bd6594739176 9 * 5.3.19 Temperature sensor characteristics
hudakz 2:bd6594739176 10 * Table 50. TS characteristics, Page 80
hudakz 2:bd6594739176 11 */
hudakz 0:dfdf46225b14 12 const float AVG_SLOPE = 4.3E-03;
hudakz 0:dfdf46225b14 13 const float V25 = 1.43;
hudakz 0:dfdf46225b14 14 const float ACD_TO_VOLT = 3.3 / 4096;
hudakz 0:dfdf46225b14 15
hudakz 0:dfdf46225b14 16 Serial pc(USBTX, USBRX);
hudakz 2:bd6594739176 17 DigitalOut led(LED1);
hudakz 0:dfdf46225b14 18 ADC_HandleTypeDef hadc1;
hudakz 2:bd6594739176 19 uint16_t adcValue;
hudakz 0:dfdf46225b14 20 float temp;
hudakz 0:dfdf46225b14 21
hudakz 0:dfdf46225b14 22 /* ADC1 init function */
hudakz 0:dfdf46225b14 23 void MX_ADC1_Init(void) {
hudakz 0:dfdf46225b14 24 ADC_ChannelConfTypeDef sConfig;
hudakz 0:dfdf46225b14 25
hudakz 0:dfdf46225b14 26 /**Common config
hudakz 0:dfdf46225b14 27 */
hudakz 0:dfdf46225b14 28 hadc1.Instance = ADC1;
hudakz 0:dfdf46225b14 29 hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hudakz 0:dfdf46225b14 30 hadc1.Init.ContinuousConvMode = DISABLE;
hudakz 0:dfdf46225b14 31 hadc1.Init.DiscontinuousConvMode = DISABLE;
hudakz 0:dfdf46225b14 32 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hudakz 0:dfdf46225b14 33 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hudakz 0:dfdf46225b14 34 hadc1.Init.NbrOfConversion = 1;
hudakz 0:dfdf46225b14 35 HAL_ADC_Init(&hadc1);
hudakz 0:dfdf46225b14 36
hudakz 0:dfdf46225b14 37 /**Configure Regular Channel
hudakz 0:dfdf46225b14 38 */
hudakz 0:dfdf46225b14 39 sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
hudakz 0:dfdf46225b14 40 sConfig.Rank = 1;
hudakz 0:dfdf46225b14 41 sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
hudakz 0:dfdf46225b14 42 HAL_ADC_ConfigChannel(&hadc1, &sConfig);
hudakz 0:dfdf46225b14 43 }
hudakz 0:dfdf46225b14 44
hudakz 0:dfdf46225b14 45 int main() {
hudakz 0:dfdf46225b14 46 MX_ADC1_Init();
hudakz 0:dfdf46225b14 47 while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK);
hudakz 0:dfdf46225b14 48
hudakz 0:dfdf46225b14 49 while(1) {
hudakz 2:bd6594739176 50 /*
hudakz 2:bd6594739176 51 * STM32F103xx Reference Manual:
hudakz 2:bd6594739176 52 * 11.10 Temperature sensor
hudakz 2:bd6594739176 53 * Reading the temperature, Page 235
hudakz 2:bd6594739176 54 */
hudakz 0:dfdf46225b14 55 HAL_ADC_Start(&hadc1);
hudakz 1:09a5e83ea18f 56 while(HAL_ADC_PollForConversion(&hadc1, 1000000) != HAL_OK);
hudakz 0:dfdf46225b14 57 adcValue = HAL_ADC_GetValue(&hadc1);
hudakz 0:dfdf46225b14 58 temp = (V25 - adcValue * ACD_TO_VOLT) / AVG_SLOPE + 25.0f;
hudakz 0:dfdf46225b14 59 pc.printf("temp = %3.1f%cC\n", temp, 176);
hudakz 2:bd6594739176 60 led = !led;
hudakz 0:dfdf46225b14 61 wait_ms(1000);
hudakz 0:dfdf46225b14 62 }
hudakz 0:dfdf46225b14 63 }