adc.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /**
  2. ******************************************************************************
  3. * @file VAPC-meter/lib/adc.c
  4. * @author "Vladimir N. Shilov" <shilow@ukr.net>
  5. * @version V1
  6. * @date 24-March-2016
  7. * @brief This file contains the ADC functions.
  8. ******************************************************************************
  9. */
  10. /* Includes ------------------------------------------------------------------*/
  11. #include "adc.h"
  12. /** @addtogroup ADC
  13. * @{
  14. */
  15. /* Private typedef -----------------------------------------------------------*/
  16. /* Private define ------------------------------------------------------------*/
  17. /* Private macro -------------------------------------------------------------*/
  18. /* Private variables ---------------------------------------------------------*/
  19. uint16_t ADC_Buffer[ADC_BUFFER_SIZE] = {0, 0, 0};
  20. uint16_t VoltageFastBuffer[FAST_BUFFER_SIZE];
  21. uint16_t CurrentFastBuffer[FAST_BUFFER_SIZE];
  22. uint16_t RefVoltFastBuffer[FAST_BUFFER_SIZE];
  23. /* Private constants ---------------------------------------------------------*/
  24. __near __no_init const unsigned char Factory_VREFINT @ 0x4910;
  25. /* Private function prototypes -----------------------------------------------*/
  26. static void ADC_Config(void);
  27. static void DMA_Config(void);
  28. static void TIM2_Config(void);
  29. /* Private functions ---------------------------------------------------------*/
  30. /**
  31. * @brief Initialize and start ADC
  32. * @param None
  33. * @retval None
  34. */
  35. void Init_ADC(void)
  36. {
  37. /* ADC configuration */
  38. ADC_Config();
  39. /* DMA configuration */
  40. DMA_Config();
  41. /* TIM2 configuration */
  42. TIM2_Config();
  43. }
  44. /**
  45. * @brief Configure ADC peripheral
  46. * @param None
  47. * @retval None
  48. */
  49. static void ADC_Config(void)
  50. {
  51. /* Enable ADC1 clock */
  52. CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
  53. /* Initialize and configure ADC1 */
  54. ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1);
  55. ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
  56. ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);
  57. /* Enable ADC1 */
  58. ADC_Cmd(ADC1, ENABLE);
  59. /* Enable ADC1 Voltage meter channel */
  60. ADC_ChannelCmd(ADC1, VOLTAGE_CHANNEL, ENABLE);
  61. ADC_SchmittTriggerConfig(ADC1, VOLTAGE_CHANNEL, DISABLE);
  62. /* Enable ADC1 Current meter channel */
  63. ADC_ChannelCmd(ADC1, CURRENT_CHANNEL, ENABLE);
  64. ADC_SchmittTriggerConfig(ADC1, CURRENT_CHANNEL, DISABLE);
  65. /* ADC Voltage Reference */
  66. ADC_VrefintCmd(ENABLE);
  67. /* Enable ADC1 Vrefint Channel */
  68. ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);
  69. /* Enable ADC1 DMA requests*/
  70. ADC_DMACmd(ADC1, ENABLE);
  71. /* Start ADC1 Conversion using TIM1 TRGO*/
  72. ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_Trigger3, ADC_ExtTRGSensitivity_Rising);
  73. }
  74. /**
  75. * @brief Configure DMA peripheral
  76. * @param None
  77. * @retval None
  78. */
  79. static void DMA_Config(void)
  80. {
  81. /* Enable DMA1 clock */
  82. CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  83. /* Connect ADC to DMA channel 0 */
  84. SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
  85. DMA_Init(DMA1_Channel0, ADC_BUFFER_ADDRESS,
  86. ADC1_DR_ADDRESS,
  87. ADC_BUFFER_SIZE,
  88. DMA_DIR_PeripheralToMemory,
  89. DMA_Mode_Circular,
  90. DMA_MemoryIncMode_Inc,
  91. DMA_Priority_High,
  92. DMA_MemoryDataSize_HalfWord);
  93. /* DMA Channel0 enable */
  94. DMA_Cmd(DMA1_Channel0, ENABLE);
  95. /* Enable DMA1 channel0 Transfer complete interrupt */
  96. DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);
  97. /* DMA enable */
  98. DMA_GlobalCmd(ENABLE);
  99. }
  100. /**
  101. * @brief Configure TIM2 peripheral
  102. * @param None
  103. * @retval None
  104. */
  105. static void TIM2_Config(void)
  106. {
  107. /* Enable TIM2 clock */
  108. CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
  109. /* Initializes the TIM2 Time Base Unit */
  110. TIM2_TimeBaseInit(TIM_PRESCALER, TIM2_CounterMode_Up, TIM_PERIOD);
  111. /* Selects the TIM2 Update Request Interrupt source */
  112. TIM2_UpdateRequestConfig(TIM2_UpdateSource_Regular);
  113. /* Master Mode selection: Update event */
  114. TIM2_SelectOutputTrigger(TIM2_TRGOSource_Update);
  115. /* Enable TIM2 */
  116. TIM2_Cmd(ENABLE);
  117. }
  118. /**
  119. * @}
  120. */
  121. /************************ (C) Vladimir N. Shilov *****END OF FILE****/