123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /*
- * stm32_temperature.c
- *
- * Created on: 07.11.2023
- * Author: balbekova
- */
- #include "common_config.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include <stm32f4xx.h>
- #include <stm32f4xx_rcc.h>
- #include <stm32f4xx_adc.h>
- #include "megatec.h"
- #ifdef PRINTF_STDLIB
- #include <stdio.h>
- #endif
- #ifdef PRINTF_CUSTOM
- #include "tinystdio.h"
- #endif
- #include <string.h>
- #include <stdlib.h>
- #define DBG if (0)
- #define TEMPERATURE_SHIFT 15
- void adc_init() {
- ADC_InitTypeDef ADC_InitStruct;
- ADC_CommonInitTypeDef ADC_CommonInitStruct;
- /* сбрасываем настройки АЦП */
- ADC_DeInit();
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
- ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
- ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div8;
- ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
- ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
- ADC_CommonInit(&ADC_CommonInitStruct);
- ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
- ADC_InitStruct.ADC_ScanConvMode = DISABLE;
- ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
- ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
- ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
- ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStruct.ADC_NbrOfConversion = 1;
- ADC_Init(ADC1, &ADC_InitStruct);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_144Cycles);
- ADC_TempSensorVrefintCmd(ENABLE);
- ADC_Cmd(ADC1, ENABLE);
- }
- u16 readADC1(u8 channel){
- // начинаем работу
- ADC_SoftwareStartConv(ADC1);
- // ждём пока преобразуется напряжение в код
- while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
- // возвращаем результат
- return ADC_GetConversionValue(ADC1);
- }
- //void stm32_temperature_meas(void)
- void stm32_temperature_meas(void *params)
- {
- float adc_temperature;
- for (;;) {
- adc_temperature = readADC1(16);
- adc_temperature *= 3300;
- adc_temperature /= 0xfff; //Reading in mV
- adc_temperature /= 1000.0; //Reading in Volts
- adc_temperature -= 0.760; // Subtract the reference voltage at 25°C
- adc_temperature /= .0025; // Divide by slope 2.5mV
- adc_temperature += 25.0; // Add the 25°C
- UPS.temp_stm32 = adc_temperature - TEMPERATURE_SHIFT;
- printf("stm32_temperature %0.1f\r\n", UPS.temp_stm32);
- vTaskDelay(5000);
- }
- }
- void stm32_temperature_init(void)
- {
- adc_init();
- xTaskCreate(stm32_temperature_meas, ( char * ) "stm32_temperature_meas", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
- }
|