Simple test program to get familiar with functionality of MBED RTOS on ST Nucleo-F411RE. Tasks for LED blinking, user button, temperature measurement with DS1620, temperature measurement with internal temperature sensor of ST32F411RE, ultrasonic distance measurement and displaying result on 16x2 TextLCD.
Dependencies: DS1620_improved TextLCD_improved mbed-rtos mbed
Diff: tsk_inttemp.cpp
- Revision:
- 17:94c385ff2641
- Child:
- 18:be0130c42925
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsk_inttemp.cpp Fri Dec 18 15:23:21 2015 +0000 @@ -0,0 +1,73 @@ +#include "mbed.h" +#include "rtos.h" +#include "stm32f411xe.h" + +#include "tsk_main.h" +#include "tsk_inttemp.h" + + +struct int_temp_data_struct int_temp_data = { 0 }; + + +uint32_t initIntTemp(void const *args) { + + int_temp_data.temperature = 0.0f; + + //enable ADC1 clock + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN); + + // ADC on + SET_BIT(ADC1->CR2, ADC_CR2_ADON); + CLEAR_BIT(ADC1->CR2, ADC_CR2_CONT); + + // Temp sensor on + CLEAR_BIT(ADC->CCR, ADC_CCR_VBATE); + SET_BIT(ADC->CCR, ADC_CCR_TSVREFE); + + CLEAR_BIT(ADC1->CR1, ADC_CR1_RES); + + return 1; +} + +static uint16_t getADCTemp() { + // Set channel + ADC1->SQR1 &= ~ADC_SQR1_L; // Count = 1 + ADC1->SQR3 |= ADC_SQR3_SQ1 & 18; + + // Start conversion + SET_BIT(ADC1->CR2, ADC_CR2_SWSTART); + + // Wait for completion + while (!READ_BIT(ADC1->SR, ADC_SR_EOC)) + ; + + // Return result + return READ_REG(ADC1->DR); +} + + +void inttemp_thread(void const *args) { + + const float V25 = 943.3212f;// when V25=1.41V at ref 3.3V (0,76V) + const float Avg_Slope = 3.1030303f; //when avg_slope=4.3mV/C at ref 3.3V (2.5mV/C) + const uint16_t bufferSize = 4; + + float temp; + uint16_t i; + uint16_t uiCnt = 0; + + + while (true) { + for (i = 0, temp = 0.0f; i < bufferSize; i++) { + temp += ((float)getADCTemp() - V25) / Avg_Slope + 48.2f; + Thread::wait(100); + } + temp /= (float)bufferSize; + + mutexIntTemp.lock(); + int_temp_data.temperature = temp; + mutexIntTemp.unlock(); + + Thread::wait(5000); + } +}