291 lines
9.9 KiB
C
291 lines
9.9 KiB
C
|
||
//#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;
|
||
}
|
||
}
|
||
}
|
||
|