#include "adc.h" #include "SysTick.h" #include "gd32e230_libopt.h" #define ADC_Vref 33 #define ADC_V_Gain 1294 #define ADC_GEN 1.414 #define ADC_I_Gain 2000 #define U_max GPIO_PIN_3 #define U_min GPIO_PIN_4 #define I_max GPIO_PIN_5 #define I_min GPIO_PIN_6 uint16_t adc_original_value[4]= {0}; void ADC_dma_config(void) { dma_parameter_struct dma_data_parameter; rcu_periph_clock_enable(RCU_ADC); rcu_periph_clock_enable(RCU_DMA); dma_deinit(DMA_CH0); dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA); dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_data_parameter.memory_addr = (uint32_t)(adc_original_value); dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; dma_data_parameter.number = 4; dma_data_parameter.priority = DMA_PRIORITY_HIGH; dma_circulation_enable(DMA_CH0); dma_init(DMA_CH0, &dma_data_parameter); dma_memory_to_memory_disable(DMA_CH0); dma_channel_enable(DMA_CH0); } void AdcInit(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_DMA); rcu_periph_clock_enable(RCU_ADC); rcu_adc_clock_config(RCU_ADCCK_APB2_DIV8); gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, U_max | U_min | I_max | I_min); adc_deinit(); ADC_dma_config(); adc_special_function_config(ADC_SCAN_MODE,ENABLE); adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE); adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_NONE); adc_data_alignment_config(ADC_DATAALIGN_RIGHT); adc_resolution_config(ADC_RESOLUTION_12B); adc_channel_length_config(ADC_REGULAR_CHANNEL, 4); adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE); adc_regular_channel_config(0U, ADC_CHANNEL_3, ADC_SAMPLETIME_1POINT5); adc_regular_channel_config(1U, ADC_CHANNEL_4, ADC_SAMPLETIME_1POINT5); adc_regular_channel_config(2U, ADC_CHANNEL_5, ADC_SAMPLETIME_1POINT5); adc_regular_channel_config(3U, ADC_CHANNEL_6, ADC_SAMPLETIME_1POINT5); adc_enable(); adc_enable(); DelayNms(1); adc_calibration_enable(); adc_dma_mode_enable(); adc_software_trigger_enable(ADC_REGULAR_CHANNEL); adc_software_trigger_enable(ADC_REGULAR_CHANNEL); } void AdcInit_old(void) { rcu_periph_clock_enable(RCU_GPIOA); //rcu_periph_clock_enable(RCU_DMA); rcu_periph_clock_enable(RCU_ADC); rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6); gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, U_max | U_min | I_max | I_min); adc_deinit(); //ADC_dma_config(); //adc_special_function_config(ADC_SCAN_MODE,ENABLE); //adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE); adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_NONE); adc_data_alignment_config(ADC_DATAALIGN_RIGHT); adc_resolution_config(ADC_RESOLUTION_12B); adc_channel_length_config(ADC_REGULAR_CHANNEL, 4); adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE); // adc_regular_channel_config(0U, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); // adc_regular_channel_config(1U, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5); // adc_regular_channel_config(2U, ADC_CHANNEL_5, ADC_SAMPLETIME_1POINT5); // adc_regular_channel_config(3U, ADC_CHANNEL_6, ADC_SAMPLETIME_1POINT5); adc_enable(); // adc_enable(); DelayNms(1); adc_calibration_enable(); //adc_dma_mode_enable(); // adc_software_trigger_enable(ADC_REGULAR_CHANNEL); // adc_software_trigger_enable(ADC_REGULAR_CHANNEL); } //float read_voltage(void) //{ // float value = 0.0; // uint32_t temp = 0; // if(adc_original_value[0] - adc_original_value[1] > 0) // { // temp = adc_original_value[0] -adc_original_value[1]; // temp *= ADC_Vref; // temp *= 1000; // temp = temp >> 12; // temp *= ADC_V_Gain; // value = temp; // value /= 10.0; // value /= 1000.0; // value /= ADC_GEN; // } // return value; //} //void Bubble_Sort_(uint16_t arr[], unsigned short int len) //{ // unsigned short int i, j; // uint16_t temp; // for (i = 0; i < len - 1; i++) // for (j = 0; j < len - 1 - i; j++) // if (arr[j] > arr[j + 1]) // { // temp = arr[j]; // arr[j] = arr[j + 1]; // arr[j + 1] = temp; // } //} //float read_current(void) //{ // float value = 0.0; // uint32_t temp = 0; //// static int index = 0; //// adc_val_1000[index] = adc_original_value[2]; //// index ++; //// if(index == 1000) //// { //// index = 0; //// Bubble_Sort_(adc_val_1000,1000); //// memcpy(adc,adc_val_1000,2000); //// } // // temp = abs(adc_original_value[3] - adc_original_value[2]); // temp *= ADC_Vref; // temp *= 1000; // temp *= ADC_I_Gain; // temp = temp >> 12; // value = temp; // value /= 10; // value /= 10.0; // value /= 1000.0; // value /= ADC_GEN; // // return value; //} void adc_channel_sample(uint16_t arr[]) { /* ADC regular channel config */ adc_regular_channel_config(0U, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(1U, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(2U, ADC_CHANNEL_5, ADC_SAMPLETIME_55POINT5); adc_regular_channel_config(3U, ADC_CHANNEL_6, ADC_SAMPLETIME_55POINT5); /* ADC software trigger enable */ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); /* wait the end of conversion flag */ while(!adc_flag_get(ADC_FLAG_EOC)); /* clear the end of conversion flag */ adc_flag_clear(ADC_FLAG_EOC); /* return regular channel sample value */ arr[0] = adc_regular_data_read(); //return (adc_regular_data_read(); } uint16_t adc_channel_sample_V_P() { adc_regular_channel_config(0U, ADC_CHANNEL_3, ADC_SAMPLETIME_1POINT5); /* ADC software trigger enable */ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); /* wait the end of conversion flag */ while(!adc_flag_get(ADC_FLAG_EOC)); /* clear the end of conversion flag */ adc_flag_clear(ADC_FLAG_EOC); /* return regular channel sample value */ return adc_regular_data_read(); } uint16_t adc_channel_sample_V_S() { adc_regular_channel_config(0U, ADC_CHANNEL_4, ADC_SAMPLETIME_1POINT5); /* ADC software trigger enable */ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); /* wait the end of conversion flag */ while(!adc_flag_get(ADC_FLAG_EOC)); /* clear the end of conversion flag */ adc_flag_clear(ADC_FLAG_EOC); /* return regular channel sample value */ return adc_regular_data_read(); } uint16_t adc_channel_sample_I_P() { adc_regular_channel_config(0U, ADC_CHANNEL_5, ADC_SAMPLETIME_1POINT5); /* ADC software trigger enable */ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); /* wait the end of conversion flag */ while(!adc_flag_get(ADC_FLAG_EOC)); /* clear the end of conversion flag */ adc_flag_clear(ADC_FLAG_EOC); /* return regular channel sample value */ return adc_regular_data_read(); } uint16_t adc_channel_sample_I_S() { adc_regular_channel_config(0U, ADC_CHANNEL_6, ADC_SAMPLETIME_1POINT5); /* ADC software trigger enable */ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); /* wait the end of conversion flag */ while(!adc_flag_get(ADC_FLAG_EOC)); /* clear the end of conversion flag */ adc_flag_clear(ADC_FLAG_EOC); /* return regular channel sample value */ return adc_regular_data_read(); }