#include "drv_adc.h" #include "stdlib.h" #include "string.h" #include "gd32f4xx.h" #include "rtthread.h" #define ADC_BASIC 3300 void ADC_Init() { //配置引脚时钟 rcu_periph_clock_enable(RCU_GPIOC); //引脚复用,PC2——电压ADC1-CH12,PC3——电流ADC1-CH13 gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_2); gpio_mode_set(GPIOC,GPIO_MODE_ANALOG,GPIO_PUPD_NONE,GPIO_PIN_3); rcu_periph_clock_enable(RCU_ADC1); //总线时钟20分频=6MHZ adc_clock_config(ADC_ADCCK_PCLK2_DIV4); /***********************************************/ //对齐方式 ADC_INSERTED_CHANNEL adc_data_alignment_config(ADC1,ADC_DATAALIGN_RIGHT); //扫描模式 adc_special_function_config(ADC1,ADC_SCAN_MODE,ENABLE); //外部触发关闭 adc_external_trigger_config(ADC1,ADC_INSERTED_CHANNEL,DISABLE); //采集通道数 adc_channel_length_config(ADC1,ADC_INSERTED_CHANNEL,2); //通道注入顺序 adc_inserted_channel_config(ADC1,0,ADC_CHANNEL_13,ADC_SAMPLETIME_480);//电流 adc_inserted_channel_config(ADC1,1,ADC_CHANNEL_12,ADC_SAMPLETIME_480);//电压 adc_enable(ADC1); adc_calibration_enable(ADC1); } //电压采集 float ptz_Voltage_collect_adc1_task() { static float adc1_v[5]; static unsigned char adc1_num; int j,k; float tem; float curadc1; uint16_t value_V; //软件触发使能 adc_software_trigger_enable(ADC1,ADC_INSERTED_CHANNEL); value_V = ADC_IDATA1(ADC1); adc1_v[adc1_num] = (float)value_V / 4096.0 * 11 *3.3;//(float)value_V;// adc1_num++; if(adc1_num >= 5) { adc1_num = 0; for(j = 0; j < 5-1; j++)//采样值由小到大排列 { for(k = 0; k < 5-j-1; k++) { if(adc1_v[k] > adc1_v[k+1]) { tem = adc1_v[k]; adc1_v[k] = adc1_v[k+1]; adc1_v[k+1] = tem; } } } for(uint8_t i = 1; i < 5 - 1; i++) { curadc1 = curadc1 + adc1_v[i]; } curadc1 = curadc1 /((float)(5 - 2));//去掉一个最大值和一个最小值求平均值 // g_ptz.Voltage = curadc1; memset(adc1_v,0,sizeof(adc1_v)); return curadc1; // rt_kprintf("ADC Channel value: %f\n", curadc1); // pdebug(DEBUG_LEVEL_INFO,"get ptz Voltage: %.3fV",g_ptz.Voltage); } } void init_data_collect_module(void) { ADC_Init();//AD采集引脚初始化 // temp75_gpio_init();//温度传感器初始化 // creat_task_data_collect(); }