ADC
本文最后更新于51天前,其中的信息可能已经有所发展或是发生改变。

简介

  1. ADC(Analog-Digital Converter)模拟-数字转换器
  2. ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁DAC,数字模拟转换器,使用DAC就可以将数字变量转化为模拟电压。PWM也是数字到模拟的桥梁。PWM只有,开关两个状态,在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景,使用PWM来等效模拟量,是比DAC更好的选择,并且PWM电路更加简单,更加常用,所以可以看出PWM还是挤占了DAC的很多应用空间,目前DAC的应用主要是在波形生成这些领域,比如信号发生器、音频解码芯片等。
  3. 12位逐次逼近型ADC,1us转换时间。逐次逼近型这是这个ADC的工作模式。分辨率:一般用多少位来表示,12位AD值,它的表示范围就是0~2^12-1。量化结果的范围是0~4095。位数越高,量化结果就越精细,对应分辨率就越高。 转换时间:就是转换频率。AD转换是需要花一小段时间的,这里1us就表示从AD转换开始,到产生结果,需要花1us的时间,对应AD转换的频率就是1MHZ(T=1/f,f=1/T=1/0.000001=1000000hz)
  4. 输入电压范围:0~3.3V,转换结果范围:0~4095。输入电压一般要求都是要在芯片供电的负极和匹极之间变化的。最低电压就是负极0V,最高电压是正极3.3V。经过ADC转换之后,最小值就是0,最大值就是4095。
  5. 18个输入通道,可测量16个外部和2个内部信号源, 16个外部信号源就是16个GPIO口,在引脚上直接接模拟信号就行了。不需要任何额外的电路,引脚就直接能测电压。 2个内部信号源是内部温度传感器和内部参考电压。温度传感器可以测量CPU的温度,比如你电脑可以显示一个CPU温度。用ADC读取这个温度传感器来测量是一个1.2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的,所以,如果你芯片的供电不是标准的3.3V,那测量外部引脚的电压可能就不对,这时就可以读取这个基准电压进行校准,这样就能得到正确的电压值了。
  6. 规则组和注入组两个转换单元。 这个就是STM32ADC的增强功能,普通的AD转换流程是启动一次转换,读一次值,然后再启动再读值。并且有两个组,一个是用于常规使用的规则组,一个是用于突发事件的注入组。
  7. 模拟看门狗自动监测输入电压范围模拟看门狗自动监测输入电压范围,这个ADC一般可以用于测量光线强度,温度,这些值,并且经常会有个需求,就是如果光线高于某个阈值、低于某个阈值或者温度高于某个阈值、低于某个阈值时执行一些操作。这个高于某个阈值低于某个阈值的判断,就可以用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当AD值高于它设定的上阈值,或者低于下阈值时,它就会申请中断,就可以在中段函数里执行相应的操作,这样你就不用不断的手读值,再用if进行判断了。
  8. STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道 ADC资源有ADC1, ADC2共有两个ADC外设,10个外部输入通道,也就是它最多只能测量10个外部引脚的模拟信号。之前这里说的16个外部信号源,这是这个系列最多有16个外部信号源,但是STM32F103C8T6 芯片引脚比较少,有很多硬件没有引出来,所以就只有10个外部信号源。如果想要更多的外部通道,可以选择引脚,更多的型号,具体有多少通道呢?那还需要再参考一下数据手册

逐次逼近型ADC

怎么测电压

逐次逼近型ADC的内部结构

这个图是ADC0809的内部结构图,它是一个独立的8位逐次逼近型ADC芯片。在以前的时候,单片机的性能还不是很强,所以需要外挂一个ADC芯片才能进行AD转换。这个ADC0809就是一款比较经典的ADC芯片,那现在单片机的性能和集成度都有很大的提升,很多大面积内部就已经集成了ADC外设,就不用外挂芯片了。引脚可以直接测电压使用还是非常方便的。

首先左边这里IN0~IN7是8路输入通道,通过通道选择开关,选中一路输入到比较器的一个引脚进行转换。下面是地址锁存和译码,就是想选中哪一路就把通道号放在这三个引脚上,然后给一个锁存信号上面这里对应通路开关就可以自动拨好了。这部分就相当于一个可以通过模拟信号的数据选择器,因为ADC转换是一个很快的过程,你给个开始信号,过个几微秒就转化完成了,所以说如果想转换多路信号,那不必设计多个AD转换器,只需要一个AD转换器,然后加一个多路选择开关,想转换哪,一路就先拨一下开关,选中对应通道,然后再开始进行转换。这就是这个输入通道选择的部分,这个ADC0809只有8个,输入中的 stm32内部的ADC是有18个输入通道的,所以对应这里就是一个18路输入的多路开关,然后所有信号选好了,到比较器,怎么才能知道这个电压对应的编码数据是多少呢?

如何确定电压对应的编码数据是多少

这就需要用逐次逼近的方法来比较了。这是一个电压比较器,它可以判断两个输入信号电压的大小关系,输出一个高低电平,只是谁大谁小,它的两个输入端,一个是待测的电压,另一个是这里DAC的电压输出端,(DAC是数模转换器,输入一个数据,他就可以输出数据对应的电压,DAC内部是使用加权电阻网络来实现的。)那现在输入一个外部通道输入的未知编码的电压和一个DAC输出的已知编码的电压,它俩同时输入到电压比较器进行大小判断。如果DAC输出的电压比较大,我就调小DAC数据,如果DAC输出的电压比较小,我就增大DAC一些数据,直到DAC输出的电压和外部通道输入的电压近似相等,这样DAC输入的数据就是外部电压的编码数据了,这就是DAC的实现原理。这个电压调节的过程就是这个逐次逼近SAR的完成的。

为了最快找到未知电压的编码。通常使用二分法进行寻找,比如这里是8位的ADC,那编码就是从0~255。第一次比较的时候,就给DAC输入255的一半进行比较,那就是128。如果DAC电压大了,那第二次比较的时候就再给128的一半,64,如果还大,第三次比较的时候就给32,如果这次DAC电压小了,那第4次就给32~64,中间的值,然后继续这样一次进行下去就能最快的找到未知电压的编码,并且这个过程如果你用二进制来表示的话,会发现128 64 32这一数据正好是二进制,每一位的位权, 这个判断过程就相当于是对二进制从高位到低位依次判断是1还是0的过程。(255:111 1111、128:1000 0000、64:0100 0000、32:0010 0000)这就是主次逼近型名字的来源,那对于8位的ADC从高位到低位依次判断8次就能找到未知电压的编码了。对于12位的ADC,就需要依次判断,12次,这就是主次逼近的过程,然后AD转换结束后,DAC的输入数据就是未知电压的编码。 通过8位三态锁存缓冲器进行输出,8位就有8根线,12位就有12根线。

EOC是End Of Convert,转换结束信号;

START是开始转换,给一个输入脉冲,开始转换;

CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程。 Vief+Vref-是DAC的参考电压,比如你给一个数据255是对应5V还是3.3V呢?就由这个参考电压决定,这个DAC的参考电压也决定了ADC的输入范围,所以它也是ADC参考电压。 最后左边是整个芯片电路的供电,Vcc和GND通常参考电压的正极(Vief+)和Vcc是一样的, 会接在一起参考电源的负极(Vief+)和GND也是一样的,也接在一起,所以一般情况下,ADC输入电压的范围就和ADC的供电是一样的。

STM32的逐次逼近型ADC结构

那看一下STM32的这个ADC框图一般在手册里每个外设的最前面都有一个整体的结构图,

左边是ADC的输入通道,包括16个GPIO口(IN0到IN15)和两个内部的通道,一个是内部温度传感器,另一个是VREFINT内部参考电压总共是18个输入通道,然后到达模拟多路开关,这是一个模拟多路开关,可以指定想要选择的通道。右边是多路开关的输出,进入到模数转换器。这里模数转换器就是执行逐次比较的过程转换,结果会直接放在数据寄存器里, 读取寄存器就能知道ADC转化的结果了。

模拟多路开关

在多路开关这里,对于普通的ADC多路开关一般都是只选中一个的,就是选中某个通道开始转换,等待转换完成取出结果这是普通的流程,但是这里就比较高级了,它可以同时选中多个,而且在转换的时候还分成了两个组,规则通道组和注入通道组。

规则通道组和注入通道组

其中规则组可以一次性最多选16个通道,注入组最多可以选中4个通道, 用处:举个例子,这就像是你去餐厅点菜,普通的ADC是你指定一个菜,老板给你做,然后做好了送给你。 在这里就是你指定一个菜单,这个菜单最多可以填16个菜,然后你直接递个菜单给老板,老板就按照菜单的顺序依次做好一次性给你端上来。这样的话就可以大大提高效率。当然,你的菜单也可以只写一个菜,这样这个菜单就简化成了普通的模式了。 那对于这个菜单呢也有两种,一种是规则组菜单

规则组

可以同时上16个菜,但是它有个尴尬的地方就是规则组只有一个数据寄存器,就是这个桌子比较小,最多只能放一个菜,如果上16个菜,前15个菜都会被挤掉,你只能得到第16个菜,所以对于规则组转换来说,如果使用这个菜单的话,最好配合DMA来实现。DMA是一个数据转运小帮手,它可以在每上一个菜之后把这个菜挪到其他地方去,防止被覆盖。这个规则组虽然可以同时转换16个通道,但是数据寄存器只能存一个结果,如果不想之前的结果被覆盖,那在转换完成之后,就要尽快把结果拿走。

注入组

相当于是餐厅的VIP座位,在这个座位上一次性最多可以点4个菜,并且这里数据寄存器有4个,是可以同时上4个菜的。对于注入组而言,就不用担心数据覆盖的问题了。 这就是规则组和注入组的介绍,一般情况下, 使用规则组就完全足够了,如果要使用规则组的菜单,那就再配合DMA转运数据,这样就不用担心数据覆盖的问题了。

模数转换器外围线路

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

然后接着看左上角,这里是VREF+、VREF-、VDDAVSSA。 VREF+、VREF-是ADC的参考电压决定了ADC输入电压的范围。 VDDAVSSA是ADC的供电硬件,一般情况下,VREF+要接VDDA,VREF-要接VSSA。 这个芯片上,没有VREF+和VREF-的引脚,它在内部就已经和VDDAVSSA接在一起了。

VDDAVSSA在引脚定义表里,也可以看到 之前讲过了VDDAVSSA是内部模拟部分的电源,比如说ADC RC振荡器、锁相环等。在这里,VDDA接3.3V,VSSA接GND,所以ADC的输入电压范围就是0~3.3V。

然后继续看右边,这里是ADCCLK是ADC的时钟,也就是逐次逼近型ADC的内部结构的CLOCK,是用于驱动内部逐次比较的时钟, 来自ADC预分频器,这个ADC预分频器是来源于RCC。

在这里, APB2时钟72MHz,然后通过ADC预分频器进行分屏,得到ADCCLK,ADCCLK最大是14MHz,所以这个预分频器就有点尴尬,它可以选择2、4、6、8分频,如果选择2分频,72兆÷2=36兆,超出允许范围了。4分屏之后是18兆,也超了,所以对于ADC预分频器只能选择6分频结果是12M、8分频结果是9兆,这两个值,这个在程序里要注意一下。

DMA请求,这个就是用于触发DMA进行数据转运的。 然后是两个数据寄存器用于存放转换结果的

上面这里还有模拟看门狗,它里面可以存一个阈值高限和阈值低限制,如果启动那模拟看门狗,并且指定了看门的通道,那这个看门狗就会关注他看门的通道,一旦超过这个阈值范围了,他就会乱叫,就会在上面申请一个模拟看门狗的中断,最后同向NVIC,然后对于规则组和注入组而言呢,他们转换完成之后也会有一个EOC(End of Conversion)转换完成的信号,在这里, EOC是规则组的完成信号,JEOC是注入组完成的信号。这两个信号会在状态寄存器里置一个标志位, 读取这个标志位就能知道是不是转换结束了。同时,这两个标志位也可以去到NVIC申请中断。如果开启了NVIC对应的通道,他们就会触发中断。

ADC基本结构图

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

输入通道

这里有16个外部通道,那这16个通道对应的都是哪些gpu口呢?

通道ADC1ADC2ADC3
通道0PA0PA0PA0
通道1PA1PA1PA1
通道2PA2PA2PA2
通道3PA3PA3PA3
通道4PA4PA4PF6
通道5PA5PA5PF7
通道6PA6PA6PF8
通道7PA7PA7PF9
通道8PB0PB0PF10
通道9PB1PB1
通道10PC0PC0PC0
通道11PC1PC1PC1
通道12PC2PC2PC2
通道13PC3PC3PC3
通道14PC4PC4
通道15PC5PC5
通道16温度传感器
通道17内部参考电压

就可以看一下这个表,这些就是ADC通道和引脚复用的关系,这个对应关系也可以通过引脚定义表看出来,

看一下,在这里可以看到ADC12_IN0对应的是PA0引脚,IN1对应PA1引脚,然后IN2、IN3、IN4、IN5、IN6、IN7、IN8、IN9依次对应的是PA2~PB1,这里只有IN0到IN9,总共只有10个通道,然后其他地方就没有了,所以这个芯片就只能有10个外部输入通道,然后ADC12IN0的意思是ADC1和ADC2的IN0都是在PA0上的,然后下面全都是ADC12,这说明ADC1和ADC2的引脚全都是相同的, 既然都相同,那要ADC2还有啥用呢? 这个就要再说一个ADC的高级功能了,就是双ADC模式,这个模式比较复杂,这里只简单介绍一下,不需要掌握。

双ADC模式就是ADC1和ADC2一起工作,他俩可以配合组成同步模式,交叉模式等等模式,比如交叉模式,ADC1和ADC2交叉的对一个通道进行采样,这样就可以进一步提高采样率,就像你打拳一样,左手打一拳,右手打一拳,左手打一拳,右手打一拳,快速交叉的打拳,那打击的频率肯定就比一个拳头打得快。当然还有其他的模式,这里就不再细说了,这就是ADC1和ADC2配合使用的双ADC模式。当然, ADC1和ADC2也是可以分开使用的,可以分别对不同的引脚进行采样,这样也是可以的。那回到这里,这个表就是ADC的通道和引脚对应表,和引脚定义那个是一样的,这里通道有0~17,总共是18个通道,通道16对应ADC1的温度传感器,通道17对应ADC1的内部参考电压。 这里只有ADC1有通道16和17 ADC2和ADC3是没有的,然后上面是GPIO的引脚,ABC1和ADC2的引脚是完全相同的。ABC3中间会有些变化,不过 这个芯片也没有ADC3,不用管了,这里引脚的顺序就是PA0~PA7,然后PB0~PB1,再然后PC0~PC5,由于 这个芯片没有PC0到PC5,所以这些通道就没有了,这就是通道和引脚的关系

规则组的4种转换模式

单次转换,非扫描模式

连续转换,非扫描模式

单次转换,扫描模式

连续转换,扫描模式 在ADC初始化的结构体里,会有两个参数,一个是选择单次转换还是连续转换的,另一个是选择扫描模式还是非扫描模式的。这两个参数组合起来只有这4种转换方式。

单次转换非扫描模式

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

连续转换非扫描模式

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

单次转换扫描模式

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

连续转换扫描模式

这个模式一次转换完成后立刻开始下一次的转换,和上面这里非扫描模式的单次和连续是一个套路。这就是连续转换扫描模式。 当然,在扫描模式的情况下,还可以有一种模式叫间断模式,它的作用是在扫描的过程中, 每隔几个转换就暂停一次,需要再次触发才能继续这个模式我没有列出来,要不然模式太多了,大家了解一下就可以了,暂时不需要掌握。这些就是STM32ADC的4种转换模式, 再写程序的时候会用到,

触发控制

第一个是触发控制,这个 刚才讲过这个表就是规则组的触发源。 也就是前面ADC框图的触发源。在这个表里有来自定时器的信号,还有这个来自引脚或定时器的信号,这个具体是引脚还是定时器,需要用AFIO重映射来确定,最后是软件控制位。也就是说, 之前说的软件触发,这些触发信号怎么选择?可以通过设置右边这个寄存器来完成。当然,使用库函数的话直接给个参数就行了,这就是触发控制。

数据对齐

数据右对齐:

数据左对齐:

这个ADC是12位的,它的转换结果就是一个12位的数据,但是这个数据寄存器是16位的,所以就存在一个数据对齐的问题。 第一种是数据右对齐,就是12位的数据向右靠,高位多出来的几位就补0。 第二种是数据左对齐,就是12位的数据向左靠,低位多出来的几位就补0。 一般使用的都是第一种右对齐,这样读取这个16位寄存器直接就是转换结果。如果选择左对齐,直接读的话,得到的数据会比实际的大,因为数据左对齐,实际上就是把数据左移了4次,二进制有个特点,就是数据左移一次就等效于把这个数据×2,那这里左移了4次,就相当于把结果×16了,所以直接读的话会比实际值大16倍,

那要这个左对齐有啥用呢?

这个用途就是如果你不想要这么高的分辨率,你觉得0~4095数太大了,我就做个简单的判断,不需要这么高分辨率,那你就可以选择左对齐,然后再把这个数据的高8位取出来,这样就舍弃掉了后面4位的精度,这个12位的ADC就退化成了8位的ADC了,这就是左对齐的作用。 不过一般用的话选右对齐就行了,如果需要裁剪一些分辨率,大不了就先把12位都取出来再做处理,这也是可以的,就是多算了一步而已。这就是数据左对齐和右对齐。

转换时间

不过转换时间这个参数 一般不太敏感,因为一般AD转换都很快,如果不需要非常高速的转换频率,那转换时间就可以忽略了。来看一下,之前说了AD转换是需要一小段时间的,就像厨子做菜一样,也是需要等一小会才能上菜的。那AD转换的时候有哪些步骤需要花时间呢?

  1. AD转换的步骤:采样,保持,量化,编码
  2. STM32 ADC的总转换时间为:

TCONV = 采样时间 + 12.5个ADC周期

  1. 例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期

TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs

这里第一条AD转换的步骤有4步,分别是采样,保持,量化,编码。其中采样保持可以放在一起,量化编码可以放在一起,总公这两大部,量化编码好理解就是ADC逐次比较的过程,这个是需要花一段时间的,一般位数越多,花的时间就越长,

那采样保持是干啥的呢?

这个前面结构图里这里并没有设计,为什么需要采样保持呢? 这是因为 AD转换,就是后面的量化编码,是需要一小段时间的,如果在这一小段时间里输入的电压还在不断变化,那就没法定位输入电压到底是在哪了。所以在量化编码之前, 需要设置一个采样开关,先打开采样开关,收集一下外部的电压,比如可以用一个小容量的电容存储一下这个电压。存储后,断开采样开关,再进行后面的AD转换。这样在量化编码的期间,电压始终保持不变,这样才能精确的定位未知电压的位置。这就是采样保持电路,那采样保持的过程需要闭合采样开关过一段时间再断开,这里就会产生一个采样时间,那回到这里, 就得到了第二条STM32ADC的总转换时间为

Tconvert=采样时间+12.5个ADC周期

采样时间是采样保持花费的时间,这个可以在程序中进行配置。采样时间越大,越能避免一些毛刺信号的干扰。不过转换时间也会相应延长

12.5个ADC周期是量化编码花费的时间,因为是12位的ADC,所以需要花费12个周期。这里多了半个周期,可能是做一些其他东西花的时间, ABC周期就是从RCC分频过来的ADCCLK,这个ADCCLK最大是14MHz,所以下面有个例子,这里就是最快的转换时间。 当ADCCLK=14MHz采样时间为1.5个ADC周期, Tconvert=1.5 + 12.5=14个ADC周期,在14MHz的ADCCLK的情况下,就等于一微秒,这就是最快一微秒时间的来源。 如果你采样周期再长些,他就达不到一微秒了。另外,你也可以把ADCCLK的时钟设置超过14MHz,这样的话, ADC就是在超频了,那转换时间可以比一微秒还短。不过这样稳定性又没法保证。

校准

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

这个看上去挺复杂的是吧?但是不需要理解,这个校准过程是固定的, 只需要在ADC初始化的最后加几条代码就行了。至于怎么计算,怎么叫校准, 不需要管,所以这个了解一下就行。

硬件电路

这里是电位器产生一个可调的电压,这里电位器的两个固定端,一端接3.3V,另一端接GND,这样中间的滑动端就可以输出一个0~3.3V可调的电压输出来 这里可以接ADC的输入通道,比如PA0口,当滑动端往上滑时,电压增大,往下滑时电压减小。另外注意一下这个电阻的阻值,不要给太小,因为这个电阻两端也是直接跨接在电源正负极的,如果阻值太小,那这个电阻就会比较费电,再小就有可能发热冒烟了,一般至少要接千欧级的电阻,比如这里接的是10K的电阻,这是电位器产生可调电压的电路,

然后是传感器输出电压的电路。一般来说,像光敏电阻,热敏,电阻,红外接收管,麦克风等等都可以等效为一个可变电阻,那电阻阻值没法直接测量,所以这里就可以通过和一个固定电阻串联分压来得到一个反应电阻值电压的电路,那这里传感器阻值变小时,下拉作用变强,输出端电压就下降,传感器阻值变大时,下拉作用变弱,输出端受上拉电阻的作用,电压就会升高。 这个固定电阻一般可以选择和传感器阻值相近的电阻,这样可以得到一个位于中间电压区域比较好的输出,但这里传感器和固定电阻的位置也可以换过来,这样的话,输出电压的极性就翻过来了, 这就是这个分压方法来输出传感器阻值的电路。

看一下传感器模块的介绍。

传感器模块:

传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出

在这里,传感器也是使用分压的方法来进行输出的。 这一节AD转换需要用的AO这个硬件, ao直接从这里输出, 在这里接线就行了。

最后这个电路,这是一个简单的电压转换电路,比如你像这个0~5V的VIN电压, 但是ADC只能接收0~3.3V的电压,那就可以搭建一个这样的简易转换电路,在这里还是使用电阻进行分压,上面阻值17K,下面阻值33k加一起是50K,所以根据分压公式,中间的电压就是VIN/50 K×33k,最后得到的电压范围就是0~3.3V,就可以进入ADC转换了,这就是这个简单的电压转换电路。如果你想采集5V、10V这些电压的话,可以使用这个电路,但是如果你电压再高一些,就不建议使用这个电路了,那可能会比较危险。高电压采集,最好使用一些专用的采集芯片,比如隔离放大器等等。做好高低电压的隔离,保证电路的安全。

手册

寄存器介绍了 看一下第一个状态寄存器。

其中eoc信号就可以在这里置标志位。 读取这里的标志位就可以知道硬件的状态,

控制寄存器可以用于对ADC进行配置。

最后就是一个寄存器的总表。这里有所有的寄存器,然后这里还有这些寄存器的复位值,也就是说,上电复位后,寄存器都会变成复位值,这里复位值对应的就是各个外设的默认配置,比如说GPIO口上电后默认配置为浮空输入的模式,输出数据寄存器默认输出低电平。如果你想了解上电后的默认配置,就可以参考这里的寄存器默认值,再对照相应的寄存性描述,这样就能知道默认配置了,这个计算器一般上电都默认全为零,不过也有的不是全为0。 。

点击数:1

    暂无评论

    发送评论 编辑评论

    
    				
    |´・ω・)ノ
    ヾ(≧∇≦*)ゝ
    (☆ω☆)
    (╯‵□′)╯︵┴─┴
     ̄﹃ ̄
    (/ω\)
    ∠( ᐛ 」∠)_
    (๑•̀ㅁ•́ฅ)
    →_→
    ୧(๑•̀⌄•́๑)૭
    ٩(ˊᗜˋ*)و
    (ノ°ο°)ノ
    (´இ皿இ`)
    ⌇●﹏●⌇
    (ฅ´ω`ฅ)
    (╯°A°)╯︵○○○
    φ( ̄∇ ̄o)
    ヾ(´・ ・`。)ノ"
    ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
    (ó﹏ò。)
    Σ(っ °Д °;)っ
    ( ,,´・ω・)ノ"(´っω・`。)
    ╮(╯▽╰)╭
    o(*////▽////*)q
    >﹏<
    ( ๑´•ω•) "(ㆆᴗㆆ)
    😂
    😀
    😅
    😊
    🙂
    🙃
    😌
    😍
    😘
    😜
    😝
    😏
    😒
    🙄
    😳
    😡
    😔
    😫
    😱
    😭
    💩
    👻
    🙌
    🖕
    👍
    👫
    👬
    👭
    🌚
    🌝
    🙈
    💊
    😶
    🙏
    🍦
    🍉
    😣
    Source: github.com/k4yt3x/flowerhd
    颜文字
    Emoji
    小恐龙
    花!
    上一篇
    下一篇