0、ADC功能框图
1、ADC的电源
1.1、工作电源
VSSA=VSS,VDDA=VDD,简单来说,通常stm32是3.3V,ADC的工作电源也是3.3V;
1.2、参考电压
VREF+和VREF-并不一定引出,取决于封装,如果没有引出则VREF+连接到VDDA、VREF-连接到VSSA。
在不要求精度的情况下,VREF+可直接接到VDDA,想要精确测量,可外接基准源(比如TL431);
附一个精确的参考电压3.3V的电路,R4和R5之间是2.5V,所以VREF+等于2.5V*(2.4K+7.5K)/7.5K=3.3V; (误差来源:431基准源的2.5V,R4和R5电阻的精度)
1.3、输入模拟电压
ADC 输入范围:VREF-≤VIN ≤ VREF+
通常VREF+是3.3V,那么输入的引脚电压就要在0V~3.3V之间,对应这分辨率下的上下限。
比如12位分辨率,就是0V~3.3V对应AD值是0~4095.
2、ADC的通道
2.1、ADC输入的19个通道
16 个来自GPIO端口ADCx_IN1~IN15;
3个内部通道,1个内部温度传感器、1个VREFINT、1个接到 VBAT引脚 。(这3个通道只在主ADC1**外设上可用)
ADCx_IN1~IN15,ADC是有3个的,ADC1、ADC2、ADC3,所以ADCx_IN1~IN15并不意味着只有16个IO口,例如stm32f407igt6如下:
2.2、规则通道和注入通道
2.2.1、规则/注入通道和上面19个通道的关系
看框图,不管是规则通道和注入通道,都是19通道中经过复选其中的1个通道。
2.2.2、1次只能转换1个通道,如何利用多个通道?
按照事先配置的顺序去执行,比如你想转换ADC1_IN2、ADC1_IN10、ADC1_IN5,那么就是这3个通道轮流,就可以检测到多个通道了,这就是序列。
既然为序列,那就有长度和顺序,由寄存器来设置。
规则序列寄存器(最多16个通道):ADC_SQR1、ADC_SQR2、ADC_SQR3
注入序列寄存器(最多4个通道):ADC_JSQR
2.2.3、为什么要有注入通道?
比如通常只想检测ADC1_IN2、ADC1_IN10、ADC1_IN5,但当有某个事件发生时,你想去看一下ADC1_7的值,注入通道相当于插队/中断,停下规则通道的转换,去转换注入通道,完成后再继续规则通道;
除了上面这种特定事件的触发,还有一种叫"自动注入",在规则通道转换完之后自动去转换注入通道,目的是加长检测序列,16+4相当于最多可支持20个序列;
2.2.4、如何启动规则/注入通道转换
软件触发、事件触发(定时器触发、IO口触发);
功能框图中蓝紫色下方的部分就是事件触发的具体可选项;
3、工作模式
下面的单次、连续、扫描、不连续转换有些可以组合使用。
首先看两个寄存器字段,SWSTART和CONT。
SWSTART,软件置1开始转换,然后硬件清0。
CONT,软件置1和清0,置1后会一直转换。
3.1、单次转换(CONT = 0)
不管规则通道里有几个通道,当前转换完之后就会停止。
如果是开启了扫描模式,那么第一个通道转换完停止后,下一次开启转换SWSTART会转换第二个通道。
如果没有开启扫描模式,那么下一次开启转换SWSTART会继续转换第一个通道。
3.2、连续转换(CONT = 1)
不管规则通道里有几个通道,当前转换完之后立刻开启下一次转换。
如果是开启了扫描模式,那么第一个通道转换完,开始第二个通道直到最后一个通道,并且继续下一轮转换。
如果没有开启扫描模式,那么会不断转换第一个通道。
3.3、扫描模式
逐个扫描规则/注入序列中的通道。
如上所述,扫描模式可以搭配单次转换、连续转换。
3.4、不连续转换模式
每次触发转换规则组/注入组中的一部分,规则/注入序列转换到最后一个产生EOC.
由于是每次触发,所以对于单次转换CONT = 0,如果配置为连续转换就失去了不连续转换模式的意义。