【STM32学习】模数转换器——ADC
- 零、参考
- 一、ADC转换耗时
- 二、转换模式
- 三、对某些寄存器的理解
- 1、ADC_CR2
- 2、ADC_SQRX
- 四、库函数注意事项
零、参考
STM32固件库(标准外设库)入门学习 第七章 ADC数模转换(一)
刘凯:STM32F103(一):ADC
通过上述的两个链接以及stm32的参考手册,应该可以把ADC理解的差不多了,接下来说一下自己对某些内容的理解。
一、ADC转换耗时
STM32 ADC转换速度与精度
对于AD转换所需要的时间,我们经常看到:Tconv = Sampling time + 12.5 cycles
总时间=采集时间+转换时间
采样时间是我们根据ADC_SMPR寄存器设置的,采样时间越长,精度越高
后面的12.5个ADC周期,表示转换时间,即由采集到的信息到转换出数据的时间。查询资料说是固定的。
二、转换模式
ADC有规则组和注入组,又有扫描、单次、连续、单多通道,很多很复杂,就做了如下表格,也进行了实验验证。
绿色表示可以使用该模式;
红色表示该模式无法正确转换出想要的结果;
蓝色表示使用该模式无意义;
规则组与注入组的区别,不在描述;简单的说,注入组就是比规则组优先级高的组,注入组一来,规则组必须停止,先让注入组转换,转换结束,规则组才能继续转换。所以,注入组是不支持连续转换的,如果它一直连续转换,岂不是规则组一直不能转换。
但是如果使用了“自动注入模式”,注入组是支持使用连续转换的(在此模式里,必须禁止注入通道的外部触发。)
对单通道而言,不用使用扫描模式,所以非扫描模式即可;
单次转换:假如开启了ADC通道1,每次有外部事件,就会转换一次;
连续转换:假如开启了ADC通道1,只要来一次外部事件,就会一直转换。又因为规则通道就一个数据寄存器,所以需要DMA传输数据;
对多通道而言,必须使用扫描模式。在非扫描模式下,只会转换第一个通道;
单次转换:假如开启了ADC通道1、2、3,每次有外部事件,就按照通道的转换顺序转换一次(顺序是由ADC_SQRX控制的);当然也需要DMA传输。
连续转换:假如开启了ADC通道1、2、3,只要来一次外部事件,就会一直按照通道的转换顺序转换:1->2->3->1->2->3…。当然也需要DMA传输。
对于注入组来说,最多能使用四个ADC通道,并且每一个通道都有自己的数据存储寄存器,所以并不需要DMA传输。
规则组和注入组是可以同时使用的。例如通道1、2设置为规则组,通道3、4设置为注入组。
对于转换模式如果还不清楚的话,可以看这个:ADC扫描模式理解
三、对某些寄存器的理解
1、ADC_CR2
在stm32的参考手册中,该寄存器的第20位:EXTTRIG:用于是否开启外部触发事件。
我一开始理解,ADC如果用软件触发的话,就不用开启该位,因为软件触发不算是外部,只有中断、定时器事件才算是外部事件。我错了,并不是这样的。
根据最上边的结构图也能看到,想要触发规则通道必须开启EXTTRIG。
根据EXTSEL位也能看出,111为软件触发,剩余的为中断和定时器事件,所以它指的外部事件全部都包括了。根据下图也能得到证实:
2、ADC_SQRX
ADC_SQR1、2、3,是用来设置规则组通道个数和扫描时的转换顺序。
我想要让通道几第几个转换,那么我就把它写到第几个转换的位置。
例如,在库函数中,通道1设定为第一个转换的,通道2设定为第二个转换的。
你可以去底层的寄存器配置看看。
四、库函数注意事项
我们常用的库函数中ADC的配置,红色处的两个框,是针对规则组设置的;绿色的是针对注入组设置的,它们两个是互不干扰的。
这个是针对ADC_CR2的位设置的,开始规则组(注入组)的转换,以及开启其可以启动规则组(注入组)转换的外部触发事件;