stm32学习总结(三十一)ADC实验

31.1 ADC 简介

ADC 即模拟数字转换器,英文详称 Analog-to-digital converter,可以将外部的模拟信号转换为数字信号。
STM32F4xx 系列芯片拥有 3 个 ADC,这些 ADC 可以独立使用,其中 ADC1 和 ADC2 还可以组成双重模式(提高采样率)。STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 19 个通道,可测量 16 个外部和 2 个内部信号源和 Vbat 通道的信号 ADC 中的各个通道的A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以以左对齐或者右对齐存储在16 位数据寄存器中。ADC 具有模拟看门狗的特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。、STM32F407 的 ADC 主要特性我们可以总结为以下几条:
1、可配置 12 位、10 位、8 位或 6 位分辨率;
2、转换结束、注入转换结束和发生模拟看门狗事件时产生中断
3、单次和连续转换模式
4、自校准
5、带内嵌数据一致性的数据对齐
6、采样间隔可以按通道分别编程
7、规则转换和注入转换均有外部触发选项
8、间断模式
9、双重模式(带 2 个或以上 ADC 的器件)
10、ADC 转换时间:最大转换速率为 2.4MHz,转换时间为 0.41us
11、ADC 供电要求:2.4V 到 3.6V
12、ADC 输入范围:VREF–≤VIN≤VREF+
13、规则通道转换期间有 DMA 请求产生
下面来介绍 ADC 的框图:
在这里插入图片描述
① 输入电压
在前面 ADC 的主要特性也对输入电压有所提及,ADC 输入范围 VREF–≤VIN≤VREF+,最终还是由 VREF–、VREF+、VDDA 和 VSSA 决定的。下面看一下这几个参数的关系,如图 31.1.2 所示:
在这里插入图片描述
从上图可以知道,VDDA 和 VREF+接 VCC3.3,而 VSSA 和 VREF-是接地,所以 ADC 的输入范围即 0~3.3V。R55 默认焊接,R54 默认不焊接。
关于PDR_ON功能:PDR_ON 引脚电平为低时, 内部电源监视器关闭;当 PDR_ON 引脚电平为高时,内部电源监视器使能。参考链接:STM32的PDR_ON引脚,比较好的解释(转载+补充)
② 输入通道
在确定好了 ADC 输入电压后,如何把外部输入的电压输送到 ADC 转换器中呢,在这里引入了 ADC 的输入通道,在前面也提及到了 ADC1 有 16 个外部通道和 3 个内部通道,而 ADC2和 ADC3 只有有 16 个外部通道。ADC1 的外部通道是通道 17、通道 18 和通道 19,分别连接到内部温度传感器、内部Vrefint和Vbat。外部通道对应的是图31.1.1中的ADCx_IN0、ADCx_IN1…ADCx_IN15。ADC 通道表见表 31.1.1 所示:
在这里插入图片描述
③ 转换顺序
当任意 ADCx 多个通道以任意顺序进行一系列转换就诞生了成组转换,这里就有两种成组转换类型:规则组和注入组。规则组就是图上的规则通道,注入组也就是图上的注入通道。为了避免大家对输入通道加上规则通道和注入通道理解有所模糊,后面规则通道以规则组来代称,注入通道以注入组来代称
规则组允许最多 16 个输入通道进行转换,而注入组允许最多 4 个输入通道进行转换。这里讲解一下规则组和注入组。
规则组(规则通道)
规则组,按字面理解,“规则”就是按照一定的顺序,相当于正常运行的程序,平常用到最多也是规则组。
注入组(注入通道)
注入组,按字面理解,“注入”就是打破原来的状态,相当于中断。当程序执行的时候,中断是可以打断程序的执行。同这个类似,注入组转换可以打断规则组的转换。假如在规则组转换过程中,注入组启动,那么注入组被转换完成之后,规则组才得以继续转换。
在这里插入图片描述
规则序列
规则组是允许 16 个通道进行转换的,那么就需要安排通道转换的次序即规则序列。规则序列寄存器有 3 个,分别为 SQR1、SQR2 和 SQR3。SQR3 控制规则序列中的第 1 个到第 6 个转换的通道;SQR2 控制规则序列中第 7 个到第 12 个转换的通道;SQR1 控制规则序列中第 13 个到第 16 个转换的通道。规则序列寄存器 SQRx 详表如表 31.1.2 所示:
在这里插入图片描述
在这里插入图片描述
从上表可以知道,当我们想把 ADC 的输入通道 1 安排到第 1 个转换,那么只需要在 SQR3寄存器中的 SQ1[4:0]位写入该 ADC 输入通道即写 1 处理即可。SQR1 的 SQL[3:0]决定了具体使用多少个通道。
注入序列
注入序列,跟规则序列差不多,都是有顺序的安排。由于注入组最大允许 4 个通道输入,所以这里就使用了一个寄存器 JSQR。注入序列寄存器 JSQR 详表如表 31.1.3 所示:
在这里插入图片描述
④ 触发源
在配置好输入通道以及转换顺序后,就可以进行触发转换了。ADC 的触发转换有两种方法:分别是通过软件或外部事件(也就是硬件)触发转换。
我们先来看看通过写软件触发转换的方法。方法是:通过写 ADC_CR2 寄存器的 ADON 这个位来控制,写 1 就开始转换,写 0 就停止转换,这个控制 ADC 转换的方式非常简单。
另一种就是通过外部事件触发转换的方法,有定时器和输入引脚触发等等。这里区分规则组和注入组。方法是:通过 ADC_CR2 寄存器的 EXTSET[2:0]选择规则组的触发源,JEXTSET[2:0]选择注入组的触发源。通过 ADC_CR2 的 EXTTRIG 和 JEXTTRIG 这两位去激活触发源。ADC3
的触发源和 ADC1/2 不同,这里需要注意,那么在框图里已经标记出来了。
⑤ 转换时间
STM32F407 的 ADC 总转换时间的计算公式如下:
TCONV = 采样时间 + 12 个周期
采样时间可通过 ADC_SMPR1 和 ADC_SMPR2 寄存器中的 SMP[2:0]位编程,ADC_SMPR2控制的是通道 0-9,ADC_SMPR1 控制的是通道 10~18。所有通道都可以通过编程来控制使用不同的采样时间,可选采样时间值如下:
⚫ SMP = 000:3 个 ADC 时钟周期
⚫ SMP = 001:15 个 ADC 时钟周期
⚫ SMP = 010:28 个 ADC 时钟周期
⚫ SMP = 011:56 个 ADC 时钟周期
⚫ SMP = 100:84 个 ADC 时钟周期
⚫ SMP = 101:112 个 ADC 时钟周期
⚫ SMP = 110:144 个 ADC 时钟周期
⚫ SMP = 111:480 个 ADC 时钟周期
12 个周期是 ADC 输入时钟 ADC_CLK 决定的。ADC_CLK 是由 APB2 经过分频产生,分
频系数是由 RCC_CFGR 寄存器中的 PPRE2[2:0]进行设置,有 2/4/6/8/16 分频选项。
采样时间最小是 3 个时钟周期,这个采样时间下,我们可以得到最快的采样速度。举个例子,我们采用最高的采样速率,使用采样时间为 3 个 ADC 时钟周期,那么得到:TCONV = 3 个 ADC 时钟周期 + 12 个 ADC 时钟周期 = 15 个 ADC 时钟周期
一般 APB2 的时钟是 84MHz,经过 ADC 分频器的 4 分频后,ADC 时钟频率就为 21MHz。通过换算可得到:TCONV = 15 个 ADC 时钟周期 = (1/21000000) ∗ 15 s = 0.71us
⑥ 数据寄存器
ADC 转换完成后的数据输出寄存器。根据转换组的不同,规则组的完成转换的数据输出到ADC_DR 寄存器,注入组的完成转换的数据输出到 ADC_JDRx 寄存器。假如是使用双重模式,规则组的数据也是存放在 ADC_DR 寄存器。这两个寄存器的讲解将会在后面讲解,这里就不列出来了。
⑦ 中断
规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们在 ADC_SR 中都有独立的中断使能位,后面讲解 ADC_SR 寄存器时再进行展开。这里讲解一下,模拟看门狗中断以及 DMA 请求。
模拟看门狗中断
模拟看门狗中断发生条件:首先通过ADC_LTR和ADC_HTR寄存器设置低阈值和高值,然后开启了模拟看门狗中断后,当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。例如我们设置高阈值是 3.0V,那么模拟电压超过 3.0V 的时候,就会产生模拟看门狗中断,低阈值的情况类似
DMA 请求
规则组和注入组的转换结束后,除了产生中断外,还可以产生 DMA 请求,把转换好的数据存储在内存里面,防止读取不及时数据被覆盖。

31.2 单通道 ADC 采集实验

STM32F407 的 ADC 在单次转换模式下(CONT 位为 0),只执行一次转换,该模式可以通过 ADC_CR2 寄存器的 ADON 位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入通道,但是必须先设置 EXTTRIG/JEXTTRIG 位)。
以规则通道为例,一旦所选择的通道转换完成,转换结果将被存在 ADC_DR 寄存器中,EOC(转换结束)标志将被置位,如果设置了 EOCIE,则会产生中断。然后 ADC 将停止,直到下次启动。

31.2.1 ADC 寄存器

⚫ ADC 控制寄存器 1(ADC_CR1)
在这里插入图片描述
该寄存器本章用到 SCAN 位,用于设置扫描模式,由软件设置和清除,如果设置为 1,则使用扫描模式,如果为 0,则关闭扫描模式。在本章实验中使用的是非扫描模式。在扫描模式下,由 ADC_SQRx 或 ADC_JSQRx 寄存器选中的通道被转换。如果设置了 EOCIE 或 JEOCIE,只会在最后一个通道转换完成后才会产生 EOC 或 JEOC 中断。ADC(模数转换器)的扫描模式是一种工作模式,用于连续地转换多个通道的模拟输入信号。通过扫描模式,ADC 可以按照一组预定义的通道顺序,依次对每个通道进行模拟-数字转换。
⚫ ADC 控制寄存器 2(ADC_CR2)
在这里插入图片描述
该寄存器我们针对性的介绍一些位:ADON 位用于开关 AD 转换器。而 CONT 位用于设置是否进行连续转换,我们使用单次转换,所以 CONT 位必须为 0。CAL 和 RSTCAL 用于 AD 校准。ALIGN 用于设置数据对齐,我们使用右对齐,所以该位设置为 0。EXTSEL[3:0]用于选择启动规则转换组转换的外部事件,我们这里使用的是软件触发(SWSTART),所以这里设置这3 位为 111。SWSTART 位用于开始规则通道的转换,我们每次转换(单次转换模式下)都需要向该位写 1。
⚫ ADC 采样事件寄存器 1(ADC_SMPR1)
在这里插入图片描述
⚫ ADC 采样事件寄存器 2(ADC_SMPR2)
在这里插入图片描述
这里结合两个 ADC 采样事件寄存器进行讲解,这两个寄存器用于设置通道 0~18 的采样事件,每个通道占用 3 个位。
对于每个要转换的通道,采样事件建议尽量长一点,以获得较高的准确度,但是这样会降低 ADC 的转换速率。
⚫ ADC 规则序列寄存器 1
ADC 规则序列寄存器共有 3 个,这几个寄存器的功能都差不多,这里我们仅介绍一下 ADC
规则序列寄存器 1(ADC_SQR1),描述如图 31.2.1.5 所示:
在这里插入图片描述
L[3:0]:用于存储规则序列的长度,取值范围:0-15,我们这里只用了一个,所以设置这几位的值为 0。其他的 SQ13-SQ16 则存储了规则序列中的第 13~16 通道的编号(编号范围:0~18)。另外两个规则序列寄存器同 ADC_SQR1 大同小异,这里就不再介绍了,要说明一点的是:我们选择的是单次转换,所以只有一个通道在规则序列里,这个序列就是 SQ1,通过 ADC_SQR3 的最低 5 位(也就是 SQ1)设置。
⚫ ADC 规则数据寄存器(ADC_DR)
在这里插入图片描述
在规则序列中 AD 转换结果都将被存在这个寄存器里面,而注入通道的转换结果被保存在ADC_JDRx 里面。该寄存器的数据可以通过 ADC_CR2 的 ALIGN 位设置左对齐还是右对齐。在读取数据的时候要注意。
⚫ ADC 状态寄存器(ADC_SR)
在这里插入图片描述
该寄存器保存了 ADC 转换时的各种状态。这里我们要用到的是 EOC 位,我们通过该位来决定是否此次规则通道的 AD 转换已经完成,如果完成我们就从 ADC_DR 中读取转换结果,否则等待转换完成。
31.2.2 硬件设计

  1. 例程功能
    使用 ADC1 采集通道 5(PA5)上面的电压,在 LCD 模块上面显示 ADC 转换值以及换算成电压后的电压值。使用杜邦线将 P11 的 ADC 和 RV1 连接,使得 PA5 连接到电位器上,然后将 ADC 采集到的数据和转换后的电压值在 TFTLCD 屏中显示。用户可以通过调节电位器的旋
    钮改变电压值。LED0 闪烁,提示程序运行。
  2. 硬件资源
    1)LED 灯
    LED0 – PF9
    LED1 – PF10
    2)串口 1(PA9/PA10 连接在板载 USB 转串口芯片 CH340 上面)
    3)正点原子 2.8/3.5/4.3/7 寸 TFTLCD 模块(仅限 MCU 屏,16 位 8080 并口驱动)
  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值