本文的主要内容是使用STM32F407的ADC1来采集8路通道的传感器数据,因为要定时采集,所以使用了定时器功能,另外需要开启DMA功能。首先说一下程序的思路:使用ADC的DMA功能,将ADC数据寄存器的值通过DMA传到内存的结果数组中,这里ADC配置时使用扫描模式,连续转换模式,定时器中断函数定期去结果数组中读取结果,也就是ADC配置使能后一直在工作,然后DMA将结果存到数组中,想要结果时直接调用数组即可。接下来结合具体代码看功能是如何实现的。
首先是ADC_DMA配置,由于项目需要所以使用了8个通道,查看数据手册找到合适引脚,大部分程序看代码后面的注释就可理解,重点的代码会另外解释。
u16 ADC_ConvertedV[Sample_Num][Channel_Num]={0};//用来存放8个通道的各5个采样值,以后用来求平均值,
//Sample_Num,Channel_Num两个宏定义采样次数,通道数量 //DMA将ADC转换值不断地存到内存中,等待程序读取即可
void ADC_DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);//使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
GPIO_Ini