adc.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 Buffer[BUFFER_SIZE] = {0, 0};
  20. uint16_t Voltage = 0;
  21. uint16_t Current = 0;
  22. uint16_t RefVolt = 0;
  23. /* Private function prototypes -----------------------------------------------*/
  24. /* Private functions ---------------------------------------------------------*/
  25. static void ADC_Config(void);
  26. static void DMA_Config(void);
  27. static void TIM2_Config(void);
  28. /* Public functions ----------------------------------------------------------*/
  29. /**
  30. * @brief Initialize and start ADC
  31. * @param None
  32. * @retval None
  33. */
  34. void Init_ADC(void)
  35. {
  36. /* ADC configuration */
  37. ADC_Config();
  38. /* DMA configuration */
  39. DMA_Config();
  40. /* TIM2 configuration */
  41. TIM2_Config();
  42. /* Enable ADC1 DMA requests*/
  43. ADC_DMACmd(ADC1, ENABLE);
  44. /* Start ADC1 Conversion using TIM1 TRGO*/
  45. ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_Trigger3,
  46. ADC_ExtTRGSensitivity_Rising);
  47. /* Master Mode selection: Update event */
  48. TIM2_SelectOutputTrigger(TIM2_TRGOSource_Update);
  49. /* Enable TIM2 */
  50. TIM2_Cmd(ENABLE);
  51. }
  52. /**
  53. * @brief Configure ADC peripheral
  54. * @param None
  55. * @retval None
  56. */
  57. static void ADC_Config(void)
  58. {
  59. /* Enable ADC1 clock */
  60. CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
  61. /* Initialize and configure ADC1 */
  62. ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1);
  63. ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
  64. ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);
  65. /* Enable ADC1 */
  66. ADC_Cmd(ADC1, ENABLE);
  67. /* Enable ADC1 Voltage meter channel */
  68. ADC_ChannelCmd(ADC1, VOLTAGE_CHANNEL, ENABLE);
  69. ADC_SchmittTriggerConfig(ADC1, VOLTAGE_CHANNEL, DISABLE);
  70. /* Enable ADC1 Current meter channel */
  71. ADC_ChannelCmd(ADC1, CURRENT_CHANNEL, ENABLE);
  72. ADC_SchmittTriggerConfig(ADC1, CURRENT_CHANNEL, DISABLE);
  73. /* ADC Voltage Reference */
  74. ADC_VrefintCmd(ENABLE);
  75. /* Enable ADC1 Vrefint Channel */
  76. ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);
  77. }
  78. /**
  79. * @brief Configure DMA peripheral
  80. * @param None
  81. * @retval None
  82. */
  83. static void DMA_Config(void)
  84. {
  85. /* Enable DMA1 clock */
  86. CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
  87. /* Connect ADC to DMA channel 0 */
  88. SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
  89. DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
  90. ADC1_DR_ADDRESS,
  91. BUFFER_SIZE,
  92. DMA_DIR_PeripheralToMemory,
  93. DMA_Mode_Circular,
  94. DMA_MemoryIncMode_Inc,
  95. DMA_Priority_High,
  96. DMA_MemoryDataSize_HalfWord);
  97. /* DMA Channel0 enable */
  98. DMA_Cmd(DMA1_Channel0, ENABLE);
  99. /* Enable DMA1 channel0 Transfer complete interrupt */
  100. DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);
  101. /* DMA enable */
  102. DMA_GlobalCmd(ENABLE);
  103. }
  104. /**
  105. * @brief Configure TIM2 peripheral
  106. * @param None
  107. * @retval None
  108. */
  109. static void TIM2_Config(void)
  110. {
  111. /* Enable TIM2 clock */
  112. CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
  113. //Âîëøåáíîå ÷èñëî 1250 ïîëó÷èëîñü òàê:
  114. // ×àñòîòà ÌÊ (16 ÌHz) / Ïðåääåëèòåëü òàéìåðà (128) * Íóæíîå âðåìÿ â ñåêóíäàõ (0.01)
  115. TIM2->ARRH = 1250>>8; //Çàïèñûâàåì ñíà÷àëà ñòàðøèé áàéò
  116. TIM2->ARRL = (uint8_t)(1250); //Ïîòîì ìëàäøèé
  117. TIM2->CR1 |= TIM_CR1_URS; //Íàñòðàèâàåì èñòî÷íèê ñîáûòèÿ update
  118. // TIM2->CR2 |= (2<<4); //Íàñòðàèâàåì íà ïîäà÷ó ñèãíàëà äëÿ ÀÖÏ ïðè ïåðåïîëíåíèè òàéìåðà == TIM2_TRGOSource_Update
  119. TIM2->PSCR = 7; //Ïðåääåëèòåëü = 2^7 = 128
  120. TIM2->EGR |= TIM_EGR_UG; //Ãåíåðèì ñîáûòèå update, ÷òîáû îáíîâèëñÿ ïðåääåëèòåëü
  121. TIM2->CR1 |= TIM_CR1_CEN; //Çàïóñêàåì
  122. }
  123. /**
  124. * @}
  125. */
  126. /************************ (C) Vladimir N. Shilov *****END OF FILE****/