adc.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include "adc.h"
  2. #include "common.h"
  3. #include "FreeRTOS.h"
  4. #include "task.h"
  5. #include "semphr.h"
  6. #ifdef PRINTF_STDLIB
  7. #include <stdio.h>
  8. #endif
  9. #ifdef PRINTF_CUSTOM
  10. #include "tinystdio.h"
  11. #endif
  12. SemaphoreHandle_t adc_raw_data_semphr;
  13. // here raw values will be put by DMA
  14. static volatile uint16_t adc_raw[ADC_TOTAL_COUNT] = {0};
  15. // Сырые данные АЦП канала
  16. uint16_t adc_mv_raw(adc_chan_t chan)
  17. {
  18. return adc_raw[chan];
  19. }
  20. // Данные АЦП канала в мВ
  21. uint16_t adc_mv(adc_chan_t chan)
  22. {
  23. return (((uint32_t)adc_raw[chan]) * VREF) >> 12;
  24. }
  25. //
  26. void adc_init(void)
  27. {
  28. adc_raw_data_semphr = xSemaphoreCreateBinary();
  29. adc_gpio_init();
  30. adc_dma_init();
  31. adc_init_base();
  32. adc_timer_init();
  33. adc_tim_set(TRUE);
  34. }
  35. //
  36. void adc_init_base(void)
  37. {
  38. adc_base_config_type adc_base_struct;
  39. crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  40. crm_adc_clock_div_set(CRM_ADC_DIV_2);
  41. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  42. nvic_irq_enable(ADC1_2_IRQn, 5, 0);
  43. //NVIC_SetPriority(ADC1_2_IRQn, 5);
  44. // select combine mode
  45. adc_combine_mode_select(ADC_INDEPENDENT_MODE);
  46. adc_base_default_para_init(&adc_base_struct);
  47. adc_base_struct.sequence_mode = TRUE;
  48. adc_base_struct.repeat_mode = FALSE;
  49. adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
  50. adc_base_struct.ordinary_channel_length = 3;
  51. adc_base_config(ADC1, &adc_base_struct);
  52. adc_ordinary_channel_set(ADC1, ADC_CHANNEL_9, 1, ADC_SAMPLETIME_239_5);
  53. adc_ordinary_channel_set(ADC1, ADC_CHANNEL_10, 2, ADC_SAMPLETIME_239_5);
  54. adc_ordinary_channel_set(ADC1, ADC_CHANNEL_16, 3, ADC_SAMPLETIME_239_5);
  55. adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
  56. adc_dma_mode_enable(ADC1, TRUE);
  57. adc_tempersensor_vintrv_enable(TRUE);
  58. adc_flag_clear(ADC1, ADC_CCE_FLAG);
  59. adc_interrupt_enable(ADC1, ADC_CCE_INT, TRUE);
  60. adc_enable(ADC1, TRUE);
  61. adc_calibration_init(ADC1);
  62. while(adc_calibration_init_status_get(ADC1));
  63. adc_calibration_start(ADC1);
  64. while(adc_calibration_status_get(ADC1));
  65. }
  66. //
  67. void adc_gpio_init(void)
  68. {
  69. gpio_init_type gpio_initstructure;
  70. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  71. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  72. crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
  73. crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
  74. gpio_default_para_init(&gpio_initstructure);
  75. // Vbat
  76. gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;
  77. gpio_initstructure.gpio_pins = GPIO_PINS_1;
  78. gpio_init(GPIOB, &gpio_initstructure);
  79. // check 220
  80. gpio_initstructure.gpio_pins = GPIO_PINS_0;
  81. gpio_init(GPIOC, &gpio_initstructure);
  82. gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  83. gpio_initstructure.gpio_pull = GPIO_PULL_NONE;
  84. gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  85. gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  86. gpio_initstructure.gpio_pins = GPIO_PINS_11;
  87. gpio_init(GPIOD, &gpio_initstructure);
  88. // Установка пина подключает измерительную цепь. Цепь подключена всегда.
  89. gpio_bits_set(GPIOD, GPIO_PINS_11);
  90. }
  91. //
  92. void adc_timer_init(void)
  93. {
  94. crm_clocks_freq_type crm_clocks_freq_struct = {0};
  95. crm_periph_clock_enable(CRM_TMR7_PERIPH_CLOCK, TRUE);
  96. crm_clocks_freq_get(&crm_clocks_freq_struct);
  97. tmr_base_init(TMR7, 999, (crm_clocks_freq_struct.ahb_freq / 10000) - 1);
  98. tmr_cnt_dir_set(TMR7, TMR_COUNT_UP);
  99. tmr_flag_clear(TMR7, TMR_OVF_FLAG);
  100. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  101. nvic_irq_enable(TMR7_GLOBAL_IRQn, 5, 0);
  102. tmr_counter_enable(TMR7, FALSE);
  103. tmr_interrupt_enable(TMR7, TMR_OVF_INT, TRUE);
  104. }
  105. //
  106. void adc_tim_set(confirm_state state)
  107. {
  108. //tmr_counter_enable(TMR7, state);
  109. //tmr_interrupt_enable(TMR7, TMR_OVF_INT, state);
  110. tmr_counter_enable(TMR7, state);
  111. }
  112. //
  113. void adc_dma_init(void)
  114. {
  115. dma_init_type dma_init_struct;
  116. crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
  117. dma_reset(DMA1_CHANNEL1);
  118. dma_default_para_init(&dma_init_struct);
  119. dma_init_struct.buffer_size = 3;
  120. dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  121. dma_init_struct.memory_base_addr = (uint32_t)adc_raw;
  122. dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
  123. dma_init_struct.memory_inc_enable = TRUE;
  124. dma_init_struct.peripheral_base_addr = (uint32_t)&(ADC1->odt);
  125. dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
  126. dma_init_struct.peripheral_inc_enable = FALSE;
  127. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  128. dma_init_struct.loop_mode_enable = TRUE;
  129. dma_init(DMA1_CHANNEL1, &dma_init_struct);
  130. dma_flexible_config(DMA1, FLEX_CHANNEL1, DMA_FLEXIBLE_ADC1);
  131. dma_channel_enable(DMA1_CHANNEL1, TRUE);
  132. }
  133. //
  134. void ADC1_2_IRQHandler(void)
  135. {
  136. static uint8_t empty = 0;
  137. static BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  138. adc_flag_clear(ADC1, ADC_CCE_FLAG);
  139. if (empty > 3) {
  140. xSemaphoreGiveFromISR(adc_raw_data_semphr, &xHigherPriorityTaskWoken);
  141. }
  142. else
  143. empty++;
  144. #if 0
  145. Ubat = ADC_UBAT_FACTOR*(float)adc1_ordinary_valuetab[0]*ADC_VREF/4096.0;
  146. check_220 = ((float)adc1_ordinary_valuetab[1]*ADC_VREF/4096.0)/CONST_RESISTOR_DEVIDER;
  147. temperature = (ADC_TEMP_BASE - (float)adc1_ordinary_valuetab[2]*ADC_VREF/4096.0)/ADC_TEMP_SLOPE + 25.0;
  148. printf("Ubat: %f ", Ubat);
  149. printf("check 220V: %f ", check_220);
  150. printf("temper: %.2f ", temperature);
  151. #endif
  152. #if 0
  153. printf("Ubat: %u \r\n", adc_raw[0]);
  154. printf("check 220V: %u \r\n", adc_raw[1]);
  155. printf("temper: %.2u \r\n\n", adc_raw[2]);
  156. #endif
  157. }
  158. //
  159. void TMR7_GLOBAL_IRQHandler(void)
  160. {
  161. if(tmr_flag_get(TMR7, TMR_OVF_FLAG) != RESET)
  162. {
  163. tmr_flag_clear(TMR7, TMR_OVF_FLAG);
  164. adc_ordinary_software_trigger_enable(ADC1, TRUE);
  165. }
  166. }