#include "adc.h" #include "GPIO.h" #include "stm8s_gpio.h" #include "stm8s_adc1.h" #define ADC_CURRENT_CH (ADC1_CHANNEL_4) #define ADC_VOLTAGE_CH (ADC1_CHANNEL_2) enum { ADC_CHANNELMAX = 16 }; static uint16_t ADC1_ValueBuffer_u16[ADC_CHANNELMAX] = {0}; static void ADC1_SCAN(void); /*! * @brief 配置ADC引脚 * @param [in] void * @note null */ void ADCconfig(void) { GPIO_Init(CURRENT_AI_PORT, CURRENT_AI_PIN, GPIO_MODE_IN_FL_NO_IT); GPIO_Init(VOLTAGE_AI_PORT, VOLTAGE_AI_PIN, GPIO_MODE_IN_FL_NO_IT); ADC1_DeInit(); // ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, channl[i], ADC1_PRESSEL_FCPU_D2, // ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL8, // DISABLE); } static void ADC1_SCAN(void) { uint8_t i = 0; ADC1_Channel_TypeDef channl[] = {ADC_CURRENT_CH, ADC_VOLTAGE_CH}; for (i = 0; i < (sizeof(channl) / sizeof(ADC1_Channel_TypeDef)); i++) { ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, channl[i], ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL8, DISABLE); ADC1_StartConversion(); while (!ADC1_GetFlagStatus(ADC1_FLAG_EOC)) ; //wait for Conversion over. ADC1_ValueBuffer_u16[channl[i]] = ADC1_GetConversionValue(); ADC1_ClearFlag(ADC1_FLAG_EOC); ADC1_ClearITPendingBit(ADC1_IT_EOC); } } /*! * @brief 采集ADC任务 * @param [in] void * @note null */ void ADCTask(void) { ADC1_SCAN(); } /*! * @brief 获取ADC1函数 * @param [in] void * @retval ADC的数字量 * @note null */ int GetADC1Value(int ch) { return ADC1_ValueBuffer_u16[ch]; }