Sergii Kaplia
/
Internal_Temperature_F103RB1
test
main.cpp@4:f5c604b5eceb, 2016-03-29 (annotated)
- Committer:
- hudakz
- Date:
- Tue Mar 29 16:51:33 2016 +0000
- Revision:
- 4:f5c604b5eceb
- Parent:
- 2:bd6594739176
- Child:
- 5:27071c2166bb
Comments added.
Who changed what in which revision?
User | Revision | Line number | New 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 | 4:f5c604b5eceb | 13 | const float V25 = 1.43; // sensor's 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 | 2:bd6594739176 | 18 | DigitalOut led(LED1); |
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 | 0:dfdf46225b14 | 25 | void MX_ADC1_Init(void) { |
hudakz | 0:dfdf46225b14 | 26 | ADC_ChannelConfTypeDef sConfig; |
hudakz | 0:dfdf46225b14 | 27 | |
hudakz | 0:dfdf46225b14 | 28 | /**Common config |
hudakz | 0:dfdf46225b14 | 29 | */ |
hudakz | 0:dfdf46225b14 | 30 | hadc1.Instance = ADC1; |
hudakz | 0:dfdf46225b14 | 31 | hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; |
hudakz | 0:dfdf46225b14 | 32 | hadc1.Init.ContinuousConvMode = DISABLE; |
hudakz | 0:dfdf46225b14 | 33 | hadc1.Init.DiscontinuousConvMode = DISABLE; |
hudakz | 0:dfdf46225b14 | 34 | hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; |
hudakz | 0:dfdf46225b14 | 35 | hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; |
hudakz | 0:dfdf46225b14 | 36 | hadc1.Init.NbrOfConversion = 1; |
hudakz | 0:dfdf46225b14 | 37 | HAL_ADC_Init(&hadc1); |
hudakz | 0:dfdf46225b14 | 38 | |
hudakz | 0:dfdf46225b14 | 39 | /**Configure Regular Channel |
hudakz | 0:dfdf46225b14 | 40 | */ |
hudakz | 0:dfdf46225b14 | 41 | sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; |
hudakz | 0:dfdf46225b14 | 42 | sConfig.Rank = 1; |
hudakz | 0:dfdf46225b14 | 43 | sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; |
hudakz | 0:dfdf46225b14 | 44 | HAL_ADC_ConfigChannel(&hadc1, &sConfig); |
hudakz | 0:dfdf46225b14 | 45 | } |
hudakz | 0:dfdf46225b14 | 46 | |
hudakz | 0:dfdf46225b14 | 47 | int main() { |
hudakz | 4:f5c604b5eceb | 48 | MX_ADC1_Init(); // initialize AD convertor |
hudakz | 4:f5c604b5eceb | 49 | while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK); // calibrate AD convertor |
hudakz | 0:dfdf46225b14 | 50 | |
hudakz | 0:dfdf46225b14 | 51 | while(1) { |
hudakz | 4:f5c604b5eceb | 52 | HAL_ADC_Start(&hadc1); // start analog to digital conversion |
hudakz | 4:f5c604b5eceb | 53 | while(HAL_ADC_PollForConversion(&hadc1, 1000000) != HAL_OK);// wait for completing the conversion |
hudakz | 4:f5c604b5eceb | 54 | adcValue = HAL_ADC_GetValue(&hadc1); // read sensor's digital value |
hudakz | 4:f5c604b5eceb | 55 | vSense = adcValue * ADC_TO_VOLT; // convert sensor's digital value to voltage [V] |
hudakz | 2:bd6594739176 | 56 | /* |
hudakz | 2:bd6594739176 | 57 | * STM32F103xx Reference Manual: |
hudakz | 2:bd6594739176 | 58 | * 11.10 Temperature sensor |
hudakz | 2:bd6594739176 | 59 | * Reading the temperature, Page 235 |
hudakz | 4:f5c604b5eceb | 60 | * Temperature (in °C) = {(V25 - Vsense) / Avg_Slope} + 25 |
hudakz | 2:bd6594739176 | 61 | */ |
hudakz | 4:f5c604b5eceb | 62 | temp = (V25 - vSense) / AVG_SLOPE + 25.0f; // convert sensor's output voltage to temperature [°C] |
hudakz | 4:f5c604b5eceb | 63 | pc.printf("temp = %3.1f%cC\n", temp, 176); // display chip's temperature [°C] |
hudakz | 2:bd6594739176 | 64 | led = !led; |
hudakz | 0:dfdf46225b14 | 65 | wait_ms(1000); |
hudakz | 0:dfdf46225b14 | 66 | } |
hudakz | 0:dfdf46225b14 | 67 | } |