stm32_temperature.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * stm32_temperature.c
  3. *
  4. * Created on: 07.11.2023
  5. * Author: balbekova
  6. */
  7. #include "common_config.h"
  8. #include "FreeRTOS.h"
  9. #include "task.h"
  10. #include <stm32f4xx.h>
  11. #include <stm32f4xx_rcc.h>
  12. #include <stm32f4xx_adc.h>
  13. #include "megatec.h"
  14. #ifdef PRINTF_STDLIB
  15. #include <stdio.h>
  16. #endif
  17. #ifdef PRINTF_CUSTOM
  18. #include "tinystdio.h"
  19. #endif
  20. #include <string.h>
  21. #include <stdlib.h>
  22. #define DBG if (0)
  23. #define TEMPERATURE_SHIFT 15
  24. void adc_init() {
  25. ADC_InitTypeDef ADC_InitStruct;
  26. ADC_CommonInitTypeDef ADC_CommonInitStruct;
  27. /* сбрасываем настройки АЦП */
  28. ADC_DeInit();
  29. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  30. ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
  31. ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div8;
  32. ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  33. ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  34. ADC_CommonInit(&ADC_CommonInitStruct);
  35. ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  36. ADC_InitStruct.ADC_ScanConvMode = DISABLE;
  37. ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
  38. ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  39. ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  40. ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  41. ADC_InitStruct.ADC_NbrOfConversion = 1;
  42. ADC_Init(ADC1, &ADC_InitStruct);
  43. ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_144Cycles);
  44. ADC_TempSensorVrefintCmd(ENABLE);
  45. ADC_Cmd(ADC1, ENABLE);
  46. }
  47. u16 readADC1(u8 channel){
  48. // начинаем работу
  49. ADC_SoftwareStartConv(ADC1);
  50. // ждём пока преобразуется напряжение в код
  51. while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
  52. // возвращаем результат
  53. return ADC_GetConversionValue(ADC1);
  54. }
  55. //void stm32_temperature_meas(void)
  56. void stm32_temperature_meas(void *params)
  57. {
  58. float adc_temperature;
  59. for (;;) {
  60. adc_temperature = readADC1(16);
  61. adc_temperature *= 3300;
  62. adc_temperature /= 0xfff; //Reading in mV
  63. adc_temperature /= 1000.0; //Reading in Volts
  64. adc_temperature -= 0.760; // Subtract the reference voltage at 25°C
  65. adc_temperature /= .0025; // Divide by slope 2.5mV
  66. adc_temperature += 25.0; // Add the 25°C
  67. UPS.temp_stm32 = adc_temperature - TEMPERATURE_SHIFT;
  68. printf("stm32_temperature %0.1f\r\n", UPS.temp_stm32);
  69. vTaskDelay(5000);
  70. }
  71. }
  72. void stm32_temperature_init(void)
  73. {
  74. adc_init();
  75. xTaskCreate(stm32_temperature_meas, ( char * ) "stm32_temperature_meas", configMINIMAL_STACK_SIZE * 2, NULL, tskIDLE_PRIORITY, NULL);
  76. }