//#defined XX #include "basic.h" //----------=========================================================================================/// __IO uint16_t ADC_ConvertedValue[ADC_SAMPLE_PNUM][CHANEEL_NUM];//DMA缓存数组 //__IO uint16_t ADC_ConvertedValue[CHANEEL_NUM*2]; //ADC引脚配置 static void ADC_GPIO_Config(void) { // #ifdef XX GPIO_InitTypeDef GPIO_InitStructure; /*=====================ADC1通道0~3 ADC2通道6~7======================*/ /** 使能时钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /** 配置Pin_0,1,2,3,6,7 *///GPIO_Pin_4 | GPIO_Pin_5 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); /*=====================ADC2通道8~9======================*/ /** 使能时钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); /** 配置Pin_0,1 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); /*====================ADC1通道10~13 ADC2通道14~15=====================*/ /** 使能时钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); /** 配置Pin_0,1,2,3,4,5 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); /*==================ADC3通道4~9,14,15===================*/ /** 使能时钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); /** 配置Pin_3,4,5,6,7,8,9,10 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOF, &GPIO_InitStructure); // #elif } //DMA配置 static void ADC_DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; /** * 使用DMA2、数据流0、通道0 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); // // DMA_DeInit(DMA2_Stream0); // DMA_StructInit( &DMA_InitStructure); //通道0 DMA_InitStructure.DMA_Channel = DMA_Channel_0; //外设到内存 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //数据量 DMA_InitStructure.DMA_BufferSize = ADC_SAMPLE_PNUM *CHANEEL_NUM ;// 3*2 //循环模式 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //优先级为高 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //外设地址 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC->CDR);////((uint32_t)0x40012308)((u32)ADC1+0x4c); //指针不递增 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设数据大小 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;// //单次突发 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //内存地址 DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC_ConvertedValue; //指针递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存储器数据大小 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;// //单次突发 DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //禁止FIFO模式 参数可不配置 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //由于禁止FIFO模式 参数可不配置 DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; //初始化DMA DMA_Init(DMA2_Stream0, &DMA_InitStructure); //使能DMA2 Stream0 DMA_Cmd(DMA2_Stream0,ENABLE); } //ADC配置 static void ADC_Config(void) { ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); ADC_DeInit(); //三重模式 ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_RegSimult;//ADC_Mode_Independent; //4分频(84/4 = 21Mhz) ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; /** 下面这两个在独立模式中无效 */ ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;//ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); ADC_StructInit(&ADC_InitStructure); //12位分辨率 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //通道扫描模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //连续转换模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //数据右对齐 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //通道数量 ADC_InitStructure.ADC_NbrOfConversion = CHANEEL_NUM; /** 不使用外部触发,下面这两个无效 */ ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;//0; ADC_InitStructure.ADC_NbrOfConversion = 8; ADC_Init(ADC1, &ADC_InitStructure); //配置通道0为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_112Cycles); //配置通道1为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_112Cycles); //配置通道2为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_112Cycles); //配置通道3为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_112Cycles); //配置通道10为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 5, ADC_SampleTime_112Cycles); //配置通道11为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 6, ADC_SampleTime_112Cycles); //配置通道12为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 7, ADC_SampleTime_112Cycles); //配置通道13为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 8, ADC_SampleTime_112Cycles); //使能ADC DMA ADC_DMACmd(ADC1, ENABLE); ADC_InitStructure.ADC_NbrOfConversion = 6; ADC_Init(ADC2, &ADC_InitStructure); // //配置通道4为第一个转换 采样周期是3 // ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 1, ADC_SampleTime_3Cycles); // //配置通道5为第一个转换 采样周期是3 // ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 2, ADC_SampleTime_3Cycles); //配置通道6为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 1, ADC_SampleTime_112Cycles); //配置通道7为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC2, ADC_Channel_7, 2, ADC_SampleTime_112Cycles); //配置通道8为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 3, ADC_SampleTime_112Cycles); //配置通道9为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 4, ADC_SampleTime_112Cycles); //配置通道14为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 5, ADC_SampleTime_112Cycles); //配置通道15为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 6, ADC_SampleTime_112Cycles); ADC_InitStructure.ADC_NbrOfConversion = 8; ADC_Init(ADC3, &ADC_InitStructure); //配置通道4为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_4, 1, ADC_SampleTime_112Cycles); //配置通道5为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 2, ADC_SampleTime_112Cycles); //配置通道6为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 3, ADC_SampleTime_112Cycles); //配置通道7为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 4, ADC_SampleTime_112Cycles); //配置通道8为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_8, 5, ADC_SampleTime_112Cycles); //配置通道9为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_9, 6, ADC_SampleTime_112Cycles); //配置通道14为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_14, 7, ADC_SampleTime_112Cycles); //配置通道15为第一个转换 采样周期是3 ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 8, ADC_SampleTime_112Cycles); //允许DMA的请求 //ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); // 使能DMA请求 after last transfer (multi-ADC mode) ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE); //使能ADC外设 ADC_Cmd(ADC1, ENABLE); ADC_Cmd(ADC2, ENABLE); ADC_Cmd(ADC3, ENABLE); //软件触发 开始转换 后面就不用触发了 因为是连续转换 // ADC_SoftwareStartConv(ADC1); // ADC_SoftwareStartConv(ADC2); // ADC_SoftwareStartConv(ADC3); } void ADC_AllInit(void) { //DMA_NVIC_Config(); ADC_GPIO_Config(); ADC_Config(); ADC_DMA_Config(); } int num_array[22] = {19,13,4,1,9,6,3,0,21,18,15,12,14,11,8,5,2,23,20,17,7,10}; uint16_t V_Channel[22]; uint16_t V_time_test[20]; int a = 0,b = 0; uint32_t ADC_Data[22]; uint32_t ADC_Sum[22]; uint32_t GV_ADCDATA = 0; void get_adcnum() { if(a<50) { for(int j =0;j<22;j++) ADC_Sum[j] = ADC_Sum[j] + ADC_ConvertedValue[0][num_array[j]];//取50次转换的总和 a++; } else { //20路传感器数据 if(b<20) { ADC_Data[b] = ADC_Sum[b]/50; ADC_Sum[b] = 0; V_Channel[b] = ((uint16_t)(ADC_Data[b])*10000/4096); b++; } //电路实际电压 else if(b == 20) { ADC_Data[b] = ADC_Sum[b]/50; ADC_Sum[b] = 0; V_Channel[b] = ((uint16_t)(ADC_Data[b])*3000/4096)*10; b++; } //传感器数据总和 else if(b == 21) { ADC_Data[b] = ADC_Sum[b]/50; ADC_Sum[b] = 0; V_Channel[b] = ((uint16_t)(ADC_Data[b])*3000/4096)*4; b = 0; a = 0; } } }