Reading temperature sensor built into STM32F103RB chips

Dependencies:   mbed

Committer:
hudakz
Date:
Tue Feb 05 13:28:38 2019 +0000
Revision:
5:27071c2166bb
Parent:
4:f5c604b5eceb
Updated.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 2:bd6594739176 1 /*
hudakz 4:f5c604b5eceb 2 * Reading built-in temperature sensor of STM32F103RB chip (on a 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 4:f5c604b5eceb 12 const float AVG_SLOPE = 4.3E-03; // slope (gradient) of temperature line function [V/°C]
hudakz 5:27071c2166bb 13 const float V25 = 1.43; // sensor's output voltage at 25°C [V]
hudakz 4:f5c604b5eceb 14 const float ADC_TO_VOLT = 3.3 / 4096; // conversion coefficient of digital value to voltage [V]
hudakz 4:f5c604b5eceb 15 // when using 3.3V ref. voltage at 12-bit resolution (2^12 = 4096)
hudakz 0:dfdf46225b14 16
hudakz 0:dfdf46225b14 17 Serial pc(USBTX, USBRX);
hudakz 5:27071c2166bb 18 DigitalOut led(PC_13);
hudakz 4:f5c604b5eceb 19 ADC_HandleTypeDef hadc1; // ADC handle
hudakz 4:f5c604b5eceb 20 uint16_t adcValue; // digital value of sensor
hudakz 4:f5c604b5eceb 21 float vSense; // sensor's output voltage [V]
hudakz 4:f5c604b5eceb 22 float temp; // sensor's temperature [°C]
hudakz 0:dfdf46225b14 23
hudakz 0:dfdf46225b14 24 /* ADC1 init function */
hudakz 5:27071c2166bb 25 void MX_ADC1_Init(void)
hudakz 5:27071c2166bb 26 {
hudakz 0:dfdf46225b14 27 ADC_ChannelConfTypeDef sConfig;
hudakz 0:dfdf46225b14 28
hudakz 0:dfdf46225b14 29 /**Common config
hudakz 0:dfdf46225b14 30 */
hudakz 0:dfdf46225b14 31 hadc1.Instance = ADC1;
hudakz 0:dfdf46225b14 32 hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hudakz 0:dfdf46225b14 33 hadc1.Init.ContinuousConvMode = DISABLE;
hudakz 0:dfdf46225b14 34 hadc1.Init.DiscontinuousConvMode = DISABLE;
hudakz 0:dfdf46225b14 35 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hudakz 0:dfdf46225b14 36 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hudakz 0:dfdf46225b14 37 hadc1.Init.NbrOfConversion = 1;
hudakz 0:dfdf46225b14 38 HAL_ADC_Init(&hadc1);
hudakz 0:dfdf46225b14 39
hudakz 0:dfdf46225b14 40 /**Configure Regular Channel
hudakz 0:dfdf46225b14 41 */
hudakz 0:dfdf46225b14 42 sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
hudakz 0:dfdf46225b14 43 sConfig.Rank = 1;
hudakz 0:dfdf46225b14 44 sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
hudakz 0:dfdf46225b14 45 HAL_ADC_ConfigChannel(&hadc1, &sConfig);
hudakz 0:dfdf46225b14 46 }
hudakz 0:dfdf46225b14 47
hudakz 5:27071c2166bb 48 int main()
hudakz 5:27071c2166bb 49 {
hudakz 4:f5c604b5eceb 50 MX_ADC1_Init(); // initialize AD convertor
hudakz 4:f5c604b5eceb 51 while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK); // calibrate AD convertor
hudakz 0:dfdf46225b14 52
hudakz 0:dfdf46225b14 53 while(1) {
hudakz 4:f5c604b5eceb 54 HAL_ADC_Start(&hadc1); // start analog to digital conversion
hudakz 4:f5c604b5eceb 55 while(HAL_ADC_PollForConversion(&hadc1, 1000000) != HAL_OK);// wait for completing the conversion
hudakz 4:f5c604b5eceb 56 adcValue = HAL_ADC_GetValue(&hadc1); // read sensor's digital value
hudakz 4:f5c604b5eceb 57 vSense = adcValue * ADC_TO_VOLT; // convert sensor's digital value to voltage [V]
hudakz 2:bd6594739176 58 /*
hudakz 2:bd6594739176 59 * STM32F103xx Reference Manual:
hudakz 2:bd6594739176 60 * 11.10 Temperature sensor
hudakz 2:bd6594739176 61 * Reading the temperature, Page 235
hudakz 4:f5c604b5eceb 62 * Temperature (in °C) = {(V25 - Vsense) / Avg_Slope} + 25
hudakz 2:bd6594739176 63 */
hudakz 4:f5c604b5eceb 64 temp = (V25 - vSense) / AVG_SLOPE + 25.0f; // convert sensor's output voltage to temperature [°C]
hudakz 4:f5c604b5eceb 65 pc.printf("temp = %3.1f%cC\n", temp, 176); // display chip's temperature [°C]
hudakz 2:bd6594739176 66 led = !led;
hudakz 0:dfdf46225b14 67 wait_ms(1000);
hudakz 0:dfdf46225b14 68 }
hudakz 0:dfdf46225b14 69 }