123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /**
- ******************************************************************************
- * @file VAPC-meter/lib/adc.c
- * @author "Vladimir N. Shilov" <shilow@ukr.net>
- * @version V1
- * @date 24-March-2016
- * @brief This file contains the ADC functions.
- ******************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "adc.h"
- /** @addtogroup ADC
- * @{
- */
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- uint16_t Buffer[BUFFER_SIZE] = {0, 0};
- uint16_t Voltage = 0;
- uint16_t Current = 0;
- uint16_t RefVolt = 0;
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- static void ADC_Config(void);
- static void DMA_Config(void);
- static void TIM2_Config(void);
- /* Public functions ----------------------------------------------------------*/
- /**
- * @brief Initialize and start ADC
- * @param None
- * @retval None
- */
- void Init_ADC(void)
- {
- /* ADC configuration */
- ADC_Config();
- /* DMA configuration */
- DMA_Config();
- /* TIM2 configuration */
- TIM2_Config();
- /* Enable ADC1 DMA requests*/
- ADC_DMACmd(ADC1, ENABLE);
- /* Start ADC1 Conversion using TIM1 TRGO*/
- ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_Trigger3,
- ADC_ExtTRGSensitivity_Rising);
- /* Master Mode selection: Update event */
- TIM2_SelectOutputTrigger(TIM2_TRGOSource_Update);
- /* Enable TIM2 */
- TIM2_Cmd(ENABLE);
- }
- /**
- * @brief Configure ADC peripheral
- * @param None
- * @retval None
- */
- static void ADC_Config(void)
- {
- /* Enable ADC1 clock */
- CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
- /* Initialize and configure ADC1 */
- ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1);
- ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
- ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);
- /* Enable ADC1 */
- ADC_Cmd(ADC1, ENABLE);
- /* Enable ADC1 Voltage meter channel */
- ADC_ChannelCmd(ADC1, VOLTAGE_CHANNEL, ENABLE);
- ADC_SchmittTriggerConfig(ADC1, VOLTAGE_CHANNEL, DISABLE);
- /* Enable ADC1 Current meter channel */
- ADC_ChannelCmd(ADC1, CURRENT_CHANNEL, ENABLE);
- ADC_SchmittTriggerConfig(ADC1, CURRENT_CHANNEL, DISABLE);
- /* ADC Voltage Reference */
- ADC_VrefintCmd(ENABLE);
- /* Enable ADC1 Vrefint Channel */
- ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);
- }
- /**
- * @brief Configure DMA peripheral
- * @param None
- * @retval None
- */
- static void DMA_Config(void)
- {
- /* Enable DMA1 clock */
- CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
- /* Connect ADC to DMA channel 0 */
- SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
- DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
- ADC1_DR_ADDRESS,
- BUFFER_SIZE,
- DMA_DIR_PeripheralToMemory,
- DMA_Mode_Circular,
- DMA_MemoryIncMode_Inc,
- DMA_Priority_High,
- DMA_MemoryDataSize_HalfWord);
- /* DMA Channel0 enable */
- DMA_Cmd(DMA1_Channel0, ENABLE);
- /* Enable DMA1 channel0 Transfer complete interrupt */
- DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);
- /* DMA enable */
- DMA_GlobalCmd(ENABLE);
- }
- /**
- * @brief Configure TIM2 peripheral
- * @param None
- * @retval None
- */
- static void TIM2_Config(void)
- {
- /* Enable TIM2 clock */
- CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
- //Âîëøåáíîå ÷èñëî 1250 ïîëó÷èëîñü òàê:
- // ×àñòîòà ÌÊ (16 ÌHz) / Ïðåääåëèòåëü òàéìåðà (128) * Íóæíîå âðåìÿ â ñåêóíäàõ (0.01)
- TIM2->ARRH = 1250>>8; //Çàïèñûâàåì ñíà÷àëà ñòàðøèé áàéò
- TIM2->ARRL = (uint8_t)(1250); //Ïîòîì ìëàäøèé
- TIM2->CR1 |= TIM_CR1_URS; //Íàñòðàèâàåì èñòî÷íèê ñîáûòèÿ update
- // TIM2->CR2 |= (2<<4); //Íàñòðàèâàåì íà ïîäà÷ó ñèãíàëà äëÿ ÀÖÏ ïðè ïåðåïîëíåíèè òàéìåðà == TIM2_TRGOSource_Update
- TIM2->PSCR = 7; //Ïðåääåëèòåëü = 2^7 = 128
- TIM2->EGR |= TIM_EGR_UG; //Ãåíåðèì ñîáûòèå update, ÷òîáû îáíîâèëñÿ ïðåääåëèòåëü
- TIM2->CR1 |= TIM_CR1_CEN; //Çàïóñêàåì
- }
- /**
- * @}
- */
- /************************ (C) Vladimir N. Shilov *****END OF FILE****/
|