STM32的ADC转换器是一种12位逐次逼近型的转换器。输入时钟不能超过 14MHz。
l、时钟配置
A、初始化系统时钟
B、使能对应 GPIO 端口时钟、使能 ADC 时钟、使能端口复用时钟。
ADC时钟不能超过14MHz,因此需要进行ADC时钟分频。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
2、GPIO端口初始化
配置管脚为模拟输入 GPIO_Mode_AIN
3、ADC配置
定义结构体 ADC_InitTypeDef
配置工作模式、连续/单次转换、触发条件、数据对齐等参数。
调用 ADC_Init 函数初始化、如果要使用中断,需要调用 ADC_ITConfig 使能中断。
如果使用规则组模式、调用 ADC_RegularChannelConfig 函数进行配置、采样通道、采样时间等。
调用 ADC_Cmd 函数使能 ADC 转换
4、校准
复位校正寄存器
ADC_ResetCalibration(ADC1);
等待复位完成
while(ADC_GetResetCalibrationStatus(ADC1));
开始校正
ADC_StartCalibration(ADC1);
等待校正完成
while(ADC_GetCalibrationStatus(ADC1));
5、如果有使用中断的话,清除中断
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
6、启动ADC转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
如果使用的是单次转换模式、则每次需要转换时都需要调用该函数重新启动 ADC 转换。连续转换模式则不需要每次手动去启动。
注意 :一般不建议使用连续转换模式下的中断模式进行 ADC 转换, 因为转换时间太短、中断频繁, 从而导致
CPU 无法执行其他的任务,全部消耗在 ADC 转换中断处理上了。如果实在需要连续转换,同时也需要快读
的获取到 ADC 的值,可以使用 DMA 模式。
配置流程如下 :
ADC_InitTypeDef ADC_InitStruct;
/*----------------------------- ADC 配置 ----------------------------*/
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; /* 独立模式 */
ADC_InitStruct.ADC_ScanConvMode = DISABLE; /* 扫描模式为单通道模式 */
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; /* 单次转换模式 */
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; /* 不用外部触发, 软件启动 */
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; /* 数据右对齐 */
ADC_InitStruct.ADC_NbrOfChannel = 1; /* 转换通道个数为 1 */
/* 完成初始化 */
ADC_Init(ADC1, &ADC_InitStruct);
/* 配置规则组, 选择通道 ADC1 的 13, 转换一个通道 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_239Cycles5);
/* 使能 ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*----------------------------- 校准 ----------------------------*/
/* 复位校正寄存器 */
ADC_ResetCalibration(ADC1);
/* 等待寄存器复位完成 */
while(ADC_GetResetCalibrationStatus(ADC1));
/* 开始校准 */
ADC_StartCalibration(ADC1);
/* 等待校准完成 */
while(ADC_GetCalibrationStatus(ADC1));
/* 软件启动 ADC */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
查询方式代码下载 :STM32 ADC 查询方式
中断方式代码下载 :STM32 ADC 中断方式