STM32F407外设ADC配置流程及代码示例
STM32F407外设ADC配置流程及代码示例
STM32的ADC(模拟-数字转换器)是STM32微控制器系列中集成的一个关键外设,用于将模拟信号(如温度、压力、光强等传感器输出的电压或电流信号)转换为数字信号,以便微控制器能够处理和分析这些信号。
ADC配置流程:
- 时钟配置:
- 启用GPIOF和ADC的时钟。这是配置任何外设之前的重要步骤。
- GPIO配置:
- GPIO引脚配置为模拟输入模式(
GPIO_Mode_AN
),这是ADC输入的正确配置。 - 禁用上拉/下拉电阻(
GPIO_PuPd_NOPULL
),这通常是ADC输入引脚的好选择。
- GPIO引脚配置为模拟输入模式(
- ADC公共配置:
- 设置ADC为独立模式,并配置了预分频器、DMA访问模式和双采样延迟。配置ADC_Prescaler_Div4
、
ADC_DMAAccessMode_Disabled和
ADC_TwoSamplingDelay_5Cycles`,不同的STM32系列可能具有不同的预分频器选项和采样延迟选项。
- 设置ADC为独立模式,并配置了预分频器、DMA访问模式和双采样延迟。配置ADC_Prescaler_Div4
- ADC实例配置:
- 设置ADC的分辨率为12位,禁用了扫描模式和连续转换模式,并设置不使用外部触发转换和数据右对齐。这些设置通常适用于单次转换场景。
- 设置转换数量为1,这意味着每次转换将只涉及一个通道。
- ADC通道配置:
- 选择ADC的第x个通道(对应的引脚),并设置采样时间为3个ADC时钟周期。确保采样时间适合应用需求,因为较长的采样时间可以提高转换精度,但也会降低转换速率。
- 使能ADC:
- 最后使能ADC。在调用
ADC_Cmd(ADCx, ENABLE);
之后,您应该等待ADC准备就绪,这通常通过检查ADC的状态寄存器来完成。
- 最后使能ADC。在调用
代码示例
void ADC_Config(void)
{
ADC_CommonInitTypeDef ADC_CommonInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
//1.打开时钟 PF7 -- ADC3_IN5
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
//2.配置引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOF, &GPIO_InitStructure);
//3.配置ADC参数
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //不使用DMA
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
//4.配置ADC的通道
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//ADC的分辨率为12位 //转换精度 0~4095
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //不扫描
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //不连续
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //不使用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfConversion = 1; //转换数量
ADC_Init(ADC3, &ADC_InitStructure);
//5.选择ADC的通道
ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 1, ADC_SampleTime_3Cycles);
//6.使能ADC3
ADC_Cmd(ADC3, ENABLE);
}