#include "adc.h" #include "delay.h" #include "stm32f10x.h"
#define ADC1_DR_Address ? ?((u32)0x40012400+0x4c) ?#define Sample_Num 10 #define Channel_Num 2
? __IO uint16_t ADC_ConvertedValue[Sample_Num][Channel_Num]; u16 AD_After_Filter[Channel_Num];? ? ? ?
static void ADC1_GPIO_Config(void) { ?? ?GPIO_InitTypeDef GPIO_InitStructure; ?? ? ?? ?/* Enable DMA clock */ ?? ?RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); ?? ? ?? ?/* Enable ADC1 and GPIOA clock */ ?? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); ?? ? ?? ?/* Configure PA0-PA4 ?as analog input */ ?? ?GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; ?? ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;? ? ?? ?GPIO_Init(GPIOA, &GPIO_InitStructure);? ? ? ? ? ? ? ? } ?
static void ADC1_Mode_Config(void) { ?? ?DMA_InitTypeDef DMA_InitStructure; ?? ?ADC_InitTypeDef ADC_InitStructure; ?? ? ?? ?/* Enable DMA clock */ ?? ?RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); ?? ?/* Enable ADC1 and GPIOA clock */ ?? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); ?? ? ?? ?/* DMA channel1 configuration */ ?? ?DMA_DeInit(DMA1_Channel1);? ?? ?? ?DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;? ?? ?? ?DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;? ? ?? ?DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;? ? ?? ?DMA_InitStructure.DMA_BufferSize = Sample_Num*Channel_Num; ?? ?DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; ?? ?DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;? ?? ?DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;? ? ?? ?DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;? ?? ?DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;? ?? ?? ?DMA_InitStructure.DMA_Priority = DMA_Priority_High; ?? ?DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;? ?? ?? ?DMA_Init(DMA1_Channel1, &DMA_InitStructure);? ?? ?? ? ?? ?/* Enable DMA channel1 */ ?? ?DMA_Cmd(DMA1_Channel1, ENABLE); ?? ? ?? ? ?? ?/* ADC1 configuration */ ?? ?ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;? ? ?? ?ADC_InitStructure.ADC_ScanConvMode = ENABLE ;? ?? ?? ?//ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;? ? ?? ?ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;? ? ?? ?ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;? ? ?? ?ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;? ? ?? ?ADC_InitStructure.ADC_NbrOfChannel = Channel_Num;? ? ? ?? ?? ?ADC_Init(ADC1, &ADC_InitStructure); ?? ?
?? ?RCC_ADCCLKConfig(RCC_PCLK2_Div6);? ?? ?ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );? ? ?? ?ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_239Cycles5 );? ?
?? ? ?? ?ADC_DMACmd(ADC1, ENABLE);?? ?// Enable ADC1 DMA ?? ?ADC_Cmd(ADC1, ENABLE);?? ?// Enable ADC1 ?? ? ?? ?ADC_ResetCalibration(ADC1);? ? ?? ?while(ADC_GetResetCalibrationStatus(ADC1));? ? ?? ?ADC_StartCalibration(ADC1);? ? ?? ?while(ADC_GetCalibrationStatus(ADC1));? ?? ?? ?? ?? ?//ADC_SoftwareStartConvCmd(ADC1, ENABLE);? ?? } ?
?void ADC1_Init(void) { ?? ?ADC1_GPIO_Config(); ?? ?ADC1_Mode_Config(); } ? //函数中不加红色部分会导致2路adc位置飘忽不定
//估计是停止采集ADC_SoftwareStartConvCmd(ADC1, DISABLE)没起作用 u16 Read_ADC_AverageValue(u16 Channel) { ?? ?u8 t; ?? ?u32 sum = 0; ?? ? ? ?? ?? ?DMA_SetCurrDataCounter(DMA1_Channel1,Sample_Num*Channel_Num);? ? ? ? ? ? ? ? ?? ?DMA_Cmd(DMA1_Channel1,ENABLE); ? ? ADC_Cmd(ADC1, ENABLE); ?? ?ADC_SoftwareStartConvCmd(ADC1, ENABLE);? ? ? ? ? ? ? ? ? ?? ?while(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=SET);? ? ? ? ? ? ?? ?DMA_ClearFlag(DMA1_FLAG_TC1);? ? ? ? ? ? ? ? ? ? ? ? ?? ?? ?DMA_Cmd(DMA1_Channel1,DISABLE);?? ? ?? ?ADC_SoftwareStartConvCmd(ADC1, DISABLE);?? ? ?? ?ADC_Cmd(ADC1, DISABLE); ? ?? ?? ?for(t=0;t<Sample_Num;t++) ? ? { ? ? ? ? sum += ADC_ConvertedValue[t][Channel]; ? ? } ?? ?AD_After_Filter[Channel] = sum/Sample_Num; ?? ?sum = 0; ? ?? ?? ?return AD_After_Filter[Channel];?? ? }
|