switch_test/User/adc.c

291 lines
9.9 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//#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;
}
}
}