目录
一、ADC简介
二、逐次逼近型ADC
三、ADC基本结构图
四、规则组的四种转换模式
五、转换时间
对GPIO来说,它只能读取引脚的高低电平,使用了ADC模数转化器之后,就可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量,就能得到引脚输入的具体电压是多少了。
ADC模数转化器就相当于一个电压表,把引脚的电压值测出来,放入一个变量中,这就是ADC的作用。
一、ADC简介
模拟-数字转换器简称ADC(Analog-Digital Converter),它可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。
数字-模拟转换器简称DAC,可以将数字变量转化成模拟电压,主要应用于波形生成(信号发生器、音频解码芯片)等。
PWM的功能与DAC相似,它只有完全导通和完全断开两种状态,在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景,使用PWM来等效模拟量,是比DAC更好的选择,且PWM电路更简单,而且更常用。
STM32中的ADC是12位逐次逼近型ADC,1us转换时间。
ADC还有两个关键参数,分别是分辨率和转换时间(转换频率)。
分辨率就是用多少位来表示,这里12位,分辨率的表示范围就是0~2^(12-1),即量化结果的范围是0~4095,位数越高,量化结果越精细,对应分辨率就越高。
AD转换是需要一小段时间的,这里1us表示从AD转换开始到产生结果,需要花费1us的时间,对应AD的转换频率是1MHz,这个就是STM32的最快转换频率。
输入电压范围:0~3.3V,转换结果范围:0~4095
输入电压一般要求是在芯片供电的正极和负极之间变化,输入0-3.3V,经过AD转换后,就得到最小值0,最大值4095,中间也都是一一对应的线性关系。
ADC模数转换器共有16个输入通道,可测量16个外部和2个内部信号源。
16个外部信号源就是16个GPIO口,在引脚上直接接模拟信号就可以,不需要任何额外的电路,引脚就可以测量电压值。
两个内部信号源分别是内部温度传感器和内部参考电压。
温度传感器可以测量CPU的温度,内部参考电压是一个1.2V左右的基准电压,这个基准电压不会随外部供电变化而变化,如果芯片的供电不是标准的3.3V,测量外部引脚的电压就会错误,这时就可以读取基准电压进行校准,就能得到正确的电压值了。
STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道,两个内部信号源温度传感器和内部参考电压都在ADC1上。
ADC12_IN0的意思是ADC1和ADC2的IN0都在PA0引脚上。
二、逐次逼近型ADC
输入部分:给地址锁存和译码一个通道的地址,就能让通道选择开关,选择其中一个通道打开。
比较部分:通过电压比较器,它可以判断两个输入信号电压的大小关系,输出一个高低电平,指示电压谁大谁小。它的两个输入端,一个是外部通道输入未知编码的电压,一个是DAC输出已知编码的电压,它俩同时输入到比较器,进行大小判断。如果DAC输出的电压比较大,就调小DAC数据;如果DAC输出电压比较小,就调大DAC数据,直到DAC输出电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据了,这个电压调节的过程就是逐次逼近寄存器SAR来完成的。
为了最快找到未知电压的编码,通常是采用二分法来进行查找,比如8位的ADC,那编码就是0~255,第一次输入时,就给255的一半128进行比较,如果DAC大了,第二次比较就给128的一半64进行比较,以此类推。这些比较数据正好是二进制的每一位位权,这个判断过程就相当于是从高位到低位依次判断是1还是0的过程。
三、ADC基本结构图
左边是输入通道,包括16个GPIO外部输入通道和两个内部通道。
进入AD转换器后,里面有两个组,分别是规则组和注入组,规则组最多可以同时选中16个通道进行比较,但是只能转换输出其中一个通道内的数据,因此规则组可以配合DMA数据转运来使用,DMA可以转运选中的其他多个通道内的数据,防止数据被覆盖。
注入组最多可以同时选择4个通道进行比较,也能同时输出4个通道内的数据到AD数据寄存器。
触发控制提供开始转换信号,它有软件触发(调用函数)和硬件触发(定时器和外部中断)。
上面可以布置一个模拟看门狗,用于监测转换结果的范围,如果超出设定的阈值,就通过中断输出控制,向NVIC申请中断。
规则组和注入组转换完成后,会有一个EOC信号,它会置一个标志位,最终也可以向NVIC申请中断。
最后右下角还有一个开关控制,在库函数中就是ADC_Cmd函数,用于给ADC上电。
AD初始化步骤:
(1)开启RCC时钟,包括ADC和GPIO;
(2)ADC的时钟,ADCCLK需要配置一下;
(3)配置GPIO,改成输入模式;
(4)配置多路开关,把左边通道接入到右边的规则组列表中;
(5)配置ADC转换器;
(6)调用ADC_Cmd函数,开启ADC;
(7)对ADC进行校准,来减少误差。
四、规则组的四种转换模式
1、单次转换,非扫描模式
上图列表就是规则组里能选中的通道,在非扫描模式下,这个列表只有第一个序列1的位置有效,规则组同时选中一组(16个通道)就退化为简单地选中一个地方式了,序列1的位置可以指定想要转换的通道,触发后,ADC就会对这个通道2进行模数转换,过一小段时间后,转换结果就会放在数据寄存器中,同时给EOC标志位置1。如果需要再转换,就得再次触发ADC进行模数转换。
2、连续转换,非扫描模式
它与上一种方式的不同之处在于,在一次转换结束之后,它的转换不会停止,而是立刻开始下一轮的转换,一直持续下去。
3、单次转换,扫描模式
这里也是单次转换,因此再每次转换后,都会停下来,需要触发才能开始。
这个扫描模式可以同时选择多个通道,通道数量也是可以指定的,触发之后,它就会依照序列号,依次对通道进行AD转换,转换结果都放在数据寄存器了,为了防止数据被覆盖,需要用DMA及时将数据挪走。7个通道转换完成后,才会产生EOC标志位置1,转换结束。然后需要转换,得再次触发ADC进行模数转换。
4、连续转换,扫描模式
这个模式功能跟上个模式一致,就是触发一次就会自动一直触发,会一直连续转换。
在扫描模式得情况下,还有一种模式,叫间断模式,它的作用是在扫描过程中,每隔几个转换,就暂停一次,需要再次触发,才能继续。
ADC1和ADC2的外部触发方式,其中包括定时器触发、外部引脚触发和软件触发,选择哪种触发方式,通过控制最右边寄存器可以选择对应方式。
五、转换时间
AD转换的步骤包括采样保持、量化编码两步。
采样保持:在量化编码前,需要设置一个采样开关,打开采样开关,收集外部电压,比如可以用一个小容量的电容存储这个电压,存储好了以后,断开采样开关,再进行后面的量化编码,这样在量化编码期间,电压就能够始终保持不变,这样才能精确地定位未知电压的位置;
采样保持的过程中,需要闭合采样开关,过一段时间再断开,这里就会产生一个采样时间。
量化编码:是ADC逐次比较(AD模数转换)的过程,这个需要花一段时间,位数越多,花费的时间就越长。
STM32 ADC的总转换时间为:T_CONV = 采样时间 + 12.5个ADC周期
采样时间就是采样保持花费的时间,采样时间越大,越能避免一些毛刺信号的干扰,转换时间也会相应延长;
12.5个ADC周期是量化编码花费的时间,ADC是12位的,因此需要花费12个周期,这里0.5个周期是一些其他事情花费的时间。
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期。T_CONV = 1.5 + 12.5 = 14个ADC周期
ADC周期就是从RCC分频过来的ADCCLK,ADCCLK最大为14MHz。
转换时间= N个ADC周期/ADCCLK = 14/14MHz = 1us