声明:本篇博客的主要目的是对STM32F4系列单片机ADC外设的要点和疑难点进行总结整理(因为手册内容太多,容易眼花缭乱,抓不住重点),并且尽量避免成为手册的搬运工(否则还不如直接去看手册)。同时在博客的最后,会附上一些ADC常用功能的示例Demo (会随着时间不断完善添加)。
1 概述
(概述内容摘自手册)
1.1 ADC简介
12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。ADC 具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限或下限。
1.2 ADC主要特性
- 可配置 12 位、10 位、8 位或 6 位分辨率
- 在转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断
- 单次和连续转换模式
- 用于自动将通道 0 转换为通道“n”的扫描模式
- 数据对齐以保持内置数据一致性
- 可独立设置各通道采样时间
- 外部触发器选项,可为规则转换和注入转换配置极性
- 不连续采样模式
- 双重/三重模式(具有 2 个或更多 ADC 的器件提供)
- 双重/三重 ADC 模式下可配置的 DMA 数据存储
- 双重/三重交替模式下可配置的转换间延迟
- ADC 电源要求:全速运行时为 2.4 V 到 3.6 V,慢速运行时为 1.8 V
- ADC 输入范围:
- 规则通道转换期间可产生 DMA 请求
2 ADC框图
框图说明:
- ①处,是 ADC 的供电电源()和参考电源()。为了提高转换的精确度,ADC使用一个独立的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰;ADC的电源引脚为VDDA,电源地为VSSA,如果有VREF- 引脚(根据封装而定),它必须连接到VSSA,确保共地。ADC的参考电压都是通过Vref+提供的。100脚以上的型号,Vref+引到了片外,引脚名称为Vref+;64脚和小于64脚的型号,Vref+在芯片内部与VCC信号线相连,没有引到片外,这样AD的参考电压就是VCC上的电压。VDDA和VREF的电压范围请查阅手册。
- ②处,ADC的输入通道,F4系列单片机ADC共有19个通道,其中外部的16个通道就是框图中的ADCx_IN0到ADCx_IN15,这16个通道对应着不同的IO口,具体对应关系可以在手册或者CUBEMX配置界面获得。另外三个内部通道连接温度传感器、内部电压和电池电压。F4系列的不同型号略有差异,需要查阅手册确定。
- ③处,STM32F4将ADC的转换分为2类通道:规则通道和注入通道。规则通道相当于正常运行的程序,而注入通道,就相当于中断。注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。规则通道组最多包含16个通道,而注入通道组最多包含4个通道。
- ④处,是 ADC 的触发源,ADC转换可以由控制寄存器ADC_CR2的位ADON来启动,也可以由外部事件的触发来启动转换。使用控制寄存器启动时,很简单,写1开始转换;写0停止转换。使用外部事件来触发转换,这个触发包括内部定时器触发和外部IO触发。触发源的选择由ADC_CR2的EXTSEL[2:0]和JEXTSEL[2:0]位来控制,EXTSEL[2:0]用于规则通道的触发源,JEXTSEL[2:0]用于选择注入通道的触发源。如果使能了外部触发事件,我们还可以通过设置ADC控制寄存器2:ADC_CR2的EXTEN[1:0]和JEXTEN[1:0]来控制触发极性,可以有4种状态:禁止触发检测、上升沿检测、下降沿检测以及上升沿和下降沿均检测。
- ⑤处,ADC的时钟源来源于ADC预分频器,是由PCLK2经过ADC Prescaler 得到。最大为36MHz,通常设置为21MHz。分频因子由ADC通用寄存器ADC_CCR的ADCPRE[1:0]设置,可设置的分频系数有2、4、6和8。
- ⑥处,当ADC转换完成后,根据转换组的不同,规则组的数据放在ADC_DR寄存器,注入组的数据放在JDRx寄存器。如果使用双重或者三重模式那规则组数据是存放在通用寄存器ADC_CDR内的。规则通道有16个,规则寄存器只有一个,如果使用多通道转换,那转换的数据就全都挤在了DR里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉,所以当通道转换完成后就应该吧数据取走。或者开启DMA模式,将数据传输到内存里面,常用的方法是开启DMA传输。注入组有4个通道,相应的寄存器也有4个,这个不会有数据覆盖问题。
- ⑦处,数据转换结束后,可以产生中断,中断分为四种:规则通道转换结束中断、注入转换通道转换结束中断、模拟看门狗和溢出中断。模拟看门狗中断:当ADC转换的模拟电压低于阈值或者高于阈值时,就会产生中断,前提是我们开启了模拟看门狗中断。溢出中断:如果DMA传输数据丢失,会置位ADC状态寄存器ADC_SR和OVR位,如果同时使能了溢出中断,那在转换结束后会产生一个溢出中断。规则和注入通道转换结束后,除了产生中断,还可以产生DMA请求,将转换好的数据直接存储在内存里面。
3 功能说明
3.1 单次转换、连续转换与扫描模式的关系
举例说明如下:用ADC1 规则通道的顺序为CH0,CH1,CH2,CH3
不启动SCAN模式 | 单次转换模式 | 启动ADC1,则: 1,开始转换CH0(ADC_SQR的第一通道) 2,转换完成后停止,等待ADC的下一次启动,继续从第一步开始转换 |
连续转换模式 | 启动ADC1,则: 1,开始转换CH0(ADC_SQR的第一通道) 2,转换完成后回到第一步,继续转换 | |
启动SCAN模式 | 单次转换模式 | 启动ADC1,则: 1,开始转换CH0 2,转换完成后自动开始转换CH1 3,转换完成后自动开始转换CH2 4,转换完成后自动开始转换CH3 5,转换完成后停止,等待ADC的下一次启动。下一次ADC启动后从第一步开始转换 |
连续转换模式 | 启动ADC1,则 1,开始转换CH0 2,转换完成后自动开始转换CH1 3,转换完成后自动开始转换CH2 4,转换完成后自动开始转换CH3 5,转换完成后返回第一步,继续转换 |
- 开启扫描模式后 必须搭配DMA功能才能实现ADC的数据处理
3.2 注入通道管理
注入通道分为触发注入和自动注入两种方式,关于这两种方式的功能、特性和注意事项,手册上写的很清晰且没有歧义,这里不再多余描述,请直接查阅手册。
3.3 不连续采样模式(间断模式)
如果需要对多个ADC通道进行分组转换,组与组之间希望有可调的时间间隔。采样间断模式可能会比较方便。这块手册上也写的比较详细其且没有歧义。这里就不再过多描述。如果想详细了解,可以参阅手册或者点击这一篇博客。
3.4 采样时间计算
(这里直接摘自手册)
3.5 使用DMA时一些注意事项
- 开启ADC的DMA功能,建议在ADC校准之后进行。换句话说校准ADC前不要使能其ADC的DMA功能。尤其涉及到多通道ADC DMA传输时要注意这个次序。
- 如果使用ADC的DMA传输,在启动AD转换时,DMA需配置好且被使能待命。
- 在多通道ADC DMA传输时,经常出现因为缓冲区数据类型、源数据类型不一致导致的异常状况。这里主要是因为数据宽度不一致所导致的问题。
3.6 多重ADC模式
在具有两个或更多 ADC 的器件中,可使用双重(具有两个 ADC)和三重(具有三个 ADC)ADC 模式。在多重 ADC 模式下,通过 ADC1 主器件到 ADC2 和 ADC3 从器件的交替触发或同时触发来启动转换,具体取决于 ADC_CCR 寄存器中的 MULTI[4:0] 位所选的模式。
注意:
- 在多重 ADC 模式下,配置外部事件触发转换时,应用必须设置为仅主器件触发而禁止从器件触发,以防止出现意外触发而启动不需要的从转换。
- 不要在两个/三个 ADC 上转换同一通道(转换同一通道时,不允许两个/三个 ADC 采样时间 重叠)。
可实现以下四种模式:
- 注入同时模式
- 规则同时模式
- 交替模式
- 交替触发模式
也可按以下方式组合使用上述模式:
- 注入同时模式 + 规则同时模式
- 规则同时模式 + 交替触发模式
因为该部分内容手册描述清晰,没有歧义。所以下面对各种模式的功能、作用只做简要描述,具体配置、执行细节请查阅手册。
3.6.1 注入同时模式
此模式可转换注入通道组。外部触发源来自 ADC1 的注入组多路复用器(通过 ADC1_CR2 寄存器中的 JEXTSEL[3:0] 位进行选择)。同时触发可用于 ADC2 和 ADC3。
下图为4通道的注入同时模式下双重、三重ADC模式的功能示意图
3.6.2 规则同时模式
此模式式可用于规则通道组。外部触发源来自 ADC1 的规则组多路复用器(通过 ADC1_CR2 寄存器中的 EXTSEL[3:0] 位进行选择)。同时触发可用于 ADC2 和 ADC3。
下图为4通道的规则同时模式下双重、三重ADC模式的功能示意图
3.6.3 交替模式
此模式只能用于规则组(通常为一个通道)。外部触发源来自 ADC1 的规则通道多路复用器。
下图为一个通道的交替模式下双重、三重ADC模式的功能示意图
3.6.4 交替触发模式
此模式只能用于注入组。外部触发源来自 ADC1 的规则通道多路复用器。
下图为一个通道的交替触发模式下双重、三重ADC模式的功能示意图
3.6.5 其他复合模式
- 混合型规则/注入同时模式 (描述略,有需求可直接查阅手册)
- 规则同时 + 交替触发组合模式(描述略,有需求可直接查阅手册)
3.7 温度传感器
主要特性
- 支持的温度范围:—40 °C 到 125 °C
- 精度:±1.5 °C
逻辑框图
读取过程
- 略,请查阅手册。
3.8 关于中断的说明
STM32F4系列单片机ADC共有四个中断事件:
中断事件
|
事件标志
|
使能控制位
|
---|---|---|
结束规则组的转换
|
EOC
| EOCIE |
结束注入组的转换
|
JEOC
|
JEOCIE
|
模拟看门狗状态位置
1
|
AWD
|
AWDIE
|
溢出
(Overrun)
|
OVR
|
OVRIE
|
特别注意:
不少人可能对EOC中断有所困惑,EOC中断如果工作在多通道扫描模式下,究竟是每转换完一个通道就触发一次中断,还是转换完一整个序列才触发一次中断?这个是由ADC_CR2寄存器的EOCS位决定的,该EOCS位手册描述如下:
手册在对ADC_CR1寄存器的SCAN位(扫描模式)进行描述时,也提到了这一点:
同时,手册里指出,JEOC 中断仅在最后一个通道转换结束时生成。
3.9 寄存器
- 寄存器的一些特殊说明,后续会不定期进行补充。
3.10 勘误
- 这里会不定期补充一些勘误说明。
4 CubeMX界面
CubeMX关于ADC的配置界面如下面两图所示(这里使用的是STM32F405),基本上手册中的每一处描述都能在CubeMX上找到相应的配置选项,可以理解成图形化的芯片手册。
5 Hal库函数说明
对涉及ADC的Hal库函数逐个描述没有太大的意义,因为源码中的注释已经很详细了。也可以去查阅库文件夹下的.chm帮助文件(其实就是由源码注释直接生成的,内容一模一样)。这里主要对一些使用上的注意事项及常见问题进行补充说明。
(待补充)
6 DEMO地址
待补充
7 参考链接
-ADC电源相关
- https://blog.csdn.net/m0_38106923/article/details/103488569
- https://www.cnblogs.com/jieruishu/p/9023811.html
-ADC单次转换模式 连续转换模式 扫描模式
- https://blog.csdn.net/more_thinking/article/details/88788151?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-1-88788151.nonecase&utm_term=adc%E8%BF%9E%E7%BB%AD%E6%A8%A1%E5%BC%8F%20%E4%B8%8E%E6%89%AB%E6%8F%8F%E6%A8%A1%E5%BC%8F
- https://www.cnblogs.com/smilingfrog/p/5192324.html
- https://www.sohu.com/a/330452748_807475
-勘误及注意事项
- https://www.stmcu.org.cn/article/id-327948
-其他
- 硬石YS-F4Pro开发板开发手册_20190606
- STM32F4开发指南-HAL库版本_V1.2