stm32 adc dma多通道采样 数据错位的解决方法

void Read_ADC_All(void)
{
	u8 Number,t;
	u32 sum;
	
	//完成一次DMA传输,数据大小Sample_Times*Channel_Num
	DMA_SetCurrDataCounter(DMA1_Channel1,Sample_Times*Channel_Num);				//设置DMA的传送数量为Sample_Times*Channel_Num
	DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA通道1
	ADC_Cmd(ADC1, ENABLE);//使能ADC
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使用软件转换启动功能	
	while(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=SET);			//等待DMA传送完成
	DMA_ClearFlag(DMA1_FLAG_TC1);				//清除DMA传送完成标志
	DMA_Cmd(DMA1_Channel1,DISABLE);	
	ADC_SoftwareStartConvCmd(ADC1, DISABLE);	
	ADC_Cmd(ADC1, DISABLE);//必须加上这句话,失能ADC,不然会数据错位,坑了1天
	for(Number = 0;Number < Channel_Num;Number++) //把所有通道采样的数据全部取出
	{
		sum = 0;
		for (t = 0;t < Sample_Times;t++)//采样次数
		{
			sum += ADC_ConvertedValue[t][Number];
		}
		AD_After_Filter[Number]=sum/Sample_Times;//取平均值
	
	}
	delay_ms(5);
}

故障原因猜测:1、虽然有ADC_SoftwareStartConvCmd(ADC1, DISABLE);//禁用选定的ADC软件启动转换。但是adc并没有失能,所以在继续采集数据。2、由于DMA传输数据需要消耗一定的时间,在传输最后一个数据时,adc由于是连续转换,继续采集了下一个通道的数据,然后才被停止,这才造成了错位

你可能感兴趣的:(stm32,ADC,stm32)