参考电压
分辨率
分辨率是ADC能够区分的最小电平的大小,分辨率通常以位数表示,例如:8位ADC、10位ADC、12位ADC等等,可以通过ADC_CR1.RES位进行配置。
输入通道
ADC通道指的是将模拟信号输入到ADC控制器的单个输入路径或者是信号通道,通常,一个ADC控制器可以具有多个输入通道,每个通道都可以连接到一个模拟信号源。
STM32F407上有三个ADC
外部通道:每个ADC控制器都有16个,来自外部的GPIO端口。
内部通道:只有ADC1控制器具有,有3个内部通道,通道16连接的是芯片内部的温度传感器;通道17连接的是芯片内部的参考电压;通道18连接的是电池或者是其它电源采集VBAT通道。
通过ADC通道进行输入的模拟电压的范围,VREF-≤ VIN ≤VREF
转换序列
当多个ADC 通道,以任意顺序进行转换时,就有了转换序列的概念。既然是序列,那么就有长度和顺序。长度:指的就是我们需要转换的通道个数;顺序:指的就是想以什么样的顺序转换需要转换的通道。转换序列有两种:规则序列和注入序列。
规则序列
规则转换序列可设置的长度最大为16,从规则序列1(SQ1),到规则序列16(SQ16),长度最大为16,所以,规则序列中最多可以放入16个通道进行转换。规则序列的转换顺序为,从规则序列1(SQ1)开始,依次进行转换,转换的个数就是我们设置的长度。
规则序列的设置
例如我们想转换通道0(IN0)、通道3(IN3)和通道15(IN15)三个通道,并且按照先转换通道3(IN3),再通道0(IN0),最后再转换通道15(IN15)的顺序进行转换,那就根据需要,设置规则序列相关寄存器,具体设置方法如下:
1、设置需要转换的规则序列长度(通过ADC_SQR1.L位)
当规则转换序列的长度设置为3时,规则序列的转换顺序和长度如 下侧图示:
2、为规则序列添加转换通道(通过ADC_SQRx.SQRn位)
ADC_SQRx寄存器有三个,ADC_SQR1、ADC_SQR2、ADC_SQR3,由于给规则序列添加需要转换的通道。
ADC_SQR3寄存器用于为规则序列1(SQ1)到序列6(SQ6)设置转换通道。
ADC_SQR2寄存器用于为规则序列7(SQ7)到序列12(SQ12)设置转换通道。
ADC_SQR1寄存器用于为序列13(SQ13)到序列16(SQ16)设置转换通道。
注入序列
注入序列的长度最大为4,从注入序列1(JSQ1),到注入序列4(JSQ4),长度最大为4,所以,注入序列中最多可以放入4个通道进行转换。注入序列的转换顺序与设置的注入序列长度有关。
注入序列的设置
例如我们想转换通道0(IN0)、通道3(IN3)和通道15(IN15)三个通道,并且按照先转换通道3(IN3),再通道0(IN0),最后再转换通道15(IN15)的顺序进行转换,那就根据需要,设置规则序列相关寄存器,具体设置如下:
1、注入序列的转换长度由ADC_JSQR.JL位设置
通过ADC_JSQR.JL位,设置注入序列转换长度为3。
2、为注入序列添加转换通道,由ADC_JSRQ.JSQx位设置
ADC_JSRQ.JSQ4位用于给注入序列4_JSQ4添加转换的通道
ADC_JSRQ.JSQ3位用于给注入序列3_JSQ3添加转换的通道
ADC_JSRQ.JSQ2位用于给注入序列2_JSQ2添加转换的通道
ADC_JSRQ.JSQ1位用于给注入序列1_JSQ1添加转换的通道
转换触发源
软件触发
规则序列的软件触发:当ADC控制器被使能后,若ADC_CR2.SWSTART位被写入1时,即可触发开始对规则序列中的通道进行转换。转换一旦开始,ADC_CR2.SWSTART位将会被控制器清0。
注入序列的软件触发:当ADC控制器被使能后,若ADC_CR2.JSWSTART位被写入1时,即可触发开始对注入序列中的通道进行转换。当转换开始时,ADC_CR2.JSWSTART位将会被控制器清0。
ADC控制器使能:简单来说就是给ADC控制器上电,通过向ADC_CR2.ADON位写1,即可上电ADC。
事件触发
外部触发转换,可以通过外部事件(例如,定时器捕获、EXTI中断线)触发转换,事件源可以通过ADC_CR2.EXTSEL(规则序列外部事件源选择)和ADC_CR2.JEXTSE(注入序列外部事件源选择)位进行选择。外部事件能够以所选的极性(上升沿、下降沿、上升和下降沿)触发转换。
注入序列存在的意义?
| 特性 | 触发注入模式 | 自动注入模式 (连续转换) |
|---|---|---|
| JAUTO 位状态 | 0 (必须) | 1 (必须) |
| 触发方式 | 外部触发 / 软件触发 | 规则通道完成后自动触发 |
| 连续转换 | ❌ 不支持 | ✅ 支持 (配合 CONT=1) |
| 典型应用 | 事件驱动型采样 | 周期性规则 + 注入采样 |
| 数据处理 | 每次触发后处理一次 | 连续数据流,需 DMA 或中断处理 |
转换时间
ADC时钟
ADC外设挂载在APB2外设时钟总线上。ADC具有两个时钟,其来源都是APB2。
ADC的时钟1:用于模拟电路的时钟ADCCLK
此时钟决定了ADC通道的采样和转换的时间,此时钟来自于经可编程预分频器分频的APB2时钟,该分频器允许ADC在fpclk/2、fpclk/4、fpclk/6或fpclk/8下进行工作,分频器系数的选择可由ADC_CCR.ADCPRE位进行选择。但是需要注意的一点是:ADCCLK被允许的最大频率36MHz。
ADC的时钟2:用于数字接口的时钟
此时钟用于ADC控制器寄存器的读/写访问,此时钟等效APB2的时钟
可独立设置各通道的采样时间
扫描模式和非扫描模式
扫描模式的含义:
ADC 扫描模式是一种连续对多个输入通道进行转换的模式,这种模式下,ADC 会按照预先定义的顺序对多个输入通道轮流进行转换。
如果设置的序列长度大于1时,则为多通道转换,就需要使用扫描模式。
如果序列的长度为1时,则是单通道转换,单通道转换则不需要开启扫描模式。
注意:如果关闭了扫描模式,即使序列设置的长度大于1,ADC 仍然按照单通道进行转换。
扫描模式和非扫描模式的切换:
ADC的扫描模式和非扫描模式,由ADC_CR1.SCAN位进行控制ADC_CR1.SCAN= 0,禁止扫描模式,也就是使用非扫描模式ADC_CR1.SCAN= 1,使能扫描模式,也就是使用扫描模式。
单次转换模式和连续转换模式
连续转换模式的含义:
连续转换模式,指的是ADC 按照序列设置的长度,完成一次序列的转换后,回到序列头开始新一轮的转换。
注意:触发注入无法进行连续转换,注入序列想要连续转换的唯一例外情况是使用自动注入,将注入序列配置为在规则序列之后,自动转换。
单次转换模式的含义:
ADC 的单次转换模式,是指ADC 按照序列设置的长度,完成一次序列的转换后,ADC 停止。
数据寄存器和数据对齐
数据寄存器
数据寄存器有两类:一类是规则数据寄存器ADC_DR,另一类就是注入数据寄存器ADC_JDRx(x为1到4)。
规则数据寄存器只有一个,有效长度是16bit,用于存储规则序列中完成转换的通道的数据。规则序列中,设置的所有需要转换的通道,共用一个数据寄存器ADC_DR。
注入数据寄存器则有四个,有效长度是16bit,ADC_JDR1、ADC_JDR2、ADC_JDR3、ADC_JDR4,用于存储注入序列中通道的转换结果。ADC_JDRx中存储的数据与注入序列转换的先后顺序有关,ADC_JDR1用于存储注入序列中的第一个转换,ADC_JDR2用于存储注入序列中的二个转换,以此类推。
数据对齐
数据对齐,其实就是ADC 转换完成的结果,在数据寄存器中的存储方式,对齐方式有两种:左对齐和右对齐。数据寄存器的有效位是16 位,但是,ADC 转换出来的数字量实际占用的位数与分辨率有关,比如12 位ADC,只需要使用12位0和1的组合进行表示,12 位的数据,存储到16 位的数据寄存器中,也就规定了两种存储方式。一般常使用右对齐。
状态寄存器
模拟看门狗
各种模式组合
单次转换模式+非扫描模式
连续转换模式+非扫描模式
注意:触发注入无法进行连续转换,注入序列仅在自动注入模式下,可进行连续转换。
单次转换模式+扫描模式
连续转换模式+扫描模式