STM32 ADC外设的功能讲解

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具有多种特性,包括但不限于:

  1. 可配置不同分辨率(如12位、10位、8位或6位)。
  2. 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断。
  3. 支持单次和连续转换模式。
  4. 自动将通道0转换为通道“n”的扫描模式。
  5. 数据被存储在16位数据寄存器中,数据对齐以保持内置数据一致性。
  6. 可独立设置各通道采样时间,以及外部触发器选项。
  7. 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或者下限。

四、ADC功能说明及其通路图

STM32的ADC外设具有规则通道和注入通道两种类型的通道。规则通道可以理解为普通的转换通道,在没有配置注入转换通道的情况下,主要使用规则通道。注入通道则是一种中断或插入的通道,它可以在规则通道转换的时候强行插入要转换的通道,从而中断规则通道的转换。

五、数据寄存器

ADC的数据寄存器有16位,但最多只有12位是有效的。ADC_CR2寄存器中的ALIGN位用于选择转换后存储的数据的对齐方式,可选择左对齐和右对齐两种方式。

六、转换模式

STM32的ADC支持多种转换模式,包括单次转换模式、连续转换模式和扫描模式。

  1. 单次转换模式:在此模式下,ADC按照设定的配置执行一次转换,然后停止转换并等待进一步的触发。这种模式适用于需要单次获取转换结果的应用场景。
  2. 连续转换模式:在此模式下,ADC在完成一次转换后自动开始下一次转换,无需外部触发。这种模式适用于需要持续采样的应用场景。
  3. 扫描模式:扫描模式是与通道选择相关的功能。在扫描模式下,可以设置多个输入通道进行连续转换。ADC将按照通道号的顺序对设置的多个通道进行转换,并将结果按顺序保存在对应的数据寄存器中。扫描模式通常与连续转换模式一起使用,以实现多个通道的连续采样和转换。

七、ADC的校准

ADC 有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。在
校准期间,在每个电容器上都会计算出一个误差修正码 ( 数字值 ) ,这个码用于消除在随后的转换
中每个电容器上产生的误差。
通过设置 ADC_CR2 寄存器的 CAL 位启动校准。一旦校准结束, CAL 位被硬件复位,可以开始正
常转换。建议在上电时执行一次 ADC 校准。校准阶段结束后,校准码储存在 ADC_DR 中。
注意: 1
建议在每次上电后执行一次校准。
2
启动校准前, ADC 必须处于关电状态 (ADON=’0’) 超过至少两个 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的参数和模式,可以满足不同应用场景的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值