#include "adc.h" static adc_t s_adc[] = { {.port = "A", .pin = 2}, {.port = "B", .pin = 8}, {.port = "B", .pin = 9}, }; /*********************************************************************************************************************** * =====================================================adc====================================================== ** ***********************************************************************************************************************/ // uint16_t meanvalue; adc_t adc = {0}; void ADCInit(uint8_t *port, uint8_t pin) { // GPIO_PIN(A, 28); ADC_InitStruType x; GPIO_InitSettingType y; y.Signal = GPIO_Pin_Signal_Analog; //模拟 y.Dir = GPIO_Direction_Input; //输入 y.Func = GPIO_Reuse_Func0; // GPIO_Init(GPIO_Pin_B9, &y); if (pin == 2) { GPIO_Init(GPIO_Pin_A2, &y); x.CHS = ADC_CHS_AIN8; printf("A4\r\n"); } else if (pin == 8) { GPIO_Init(GPIO_Pin_B8, &y); x.CHS = ADC_CHS_AIN3; printf("B8\r\n"); } else if (pin == 9) { GPIO_Init(GPIO_Pin_B9, &y); x.CHS = ADC_CHS_AIN4; printf("B9\r\n"); } //经过分频以后Tadclk=1/(PCLK/4)约等于0.083us x.CLKS = ADC_CLKS_PCLK; x.CLKDIV = ADC_CLKDIV_1_4; /* ADC时钟源预分频 */ //采集到的模拟量*3.3/4096=现在的电压 x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,设置内部参考电压为多少 */ x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,adc的参考电压为多少 */ x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */ // x.CHS = ADC_CHS_AIN4; // x.CHS = ADC_CHS_AIN8; x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */ //采样时间st*2+1(个Tadclk)=1.743us x.ST = 10; /* AD采样时间选择 */ x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */ ADC_Init(&x); } void get_adc_value(void) { uint16_t adc_value = 0; for (int i = 0; i < 3; i++) { ADCInit(s_adc[i].port, s_adc[i].pin); ADC_SoftStart(); while (ADC_GetConvStatus() == SET) ; //正在转换 s_adc[i].adc_just_now_gather_val = ADC_GetConvValue(); ADC_SoftStop(); record_adc_gather_value(s_adc[i].adc_just_now_gather_val); //printf("%d\r\n",s_adc[i].adc_just_now_gather_val); } } void adc_loop_gather(void) { static uint32_t adc_ticket = 0; if (port_haspassedms(adc_ticket) > 500) { adc_ticket = get_sys_ticket(); get_adc_value(); } } void record_adc_gather_value(uint16_t adc_value) { /** * @brief 记录adc各个通道采集到的数据 * */ for (int i = 0; i < 3; i++) { s_adc[i].adc_value_buff[s_adc[i].adc_value_count++] = adc_value; if (s_adc[i].adc_value_count == 5) { s_adc[i].past_count_reached_five = true; s_adc[i].adc_value_count = 0; } if (s_adc[i].past_count_reached_five == true) { beg_average_value(s_adc[i].adc_value_buff); } } } void beg_average_value(uint16_t *adc_buff) { uint16_t adc_average_value = 0; uint32_t adc_sum_value = 0; for (int i = 0; i < 5; i++) { adc_sum_value += *adc_buff; adc_buff++; } adc_average_value = adc_sum_value / 5; if (adc_average_value <= 16 || adc.abnormal_state == true) { adc.abnormal_state = true; process_voltage_abnormal(); // printf("short out%d\r\n", adc_average_value); //短路 } else { //例:adc_value=1700则电压=1700/4096=1.369 printf("adc_value_t%d\r\n", adc_average_value); } }