关于STM32的ADC的一些重要特点需要记住:
1)STM32F103系列至少有2个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率);
2)STM32的ADC是12位逐次逼近型的模数转换器,一共有18个通道,可以测量16个外部信号和2个内部信号源;
3)每个通道的ADC可以在单次、连续、扫描或者间断模式下进行;
4)前面讲过STM32的ADC是12位的,结果存储在16位的数据寄存器中,有4位用不到,所以ADC存在左对齐或右对齐的方式;
5)模拟看门狗允许应用程序检测输入电压是否超出用户定义的高低阈值;
6)STM32的ADC最大的转换速率为1MHz,也就是说最快转换时间为1us,为了保证ADC转换结果的准确性,ADC的时钟最好不超过14M。

规则组和注入组
STM32参考手册里ADC的框图很大,我把它分开来总结(不然放不下),研究内部结构之后感觉STM32的ADC还是挺强大的;

刚接触ADC时首先让人不好理解的地方是“注入组”“规则组”,我也从框图里把这部分截出来了,这部分的解释网上有很多,大部分都引用了那个测量温度的例子,大概意思就是有一些温度是我们要长期采集的(就用规则组),偶尔也要临时测量一些其他温度(就用注入组)。STM32的ADC分为这两个组也是考虑到现实应用的需求,有一些是常用采集,有一些是特殊采集。

stm32cubeMX里的ADC_stm32cubeMX里的ADC


接下来看看输入端口,有16路外部信号端口接在GPIO端口上,还有两路是内部信号(芯片内部自带的温度传感器和参考电平)。信号源都会进入一个多路选择开关(与之前整理的ADC原理正好对应),从而选择进入后面的通道。

stm32cubeMX里的ADC_ADC_02

stm32cubeMX里的ADC_框图_03


ADC的模拟看门狗

STM32的ADC中增加了模拟看门狗主要是出于对安全性的考虑,看门狗可以监测输入信号的电压,我们可以设置最高和最低电压阈值,如果输入的信号电压超出了阈值就会产生中断。有些突发状况下,电压会突然下降,这时看门狗能够迅速的作出反应产生中断,便于CPU及时处理(保存数据或者报警等)。看门狗的监测是不经过ADC,反应速度就要快得多。

stm32cubeMX里的ADC_框图_04


ADC的触发

STM32的ADC的触发可以是外部触发(例如按键或者其他控制信号之类),也可以是内部触发(定时器触发)

stm32cubeMX里的ADC_stm32cubeMX里的ADC_05


ADC的转换模式

1 单次转换模式:ADC只执行一次转换;

2 连续转换模式:转换结束之后马上开始新的转换;

3 扫描模式:ADC扫描被规则通道和注入通道选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

4 间断模式:由触发信号启动新一轮的转换,直到转换完成为止