STM32的ADC详解

目录

一、ADC简介

二、ADC的时钟

三、ADC特性

四、ADC功能说明

五、规则通道和注入通道

1.规则通道

2.注入通道

3.区别

六、数据寄存器

1.右对齐

2.左对齐

七、转换模式

1.单次转换模式

2.续转换模式

3.扫描模式

4.区别

八、程序实现

1.需求

2.ADC初始化

3.AD采集


一、ADC简介

ADC是模拟数字转换器(Analog to Digital Converter),是一种将模拟量(如电压值、光敏电阻阻值、热敏电阻阻值等)转换为数字量的设备。

二、ADC的时钟

ADC有两个时钟方案,一个是针对数字电路的,一个是根据模拟电路的。

模拟电路的时钟:ADCCLK,所有 ADC 共用,此时钟来自于 APB2 时钟,该预分频器允许 ADC 在 fPCLK2 /2、/4、/6 或 /8 下工作。

数字接口的时钟:此时钟等效于 APB2 时钟。可以通过 RCC APB2 外设时钟使能RCC_APB2ENR为每个 ADC 使能/禁止数字接口的时钟。

三、ADC特性

STM32F4的ADC是12位逐次逼近型的模拟数字转换器,具有多达19个复用通道,可测量来自16个外部源、2个内部源通道的信号。ADC的结果存储在一个左对齐或者右对齐的16位数据寄存器中。STM32F4系列有3个ADC,这些ADC可以独立使用,也可以使用双重或者三重模式来提高采样率

ADC的主要特性包括

(1)可配置12位、10位、8位或6位分辨率

(2)在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断

(3)支持单次和连续转换模式

(4)自动将通道0转换为通道“n”的扫描模式

(5)数据被存储在16位数据寄存器中,数据对齐以保持内置数据一致性

(6)可独立设置各通道采样时间,以及外部触发器选项。

(7)STM32F4的ADC还具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或者下限。

四、ADC功能说明

VREF是ADC的的参考电压,VDDA是ADC的供电引脚,ADCx_IN0-ADCx_IN15代表16个外部通道,温度传感器、VREFINT、VBAT代表3个内部通道,然后被分出了16个规则通道和和4个注入通道。

五、规则通道和注入通道

1.规则通道

每个ADC存在16个规则通道,规则通道可以理解为就是普通的转换通道,通常我们在没有配置注入转换通道的情况下,主要使用的就是这个通道。规则通道的转换结果储存在规则数据寄存器(ADC_DR)中,所有规则通道的转换结果均共用此规则数据寄存器,因此为避免数据丢失,在每个通道转换完毕时应尽快将转换结果读出。

2.注入通道

每个ADC存在4个注入通道,注入通道可以理解为一种中断或插入的通道,它可以在规则通道转换的时候强行插入要转换的通道,注入通道可以中断规则通道的转换,并在注入通道组转换完成后,规则通道组的规则转换会从上次中断的规则转换处恢复。每个注入通道均有一个用于储存转换结果的注入数据寄存器(ADC_JDRx),所以他们的转换结果互不影响。

3.区别

 规则通道适合于需要连续、大规模数据采集的场景,而注入通道则适用于需要快速响应、单次数据采集的情况。

六、数据寄存器

数据寄存器有16位,但是最多12位有效吗,ADC_CR2 寄存器中的 ALIGN 位用于选择转换后存储的数据的对齐方式,可选择左对齐和右对齐两种方式,读数后处理的方式也不一样。

1.右对齐

2.左对齐

七、转换模式

1.单次转换模式

  • 在单次转换模式下,ADC按照设定的配置执行一次转换,然后停止转换并等待进一步的触发。
  • 这种模式适用于需要单次获取转换结果的应用场景。
  • 在单次转换模式下,无论是规则通道还是注入通道,ADC都会执行一次转换然后停止。
  • 如果选择多个通道进行转换,并且没有启动扫描模式,那么ADC只会转换选定的第一个通道。

2.续转换模式

  • 在连续转换模式下,ADC在完成一次转换后自动开始下一次转换,无需外部触发。
  • 这种模式适用于需要持续采样的应用场景,如数据采集。
  • 在连续转换模式下,ADC会持续进行转换,直到被外部触发停止或复位。
  • 如果选择多个通道进行转换,并且启动了扫描模式,那么ADC会按照通道号的顺序对设置的多个通道进行连续转换。

3.扫描模式

  • 扫描模式是与通道选择相关的功能,而不是一个独立的转换模式。
  • 在扫描模式下,可以通过设置多个输入通道进行连续转换。
  • ADC将按照通道号的顺序对设置的多个通道进行转换,并将结果按顺序保存在对应的数据寄存器中。
  • 扫描模式通常与连续转换模式一起使用,以实现多个通道的连续采样和转换。

4.区别

  • 单次转换模式仅执行一次转换并停止。
  • 连续转换模式在完成一次转换后自动开始下一次转换,无需外部触发。
  • 扫描模式允许设置多个通道进行连续转换,并通常与连续转换模式一起使用。

八、程序实现

1.需求

我们用STM32F429的PA5来实现AD的采集,根据数据手册,我们得知PA5属于ADC1的通道5。

2.ADC初始化

设置ADC1,4分频,12位模式,右对齐等ADC基本参数。

ADC_HandleTypeDef ADC1_Handler;//ADC句柄
//初始化ADC
//ch: ADC_channels 
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{ 
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC1_Handler.Init.ScanConvMode=DISABLE;                      //非扫描模式
    ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC1_Handler.Init.ContinuousConvMode=DISABLE;                //关闭连续转换
    ADC1_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1 
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
    ADC1_Handler.Init.DMAContinuousRequests=DISABLE;             //关闭DMA请求
    HAL_ADC_Init(&ADC1_Handler);                                 //初始化 
}

//ADC底层驱动,引脚配置,时钟使能
//此函数会被HAL_ADC_Init()调用
//hadc:ADC句柄
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC1_CLK_ENABLE();            //使能ADC1时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();			//开启GPIOA时钟
	
    GPIO_Initure.Pin=GPIO_PIN_5;            //PA5
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

3.AD采集

我们用ADC1的通道5,所以传入参数ch=5,结果返回一次ADC规则组的转换结果。


//获得ADC值
//ch: 通道值 0~16,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
//返回值:转换结果
u16 Get_Adc(u32 ch)   
{
    ADC_ChannelConfTypeDef ADC1_ChanConf;
    
    ADC1_ChanConf.Channel=ch;                                   //通道
    ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
	
    HAL_ADC_Start(&ADC1_Handler);                               //开启ADC
	
    HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换
 
	return (u16)HAL_ADC_GetValue(&ADC1_Handler);	        //返回最近一次ADC1规则组的转换结果
}

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千千道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值