目前单片机型号为stm32f103rbt6,编写ADC采样,采样值不全正确。使用的ADC1、DMA1,实在是找不到代码如何修改了,请求各位大神支招。以下是关于ADC采样部分的代码:#define N 20 //采样次数
#define N 20 //采样次数
#define M 5 //通道数
u16 AD_Value[N][M];
u16 After_filter[M];
void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC| RCC_APB2Periph_ADC1, ENABLE );
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1| GPIO_Pin_2 ; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN; GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN; GPIO_Init(GPIOC,&GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode =ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode =ENABLE; ADC_InitStructure.ADC_ContinuousConvMode= ENABLE; ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 5; ADC_Init(ADC1, &ADC_InitStructure);
//次数采样通道设置对否?或者其余地方不对? ADC_RegularChannelConfig(ADC1, ADC_Channel_0,1, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1,ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1,ADC_Channel_4, 4, ADC_SampleTime_239Cycles5 ); ADC_RegularChannelConfig(ADC1,ADC_Channel_5, 5, ADC_SampleTime_239Cycles5 );
ADC_DMACmd(ADC1,ENABLE);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
} voidMYDMA_Config(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr= (u32)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&AD_Value; DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize =N*M; 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_Circular; DMA_InitStructure.DMA_Priority =DMA_Priority_Medium; DMA_InitStructure.DMA_M2M =DMA_M2M_Disable; DMA_Init(DMA1_Channel1,&DMA_InitStructure); DMA_Cmd(DMA1_Channel1,ENABLE); } u16 GetVolt(u16advalue) { return (u16)(advalue * 3300 /4096); }
voidfilter(void) { int sum=0; int i; u8 count; for(i=0;i<M;i++) { for(count=0;count<N;count++) { sum += AD_Value[count]; } After_filter=sum/N; sum=0; } }
|