소스 검색

Всё для работы с АЦП

Vladimir N. Shilov 9 년 전
부모
커밋
a407ea307b
2개의 변경된 파일189개의 추가작업 그리고 0개의 파일을 삭제
  1. 152 0
      lib/adc.c
  2. 37 0
      lib/adc.h

+ 152 - 0
lib/adc.c

@@ -0,0 +1,152 @@
+/**
+  ******************************************************************************
+  * @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****/

+ 37 - 0
lib/adc.h

@@ -0,0 +1,37 @@
+/**
+  ******************************************************************************
+  * @file    VAPC-meter/lib/adc.h
+  * @author  "Vladimir N. Shilov" <shilow@ukr.net>
+  * @version V1
+  * @date    24-March-2016
+  * @brief   This file contains the headers of the ADC functions.
+  ******************************************************************************
+  */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#pragma once
+#ifndef __ADC_H
+#define __ADC_H
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm8l15x.h"
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported defines ----------------------------------------------------------*/
+#define VOLTAGE_CHANNEL     ADC_Channel_17
+#define CURRENT_CHANNEL     ADC_Channel_18
+#define ADC1_DR_ADDRESS     ((uint16_t)0x5344)
+#define BUFFER_SIZE         ((uint8_t) 0x03)
+#define BUFFER_ADDRESS      ((uint16_t)(&Buffer))
+
+/* Exported constants --------------------------------------------------------*/
+__near __no_init const unsigned char Factory_VREFINT @ 0x4910;
+
+/* Exported macro ------------------------------------------------------------*/
+/* Exported variables --------------------------------------------------------*/
+/* Exported functions ------------------------------------------------------- */
+void Init_ADC(void);
+
+#endif /* __ADC_H */
+
+/************************ (C) Vladimir N. Shilov *****END OF FILE****/