STM32的ADC(模拟-数字转换器)外设是STM32微控制器系列中的一个关键组件,它能够将模拟信号(如温度、压力、光强等传感器输出的电压或电流信号)转换为数字信号,以便微控制器进行后续的处理和分析。以下是对STM32 ADC外设的详细讲解:
一、ADC简介
ADC,全称Analog-to-Digital Converter,即模拟/数字转换器。在嵌入式系统、通信、测控等领域,模拟信号通常需要转换为数字信号,以便在计算机或数字电路中进行处理、传输和存储。STM32系列微控制器中的ADC外设正是为了满足这一需求而设计的。
二、ADC的时钟
STM32的ADC有两个时钟方案:一个是针对数字电路的时钟,另一个是针对模拟电路的时钟。模拟电路的时钟(ADCCLK)是所有ADC共用的,它来自于APB2时钟,该预分频器允许ADC在fPCLK2/2、/4、/6或/8下工作。数字接口的时钟则等效于APB2时钟。
三、ADC特性
STM32的ADC具有多种特性,包括但不限于:
- 可配置不同分辨率(如12位、10位、8位或6位)。
- 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断。
- 支持单次和连续转换模式。
- 自动将通道0转换为通道“n”的扫描模式。
- 数据被存储在16位数据寄存器中,数据对齐以保持内置数据一致性。
- 可独立设置各通道采样时间,以及外部触发器选项。
- 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或者下限。
四、ADC功能说明及其通路图
STM32的ADC外设具有规则通道和注入通道两种类型的通道。规则通道可以理解为普通的转换通道,在没有配置注入转换通道的情况下,主要使用规则通道。注入通道则是一种中断或插入的通道,它可以在规则通道转换的时候强行插入要转换的通道,从而中断规则通道的转换。
五、数据寄存器
ADC的数据寄存器有16位,但最多只有12位是有效的。ADC_CR2寄存器中的ALIGN位用于选择转换后存储的数据的对齐方式,可选择左对齐和右对齐两种方式。
六、转换模式
STM32的ADC支持多种转换模式,包括单次转换模式、连续转换模式和扫描模式。
- 单次转换模式:在此模式下,ADC按照设定的配置执行一次转换,然后停止转换并等待进一步的触发。这种模式适用于需要单次获取转换结果的应用场景。
- 连续转换模式:在此模式下,ADC在完成一次转换后自动开始下一次转换,无需外部触发。这种模式适用于需要持续采样的应用场景。
- 扫描模式:扫描模式是与通道选择相关的功能。在扫描模式下,可以设置多个输入通道进行连续转换。ADC将按照通道号的顺序对设置的多个通道进行转换,并将结果按顺序保存在对应的数据寄存器中。扫描模式通常与连续转换模式一起使用,以实现多个通道的连续采样和转换。
七、ADC的校准
八、ADC配置示例
以下是一个STM32 ADC配置示例,以STM32F1系列为例:
这是一个最基本的软件触发ADC的初始化
void ADC_Init()
{
//开启GPIO和ADC1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
//初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//预分频ADC时钟源,不能超过14MHZ
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//初始化ADC
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_ContinuousConvMode=DISABLE; //是否连续
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right; //指定数据左对齐还是右对齐
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //选择触发源,硬件触发还 是软件触发(这里选择的是软件触发,详细见数据手册说明)
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent; //单ADC模式
ADC_InitStruct.ADC_NbrOfChannel=1; //指定ADC的通道数量
ADC_InitStruct.ADC_ScanConvMode=DISABLE; //是否扫描
ADC_Init(ADC1,&ADC_InitStruct);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //复位校准
while(ADC_GetResetCalibrationStatus(ADC1)==1); //检测复位校准是否完成,如果未完成则一直循环直到完成跳出
ADC_StartCalibration(ADC1); //开始校准
while(ADC_GetCalibrationStatus(ADC1)==1); //检测校准是否完成,如果未完成则一直循环直到完成跳出
}
八、总结
STM32的ADC外设是一个功能强大且灵活的模拟/数字转换器,它能够将模拟信号转换为数字信号,以便微控制器进行后续的处理和分析。通过合理配置ADC的参数和模式,可以满足不同应用场景的需求。