十三、ADC模数转换器

程序:

本节课共有两个程序:1.AD单通道,2.AD多通道。

1.AD单通道。

面包板接一个电位器(滑动变阻器),用这个电位器产生一个0~3.3V连续变化的模拟电压信号,然后接到STM32 的PA0口上,用STM32内部的ADC读取电压数据显示在屏幕上。屏幕第一行显示AD转换后的原始数据,第二行显示经过处理后的实际电压值。往左拧电位器,AD值减小,电压值也减小(AD值最小是0,对应的电压是0V);往右拧AD值变大,对应电压值也变大。STM32 的ADC是12位的,故AD结果最大值是4095(2^12-1),对应电压是3.3V,这就是第一个程序的现象。

ADC的作用:

GPIO只能读取引脚的高低电平,要么是高电平,要么是低电平,只有两个值。使用了ADC之后,就可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量就可以知道引脚的具体电压。故ADC就是一个电压表,把引脚的电压值测出来,放在一个变量里。

2.AD多通道。

面包板接一个电位器(滑动变阻器),再接三个传感器模块(分别是光敏电阻、热敏电阻、反射红外模块),把他们的AO和模拟电压输出端,分别接在A1、A2、A3引脚,加上电位器总共四个输出通道,测出来的四个AD数据分别显示在屏幕上。第一行AD0反映电位器的值变化,左拧减小、右拧增大。光敏电阻看第二行AD1,遮挡光敏电阻,光线减小AD值增大;不遮挡光敏电阻,光线增大AD值减小。热敏电阻看第三行的AD2,用手热一下热敏电阻,温度升高AD值减小;移开温度降低AD值增大。反射红外传感器看第三行的AD3,手靠近有反光AD值减小;移开无反光AD值增大,这就是第二个程序的现象。

ADC(Analog-Digital Converter)模拟-数字转换器简介

ADC(Analog-Digital Converter)模拟-数字转换器,简称模数转换器或AD转换器。
(1)ADC可以将引脚上连续变化的模拟电压,转换为内存中存储的数字变量,建立模拟电路数字电路的桥梁。通过程序现象能看出STM32主要是数字电路(只有高低电平,没有几V电压的概念)。若想读取电压值,需要借助ADC模数转换器来实现。ADC读取引脚上的模拟电压,转化为一个数据存放在寄存器里,再把这个数据读取到变量里,就可以进行显示、判断、记录等操作。
ADC和DAC
ADC可以将模拟信号转换为数字信号,是模拟电路到数字电路的桥梁。DAC数字模拟转换器是,可以将数字变量转化为模拟电压,是数字到模拟的桥梁。还有一个数字到模拟的桥梁PWM,使用PWM来控制LED的亮度、电机的速度,这也就是DAC的功能。同时PWM只有完全导通和完全断开两种状态,这两种状态都没有功率的损耗,所以在直流电机调速这种大功率的应用场景,使用PWM来等效模拟量比DAC更好,且PWM电路更简单、更常用。PWM挤占了DAC的很多应用空间,目前DAC的应用主要是在波形生成这些领域,如信号发生器、音频解码芯片等,这些领域PWM还是不好替代的,STM32F103C8T6芯片没有DAC的外设。

(2)STM32的ADC是12位逐次逼近型的ADC,1us的转换时间。逐次逼近型是这个ADC的工作模式。12位和1us的转换时间涉及到ADC的两个关键参数:分辨率和转换时间。分辨率(一般用多少位来表示),12位AD值的表示范围是0到2^12-1,即0~4095。位数越高量化结果越精细,对应的分辨率越高。转换时间就是转换频率,AD转换需要花一小段时间,这里1us表示从AD转换开始到产生结果需要花1us的时间,对应AD转换的频率就是1MHz,是STM32AD的最快转换频率。若需要转换频率非常高的信号,要考虑一下转换频率是否够用;若信号频率比较低,这个最大1MHz的转换频率就够用了。

(3)输入电压范围:0到3.3V,转换结果范围:0~4095。ADC的输入电压一般要求在芯片供电的负极和正极之间变化。最低电压是负极0V,最高电压是正极3.3V,经过ADC转换之后,最小值是0,最大值是4095。0V对应0,3.3V对应4095,中间都是一一对应的线性关系。

(4)ADC有18个输入通道,可测量16个外部和2个内部信号源。外部信号源是16个GPIO口,直接在引脚上接模拟信号,不需要任何额外的电路,就直接能测定引脚,非常方便。2个内部信号源:内部温度传感器和内部参考电压。温度传感器可以测量CPU的温度,若电脑可以显示CPU温度,就可以用ADC读取电脑的温度传感器来测量;内部参考电压是1.2V左右的基准电压,基准电压不随外部供电电压变化。若某芯片的供电不是标准的3.3V,则测量外部引脚的电压可能不对,可以读取基准电压进行校准,从而得到正确的电压值。

(5)规则组和注入组两个转换单元。这是STM32 ADC的增强功能。普通的AD转换流程是启动一次转换读一些值,再启动再读值。但STM32的ADC比较高级,可以列个组一次性启动一个组,连续转换多个值。并且有两个组,一个用于常规使用的规则组,一个用于突发事件的注入组。

(6)模拟看门狗自动监测输入电压范围。ADC一般可以用于测量光线强度、温度这些值。若光线高于某个阈值、低于某个阈值,或温度高于某个阈值、低于某个阈值时,执行一些操作。高于某个阈值或低于某个阈值的判断用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当AD值高于它设定的上阈值或者低于下阈值时,它就会申请中断,在中断函数里执行相应的操作。不需要不断手动读值,再用if进行判断。

(7)STM32 F103C8T6 的ADC资源有ADC1、ADC 2(两个ADC),外设10个外部输入通道,最多只能测量10个外部引脚的模拟信号,上面(4)中说的16个外部信号源是这个系列最多有16个外部信号源。但是此芯片引脚比较少,有很多引脚没有引出,只有10个外部信号源。若想要更多的外部通道,可以选择引脚更多的型号,具体有多少通道还需要参考数据手册。

逐次逼近型ADC

(逐次逼近型ADC如何测电压的)
在这里插入图片描述
这是逐次逼近型ADC的内部结构,STM32的ADC原理和这个一样。这个图是ADC0809芯片的内部结构图,它是一个独立的8位逐次逼近型ADC芯片。以前单片机的性能还不是很强,需要外挂一个ADC芯片才能进行AD转换,ADC0809就是一款经典的ADC芯片。现在单片机的性能和集成度都有很大的提升,很多单片机内部集成了ADC外设,不用外挂芯片,引脚可以直接测电压。

输入部分:

首先,这个结构图的左上角,IN0~IN7这8路输入通道通过通道选择开关,选中其中一路输入到比较器的上方的输入部分进行转换。左下角是地址锁存和译码,想选中哪一路,就把通道号放在ADDA、ADDB、ADDC这三个脚上,然后给一个锁存信号,上面的通道选择开关对应的通路开关就可以自动拨好。左边的这部分相当于一个可以通过模拟信号的数据选择器,因为ADC转换是一个很快的过程,给一个开始信号几us就转换完成了。所以若想转换多路信号,不必设计多个AD转换器,只需要一个AD转换器再加一个多路选择开关,想转换哪一路,就拨一下开关选中对应通道,再开始进行转换。ADC0809只有8个输入通道,STM32内部的ADC有18个输入通道,对应这里就是一个18路输入的多路开关。

如何知道通道选择开关输出电压所对应的编码数据:

此时输入信号选好了,到了通道选择开关输出部分,如何知道电压对应的编码数据?这时使用逐次逼近的方法一一比较。这里有一个电压比较器,可以判断两个输入信号电压的大小关系,输出一个高低电平来指示谁大谁小。比较器的两个输入端:待测的电压和下面DAC的电压输出端。给DAC数模转换器一个数据,它能输出数据对应的电压,DAC内部是使用加权电阻网络来实现的转换(江协科技51单片机教程里的AD\DA集有具体描述)。所以,现在有一个外部通道输入的未知编码电压,和一个DAC输出的已知编码的电压,两个同时输入到电压比较器进行大小判断。若DAC输出的电压较大就调小DAC的数据,若DAC输出的电压较小就增大DAC的数据,直到DAC输出的电压和外部通道输入的电压近似相等。这样,DAC输入的数据就是外部电压的编码数据。

逐次逼近的过程:

这个电压调节的过程就是图中的逐次逼近SAR完成的。为了最快找到位置电压的编码,通常使用二分法进行寻找。比如这里是8位的ADC,编码就是0到255。第一次比较的时候给DAC输入255的一半(128)进行比较,看看谁大谁小;若DAC电压大了,第二次比较的时候就再给128的一半(64);若还大,第三次比较的时候就给32;若这次DAC电压小了;第四次就给32~64中间的值,后面继续这样依次进行下去,就能最快的找到未知电压的编码。这个过程若用二进制来表示,128、64、32这些数据正好是二进制每一位的位权,这个判断过程就相当于对二进制从高位到低位依次判断是1还是0的过程,这也是逐次逼近型名字的来源。对于8位的ADC从高位到低位依次判断8次,可找到未知电压的编码;对于12位的ADC就依次判断12次,这就是逐次逼近的过程。
这时,AD转换结束后,ADC的输入数据就是未知电压的编码,通过三态锁存缓冲器输出,8位三态锁存缓冲器有8根线,12位的就有12根线。
上面的EOC(end of convert)是转换结束信号;START是开始转换,给一个输入脉冲就开始转换;CLOCK是ADC时钟,因ADC内部是一步步进行判断的,需要时钟来推动这个过程。
下面V(ref+)和V(ref-)是DAC的参考电压。如给一个数据255,是对应5V还是3.3V,就由这个参考电压决定。这个DAC的参考电压也决定了ADC的输入范围,所以它也是ADC的参考电压。
最后是整个芯片电路的供电VCC和GND,通常参考电压的正极和VCC一样,会接在一起;参考电压的负极和GDN也一样,也接在一起。故一般情况下,ADC输入电压的范围和ADC的供电是一样的。

STM32的逐次逼近型ADC

在这里插入图片描述
STM32的ADC框图一般在手册里,手册里每个外设的最前面都有一个整体的结构图。

输入部分:

中间靠左是ADC的输入通道,16个GPIO口(0IN~IN15)和两个内部通道(内部温度传感器和Vrefint内部参考电压),总共18个输入通道,到达模拟多路开关后,指定我们想要选择的通道,然后多路开关的输出进入到模数转换器,这里数模转换器执行逐次比较的过程,转换结果放在上面的数据寄存器里,读取寄存器就知道ADC转换的结果。

输出部分和规则通道组和注入通道组:

在模拟多路开关输出部分,对于普通的ADC,多路开关一般只选中1个通道,选中某个通道、开始转换、等待转换完成、取出结果,这是普通的流程;但这里比较高级,可以同时选中多个通道,且在转换的时候分成两组通道(规则通道组和注入通道组),其中规则组一次性最多选16个通道,注入组一次可以选4个通道。这有什么用呢:举个例子,去餐厅点菜,普通的ADC指定一个菜,老板做好了上菜。而这里的ADC相当于是指定一个菜单,这个菜单最多可以填16个菜,直接将菜单递给老板,老板按照菜单的顺序依次做好一次性上完菜,这个菜单也可以只写一个菜,这样这个菜单就简化成普通模式了。这个菜单也有两种,一种是规则组,菜单可以同时上16个菜,但是这里的规则组只有一个规则通道数据寄存器,也就是桌子小最多只能放1个菜,若上16个菜,前15个菜都会被挤掉,只能得到第16个菜。所以对于规则组转换,若要使用这个菜单,最好配合DMA实现(DMA是一个数据转运小帮手,可以在每上一个菜之后,把这个菜挪到其他地方去,防止被覆盖)。所以,这个规则组虽然可以同时转换16个通道,但数据寄存器只能存一个结果,如果不想之前的结果被覆盖,就在转换完成后,尽快把结果拿走。注入组比较高级,相当于是餐厅的VIP座位,这个座位一次性最多可以点4个菜,且这里对应的注入通道数据寄存器有4个,可以同时上4个菜。注入组不用担心数据覆盖的问题。一般情况下,使用规则组就足够了,如果要使用规则组的菜单,再配合DMA转移数据,这样就不用担心数据覆盖的问题了。

规则组的操作

触发转换部分:

首先左下角是触发转换的部分,也就是START信号,开始转换。对于STM32的ADC,触发ADC开始转换的信号有两种:一种是软件触发,在程序中手动调用一条代码就可以启动;另一种是硬件触发,就是左下角的这些触发源(上面是注入组的触发源,下面是规则组的触发源),这些触发源主要来自于定时器,有定时器的各个通道,还有TRGO定时器主模式的输出。定时器的部分也介绍过,定时器可以通向ADC、DAC这些外设,用于触发转换。
由于ADC经常需要过一个固定时间段转换1次(如每隔1ms转换1次)。正常的思路就是用定时器每隔1ms申请1次中断,在中断里手动开启时转换,这样也是可以的。但是频繁进中断对程序有一定影响,若很多中断都需要频繁进入,就会影响主程序的执行;且不同中段之间由于优先级的不同,也会导致某些中断不能及时得到响应,若此时触发ADC的中断不能及时响应,那ADC的转换频率会受影响。所以对于这种需要频繁进中断,且在中断里只完成了简单工作的情况,一般都会有硬件的支持。这里可以给TIM3定1ms的时间,且把TIM3的更新事件选择为TRGO输出,再在图中ADC的触发源这里,选择开始触发信号为TIM 3的TRGO,这样TIM3的更新事件就能通过硬件自动触发ADC转换,整个过程不需要进中断,节省中断资源。这就是图中定时器触发的作用。当然图中ADC的触发源这里也可以选择外部中断引脚来触发循环,都可以在程序中配置。

电压部分

输入通道上面是V(ref+)、V(ref-)、VDDA、VSSA。V(ref+)和V(ref-)是ADC的参考电压,决定ADC输入电压的范围;VDDA和VSSA是ADC的供电引脚。一般情况下,V(ref+)接VDDA, V(ref-)接VSSA。STM32 F103C8T6芯片上没有V(ref+)和V(ref-)的引脚,在内部已经和VDDA、VSSA接在一起了。VDDA和VSSA是内部模拟部分(ADC、RC振荡器、锁相环等)的电源,在这里VDDA接3.3V,VSSA接GND。故ADC输入电压范围就是0~3.3V。

时钟部分

模数转换器右边是ADCCLK(ADC的时钟),也就是CLOCK,是用于驱动内部逐次比较的时钟,来自ADC预分频器,ADC预分频器来源于RCC(在时钟树里找一下,APB2时钟72MHz,通过ADC预分频器进行分频得到ADCCLK。这里的预分频器可以选择2、4、6、8分频,若选择2、4分频之后发现超出最大允许范围14MHz,所以预分频器只能选择6、8分频,在程序里要注意一下)。

剩余部分

继续看上面是DMA请求,这个就是用于触发DMA进行数据转运的。再往上就是两个数据寄存器,用于存放转换结果。上面还有模拟开门狗,它里面可以存一个阈值高限和阈值低限,若启动了模拟看门狗,且指定了看门的通道,则看门狗就会关注这个通道,一旦超过这个阈值范围了,就会乱叫啊,模拟看门狗事件就会在上面申请一个模拟看门狗的中断,最后通向NVIC。

补充

对于规则组和注入组,它们转换完成之后,也会有一个EOC转换完成的信号。EOC是规则组的完成信号,JEOC是注入组完成的信号,这两个信号会在状态寄存器里置一个标志位,读取这个标志位就能知道是不是转换结束了。同时这两个标志位也可以到NVIC申请中断,如果开启了NVIC对应的通道,它们就会触发中断。

STM32ADC内部结构图

在这里插入图片描述
左边是输入通道,16个GPIO口,再加2个内部的通道。然后进入AD转换器,AD转换器里有两个组(规则组和注入组)。规则组最多可以选中16个通道,注入组最多可以选择4个通道。转化的结果可以存放在AD数据寄存器里,规则组只有1个数据寄存器,注入组有1个。下面的触发控制提供了开始转换(START)信号,触发控制可以选择软件触发和硬件触发(硬件触发主要是来自于定时器),也可以选择外部中断的硬件。下面右边是来自于RCC的ADC时钟CLOCK,ADC逐次比较的过程就是由这个时钟推动的。上面布置了一个模拟看门狗,用于监测转换结果的范围:若超出设定的阈值,就通过中断输出控制向NVIC申请中断。另外,规则组和注入组转换完成后会有个EOC信号,这个信号会置一个标志位,也可以通向NVIC。最后,右下角有个开关控制,库函数ADC_ Cmd用于给ADC上电。

ADC通道和引脚复用的关系

引脚定义表

在这里插入图片描述
ADC的16个外部通道对应的GPIO口,ADC通道和引脚复用的关系可以通过引脚定义表看出来。在引脚定义表里可以看到ADC12_IN0对应PA0引脚、ADC12_IN1对应PA1引脚,下面的IN2、IN3、IN4、IN5、IN6、IN7、IN8、IN9依次对应PA2、PA3、PA4、PA5、PA6、PA7、PB0、PB1 ,这里只有IN0~IN9,共有10个通道,其他地方没有,所以此芯片只能有10个外部输入通道。ADC12_IN0的意思是ADC1和ADC2的IN0都在PA0上。下面全都是ADC12,说明ADC1和ADC2的引脚全都相同。
既然ADC1和ADC2都相同,ADC2有什么用呢?这里就涉及了ADC的高级功能:双ADC模式。双ADC模式就是ADC1和ADC2一起工作,两者配合组成同步模式、交叉模式等模式。如交叉模式,ADC1和ADC2交叉的对一个通道进行采样,这样就可以进一步提高采样率。(就像打拳一样,左手打一拳、右手打一拳、左手打一拳、右手打一拳,快速交叉的打拳,打击的频率比一个拳头打得快)。当然ADC1和ADC2也可以分开使用,分别对不同的引脚进行采样。

输入通道:

ADC的16个外部通道对应的GPIO口,ADC通道和引脚复用的关系也可以通过下面的表看出来。 在这里插入图片描述
这个表就是ADC的通道和引脚对应表,和引脚定义表是一样的。这里通道有0到17,共18个通道。通道16对应ADC1的温度传感器,通道17对应ADC1的内部参考电压。只有ADC1有通道16和17,ADC2 和ADC3 没有。ADC1和ADC2的引脚完全相同,ADC3 中间会有些变化(STM32F103C8T6芯片没有ADC3)。引脚顺序是PA0到PA7、PB0到PB1、PC0到PC5。(STM32F103C8T6芯片没有PC0到PC5)。

规则组的四种转换模式

规则组的四种转换模式:单次转换、非扫描模式;连续转换、非扫描模式;单次转换、扫描模式;连续转换、扫描模式。ADC初始化的结构体里有两个参数:一个是选择单次转换还是连续转换的,另一个是选择扫描模式还是非扫描模式的。这两个参数组合起来就有这四种转换方式。

(1)单次转换、非扫描模式

在这里插入图片描述
第一种单次转换非扫描模式是最简单的。这个表就是规则组里的“菜单”,有16个空位(分别是序列1~序列16)。可以在空位里“点菜”,写入要转换的通道。在非扫描的模式下,这个菜单只有序列1的位置有效。这时,菜单从同时选中一组的方式退化为选中一个的方式。在序列1的位置可以指定想转换的通道,如通道2写到序列1,然后触发转换:ADC对通道2进行模数转换,一段时间后转换完成,转换结果放在数据寄存器里,同时给EOC标志位置1,整个转换过程结束。判断EOC标志位,若转换完成,就可以在数据寄存器里读取结果。若想再启动一次转换,就需要再触发一次,转换结束置EOCe标志位,读结果。若想换一个,通道转换,在转换之前把序列1位置的通道2改成其他通道,然后再启动转换。单次转换非扫描的模式没用到菜单列表,是比较简单的一种模式。

(2)连续转换、非扫描模式

在这里插入图片描述
连续转换非扫描的模式还是非扫描模式,菜单列表只用第一个。与单次转换不同的是:在一次转化结束后不会停止,而是立刻开始下一轮的转换,然后一直持续下去。这样就只需要最开始触发一次,就可以一直转换了。这个模式的好处就是开始转换之后,不需要等待一段时间。因为一直都在转换,不需要手动开始转换,也不用判断是否结束,想要读AD值的时候,直接从数据寄存器取。

(3) 单次转换、扫描模式

在这里插入图片描述
然后继续看单次转换扫描模式,这个模式也是单次转换。所以每触发一次转换结束后就会停下来,下次转换就得再触发才能开始。然后它是扫描模式,这就会用到这个菜单列表的。你可以在这个菜单里点菜,比如第一个菜是通道二。第二个菜是通道五等等等等,这里每个位置是通道几可以任意指定,并且也是可以重复的。然后初始化结构体里还会有个参数,就是通道数目。因为16个位置里可以不用完,只用前几个。那你就需要再给一个通道数目的参数,告诉他我有几个通道。比如这里指定通道数目为七,那他就只看前七个位置。然后每次触发之后,他就依次对这前七个位置进行a d转换。转换结果都放在数据寄存器里,这里为了防止数据被覆盖。就需要用dma及时将数据挪走,那七个通道转换完成之后产生eoc信号。转换结束,然后再触发下一次就又开始新一轮的转换。这就是单次转换扫描模式的工作流程。

(4) 连续转换、扫描模式

在这里插入图片描述
连续转换扫描模式是在上一个模式的基础上改变了一部分,一次转换完成后立刻开始下一次转换(与非扫描模式的单次和连续是相似套路)。在扫描模式的情况下,还有一种模式:阶段模式。它的作用是在扫描的过程中,每隔几个转换,就暂停一次,需要再次触发才能继续。

触发控制

在这里插入图片描述
这个表是规则组的触发源(对应ADC框图左下角的触发转换部分),这个表里有:1、来自定时器的信号;2、来自引脚/定时器的信号(具体是引脚还是定时器,需要用AFIO重映射来确定);3、软件控制位(也就是软件触发)。通过设置右边的寄存器来完成怎么选择这些触发信号。若使用库函数,直接给个参数就行了。

数据对齐

(数据右对齐和数据左对齐)
本小节中ADC是12位的,转换结果是12位的数据,但数据寄存器是16位的,所以存在数据对齐的问题。第一种数据右对齐:12位的数据向右靠,多出来的几个高位补0;第二种数据左对齐:12位的数据向左靠,多出来的几个低位补0。
一般使用第一种右对齐,这样读取这个16位寄存器,直接就是转换结果;若选择左对齐,直接读得到的数据会比实际的大(数据左对齐把数据左移了4次。二进制的数据左移一次,等效于把这个数据乘2。这里数据左移4次,相当于把结果乘16)。
左对齐用途:若不想要很高的分辨率(0~4095太大),比如,简单的判断,不需要这么高分辨率,选择左对齐,再把数据的高8位取出来,舍弃掉了后面四位的进度,将12位的ADC退化成8位的ADC。一般还是使用右对齐,若需要裁减分辨率,就先把12位都取出来再做处理,这样也可以,只是多算一步。

转换时间

一般不注意转换时间这个参数,因为通常AD转换都很快。若不需要非常高速的转换频率,转换时间可以忽略。AD转换是需要一小段时间的,AD转换需要花时间的步骤有哪些?AD转换的步骤有四步:采样、保持、量化、编码。其中采样和保持可以放在一起,量化编码可以放在一起,总共是这两大步。
量化编码就是ADC逐次比较的过程,需要花一段时间,且位数越多花的时间越长。接下来是采样保持的作用。由于AD转换(即量化编码)是需要一小段时间的,若这一小段时间里,输入的电压还在不断变化,就无法定位输入电压。
在这里插入图片描述
所以在量化编码之前,需要设置一个采样开关,先打开采样开关搜集外部电压:比如,用一个小容量的电容存储这个电压,存储后再断开采样开关,进行后面的AD转换,这样在量化编码的期间,电压始终保持不变,能够精确地定位未知电源的位置。这就是采样保持电路。采样保持的过程需要闭合采样开关,过一段时间再断开,会产生一个采样时间。
STM32ADC的总转换时间为:Tconv=采样时间+12.5个ADC。采样时间是采样保持用的时间(可以在程序中进行配置),采样时间越大,越能避免毛刺信号的干扰,但转换时间也会相应延长。12.5个ADC周期是量化编码用的时间,12位的ADC需要花费12个周期,剩下的半个周期可能是做其他东西花的时间。ADC周期是从RCC分频过来的ADCCLK(最大14MHz)。ADC时钟是经APB2分频过来的,现在APB2=72MHz,分频系数固定2、4、6、8,所以组合不出14M,如果APB2是别的时钟,就可能经分频后得到14M
例:
当ADCCLK=14MHz,采样时间为1.5个ADC周期,Tconv= 1.5 + 12.5 = 14个ADC周期 = 1μs(在14MHz ADCCLK的情况下)。这就是最快1us时间的来源。若采样周期再长些就不到1us了。也可以把ADCCLK的时钟设置超过14MHz,这样ADC超频,转换时间可以小于1us,但无法保证稳定性。

校准

1.ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差。
2.建议在每次上电后执行一次校准。
3.启动校准前,ADC必须处于关电状态超过至少两个ADC时钟周期。
这个校准过程是固定的,我们只需要在ADC初始化的最后加几条代码。我们不需要管如何计算、校准。

硬件电路

如何设计ADC的外围电路?下面给出3个电路图
在这里插入图片描述
第一个是电位器产生可调电压的电路。电位器的两个固定端:一端接3.3V,另一端接GND,这样中间的滑动端就可以输出0~3.3V可调电压。输出端可以接ADC的输入通道,如PA0口,滑动端往上滑电压增大,往下滑电压减小。另外,这个电阻的阻值不能太小,这个电阻两端直接跨接在电源正负极,若阻值太小,电阻会比较费电,再小会发热冒烟,一般要至少接千欧级的电阻。
第二个是传感器输出电压的电路。一般来说,光敏电阻、热敏电阻、红外接收管、麦克风等都可以等效为一个可变电阻,但电阻阻值无法直接测量。图中通过和一个固定电阻串联分压,得到一个反应电阻值电压的电路。传感器阻值变小下拉作用变强,输出端电压下降;传感器阻值变大下拉作用变弱,输出端受上拉电阻的作用,电压升高。这个固定电阻一般选择和传感器阻值相近的电阻,这样可以得到位于中间电压区域比较好的输出。图中传感器和固定电阻的位置也可以交换,输出电压的极性反转。
在这里插入图片描述
如上图,传感器也是使用分压的方法来进行输出的,AD转换需要用到AO引脚,AO直接从后面输出。
第三个是简单的电压转换电路。若想测05V的VIN电压,但ADC只能接收03.3V的电压。搭建一个这样的简易转换电路,使用电阻进行分压,上面阻值17k、下面阻值33k,共50k。根据分压公式,中间的电压=VIN/50k*33k。最后得到的电压范围就是0~3.3V,可以进入ADC转换。若想采集5V、10V这些电压可以使用这个电路,若电压更高,不建议使用此电路,会比较危险。高电压采集可以使用专用的采集芯片,如隔离放大器等,做好高低电压的隔离,保证电路的安全。

  • 41
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值