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
tsk_inttemp.cpp
- Committer:
- Jan Tetour
- Date:
- 2015-12-18
- Revision:
- 18:be0130c42925
- Parent:
- 17:94c385ff2641
File content as of revision 18:be0130c42925:
/*
* TSK_INTTEMP.CPP
*/
#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);
}
}