DMA+ADC实现多通道采集
这个程序的效果是要采集分别采集电位器、光敏模块、热敏模块和红外对射模块的ADC采集,通过使用ADC的扫描模式和DMA数据转运来实现ADC多通道采集
一、ADC结构图

二、DMA结构图

三、ADC和DMA初始化函数的配置步骤
-
开启ADC外设、GPIO外设和DMA外设的RCC时钟
-
配置GPIO,初始化结构体
-
配置ADC的时钟
-
配置ADC时钟需要调用一个RCC的库函数,这个函数在stm32f10x_rcc.h文件中被定义:
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);//配置ADCCLK的分频器在跳转到这个函数的源码,知道他可以对APB2总线的72MHz时钟选择2、4、6、8分频输入到ADCCLK,在参考手册中的第11节ADC介绍中有提到ADC的输入时钟不得超过14MHz,所以这里可以选择6分频或者8分频

-
-
配置GPIO到ADC转换器的多路开关,选择AD转换器的输入通道
-
由于要对ADC进行四个通道的多通道采集,所以这个输入通道选择就应该是要分别选择四个通道,调用一个ADC的库函数
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);在STM32入门教程资料的参考文档的STM32F103xx固件函数库用户手册中的4.2.15节有这个函数的详细解释

-
-
配置ADC,初始化结构体
-
结构体的详细配置配置在在STM32入门教程资料的参考文档的STM32F103xx固件函数库用户手册中的4.2.2节
-
(可选)如果要使用模拟看门狗,有函数来配置阈值和监测通道
-
(可选)如果要开启中断,配置NVIC
-
-
配置DMA,初始化结构体
- 结构体的详细配置配置在在STM32入门教程资料的参考文档的STM32F103xx固件函数库用户手册中的7.2.2节
-
开启DMA
-
开启ADC到DMA的输出,选择DMA的硬件触发源
- DMA1的通道1的要选择使用哪个硬件触发源就需要对其使能

- DMA1的通道1的要选择使用哪个硬件触发源就需要对其使能
-
开启ADC
-
ADC校准
- 校准的流程就是开始复位校准、等待复位校准完成、开始校准、等待校准完成
四、程序代码
一、使用ADC单次转换扫描模式,DMA单次转运
-
AD.c文件
#include "stm32f10x.h" // Device header /* //一、开启GPIO外设和ADC外设RCC时钟 //二、配置GPIO,初始化结构体 //三、配置ADCCKL,调用一个函数 //四、选择规则组的输入通道 //五、配置ADC,初始化结构体 (可选)模拟看门狗,有函数来配置阈值和监测通道 (可选)开启中断,配置NVIC //六、配置DMA,初始化结构体 //七、开启DMA //八、开启ADC到DMA的输出,选择DMA的硬件触发源 //九、开启ADC //十、ADC校准 */ uint16_t AD_Value[4]; void AD_Init(void) { //一、开启GPIO外设和ADC外设RCC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //二、配置GPIO,初始化结构体 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); //三、配置ADCCKL,调用一个函数 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //四、选择规则组的输入通道 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //五、配置ADC,初始化结构体 ADC_InitTypeDef ADC_InitStruct; //ADC转换模式选择(独立模式或双ADC模式),只有“ADC_Mode_Independent”是独立模式其他都是双ADC模式 ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//对齐方式 ADC_InitStruct.

最低0.47元/天 解锁文章
6671

被折叠的 条评论
为什么被折叠?



