STM32 ADC简介
对于GPIO来说,他只能读取引脚的高低电平,要么是高电平,要么是低电平,只有两个值。而使用了ADC之后,我们就可以对这个高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量,就可以知道引脚的具体电压是多少了。
所以ADC实际上就是一个电压表,把引脚的电压值测出来,放在一个变量里,这就是ADC的作用。
ADC(Analog-Digital Converter)模拟-数字转换器,简称模数转换器或者叫AD转换器。
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,我们再把这个数据读取到变量里来,就可以进行显示、判断、记录等等操作了。
想一下,ADC是模拟到数字的桥梁,那么反过来,肯定就有数字到模拟的桥梁,那就是DAC,数字模拟转换器,使用DAC可以将数字变量转化为模拟电压。
不过上一节,我们还学到了一个数字到模拟的桥梁,是什么?是PWM。上一节我们使用PWM来控制LED的亮度,电机的速度,这就是DAC的功能,同时PWM只有完全导通和完全断开两种状态,在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景使用PWM来等效模拟量,是比DAC会更好的选择,并且PWM电路更加简单,更加常用,所以可以看出PWM还是挤占了DAC的很多应用空间,目前DAC的应用主要是在波形生成这些领域,比如信号发生器、音频解码芯片等,这些领域PWM还是不好替代的。DAC大家自行了解,我们套件内的STM32芯片也没有DAC的外设。
STM32的ADC是12位逐次逼近型ADC,1us转换时间。
逐次逼近型这是这个ADC的工作模式。
ADC的两个关键参数,一个是分辨率,一般用多少位来表示,12位AD值,他的表示范围就是0~2^12-1,就是量化结果的范围是0~4095,位数越高,量化结果越精细,对应的分辨率就越高。另一个是转换时间,就是转换频率,AD转换是需要花一小段时间的,这里1us就表示从AD转换开始,到产生结果,需要花费1us的时间,对应AD转换的频率就是1MHz,这个就是STM32 ADC的最快转换频率。如果你需要转换一个频率非常高的信号,那就要考虑一下这个转换频率是不是够用了。
ADC输入电压范围:0~3.3V,转换结果范围:0~4095。这个ADC的输入电压,一般要求都是要在芯片供电的负极和正极之间变化的。最低电压就是负极0V,最高电压是正极3.3V,经过ADC转换之后,最小值就是0,最大值是4095。0V对应0,3.3V对应4095,中间都是一一对应的线性关系。这个计算起来就非常简单了,直接乘除一个系数就行了。
ADC有18个输入通道,可测量16个外部和2个内部信号源。外部信号源就是16个GPIO口,在引脚上直接接模拟信号就行了,不需要任何额外的电路,引脚就直接能测电压,这个还是非常方便的。2个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测量CPU的温度,比如你电脑可以显示一个CPU温度,就可以用ADC读取这个温度传感器来测量,内部参考电压是一个1.2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的,所以如果你芯片的供电不是标准的3.3V,那测量外部引脚的电压可能就不对,这时就可以读取这个基准电压进行校准,这样就能得到正确的电压值了。
规则组和注入组两个转换单元。这个就是STM32 ADC的增强功能了,普通的AD转换流程是,启动一次转换、读一次值,然后再启动、再读值,这样的流程。但是STM32的ADC就比较高级,可以列一个组,一次性启动一个组,连续转换多个值。并且有两个组,一个是用于常规使用的规则组,一个是用于突发事件的注入组。
模拟看门狗自动监测输入电压范围。这个ADC一般可以用于测量光线强度、温度这些值。并且经常会有个需求,就是如果光线高于某个阈值或者低于某个阈值,执行一些操作,这个高于某个阈值、低于某个阈值的判断,就可以用模拟看门狗来自动执行。模拟看门狗可以监测指定的某些通道,当AD值高于它设定的上阈值或者低于下阈值时,它就会申请中断,你就可以在中断函数里执行相应的操作。这样你就不用不断地手动读值,再用if进行判断了。
STM32F103C8T6单片机的ADC资源有ADC1、ADC2,共两个ADC外设。10个外部输入通道,也就是它最多只能测量10个外部引脚的模拟信号。我们之前说的16个外部信号源,这是这个系列最多有16个外部信号源,但是我们这芯片引脚比较少,有很多引脚没有引出来,所以就只有10个外部信号源。如果你想要更多的外部通道,可以选择引脚更多的信号。
逐次逼近型ADC
接下来我们来了解一下这个逐次逼近型ADC到底是怎么测电压的。
逐次逼近型ADC结构

了解逐次逼近型ADC内部结构,对学习STM32的ADC有很大帮助,因为STM32的ADC原理和这个是一样的。但是STM32只画了一个框表示ADC,并没有描述内部结构。
这个图是ADC0809的内部结构图,它是一个独立的8位逐次逼近型ADC芯片,在以前单片机性能还不是很强,所以需要外挂一个ADC芯片才能进行AD转换,这个ADC0809就是一款比较经典的ADC芯片。那现在单片机的性能和集成度都有很大的提升,很多单片机内部就已经集成了ADC外设,这样就不用外挂芯片了,引脚可以直接测电压,使用还是非常方便的。
输入通道选择部分
IN0~7是8路输入通道,通过通道选择开关,选中一路,输入到这里进行转换
。
这里是地址锁存和译码,就是你想选中哪一路,就把通道号放在这ADDA、B、D这三个脚上。然后给个锁存信号,
上面这里对应的通路开关就自动拨好了。
这部分就相当于一个可以通过模拟信号的数据选择器,因为ADC转换是一个很快的过程,你给个开始信号,过个几us就转换完成了,所以说如果你想要转换多路信号,那不必设计多个AD转换器,只需要1个AD转换器,然后加一个多路选择开关,想转换哪一路,就先拨一下开关,选中对应通道,然后再开始转换就行了。这就是这个输入通道选择的部分,这个ADC0809只有8个输入通道。
我们STM32内部的ADC是有18个输入通道的,所以对应的通道选择开关这里就是一个18路输入的多路开关。
逐次逼近型原理
怎么才能知道这个电压对应的编码数据是多少呢?
这就需要我们用逐次逼近的方法来一一比较了,首先这是一个电压比较器,它可以判断两个输入信号电压的大小关系。输出一个高低电平指示谁大谁小,它的两个输入端,一个是待测电压,另一个是这里DAC的电压输出端,DAC是数模转换器,我们之前说过了,给DAC一个数据,他就可以输出数据对应的电压。DAC内部是使用加权电阻网络来实现的转换,具体可以看51单片机教程里的AD/DA那一节。
那现在,我们有了一个外部通道输入的,未知编码的电压,和一个DAC输出的,已知编码的电压。他俩同时输入到电压比较器,进行大小判断。如果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转换结束后,DAC的输入数据,就是未知电压的编码。通过这里输出,8位就有8根线,12位就有12根线。
芯片接线

最后上面这里,EOC是End Of Convert,转换结束信号。Start是开始转换,给一个输入脉冲,开始转换。CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程。下面VREF+和VREF-是DAC的参考电压。比如你给个数据255,对应是5V还是3.3V呢?就由这个参考电压决定,这个DAC的参考电压,也决定了ADC的输入范围,所以它也是ADC参考电压。一般情况下ADC输入电压的范围和ADC的供电是一样的,所以只需要把VCC接在VREF+,GND接在VREF-即可。
好,到这里,相信你对逐次逼近型ADC已经了解的差不多了。
接下来我们就来看看STM32的逐次逼近型ADC。看看STM32的ADC和这个相比,有什么更高级的变化。
STM32 ADC框图

ADC的输入通道,包括16个GPIO口,IN0~IN15。还有两个内部通道,一个内部温度传感器,另一个是VREFINT(V Reference Internal),内部参考电压。总共是18个输入通道。
然后到达这里,这是一个模拟多路开关,可以指定我们想要选择的通道。右边是多路开关的输出,进入到模数转换器。
这里模数转换器就是执行的我们刚才讲过的逐次比较的过程。
转换结果会直接放在数据寄存器里。我们读取寄存器就能知道ADC转换的结果了。
规则组和注入组
对于普通的ADC,多路开关一般都是只选中一个的,就是选中某个通道、开始转换、等待转换完成、取出结果。
但是STM32的ADC比较高级,他可以同时选中多个而且在转换的时候,还分成了两组,规则通道组和注入通道组。
其中规则组一次性最多可以选中16个通道,注入组最多可以选中4个通道。这有什么用呢?
举个例子,这就像是你去餐厅点餐,普通的ADC是,你指定一个菜,老板给你做,然后做好了送给你,这里就是你指定一个菜单,这个菜单最多可以填16个菜,然后你直接递个菜单给老板,老板就按照菜单的顺序依次做好,一次性给你端上来,这样的话就可以大大提高效率。当然,你的菜单也可以只写一个菜,这样这个菜单就简化成了普通模式。对于这个菜单,也有两种,一种是规则组,可以同时上16个菜,但是他有个尴尬的地方,
就是规则组只有一个寄存器,就是这个桌子比较小,最多只能放一个菜,如果放上16个菜,那不好意思,前15个菜都会被挤掉,你只能得到第16个菜。所以对于规则组来说,如果使用这个菜单的话,最好配合DMA来实现。 DMA是一个数据转运小帮手,它可以在每上一个菜之后,把这个菜挪到其他地方去,防止被覆盖,这个DMA我们下一节就会讲,这里先大概了解一下。那现在我们就知道了,这个规则组虽然可以同时转换16个通道,但是数据寄存器只能存一个结果,如果不想之前的结果被覆盖,那在转换完成之后,就要尽快把结果拿走。另一种是注入组,这个组就比较高级了,它相当于餐厅的VIP座位,在这个座位上,一次性最多可以点4个菜,
并且这里数据寄存器有4个,是可以同时上4个菜的,对于注入组而言,就不用担心数据覆盖的问题了。这就是规则组和注入组的介绍。一般情况下,我们使用规则组就完全足够用了,如果要使用规则组菜单,那就再配合DMA转运数据,这样就不用担心数据覆盖的问题了。所以接下来只讲规则组的操作,注入组涉及的不多,大家可以看手册自行了解。
定时器触发的作用

左下角这里是触发转换部分,也就是上面AD0809提到的START信号,开始转换。
对于STM32的ADC,触发ADC开始转换的信号有两种:
1.软件触发,就是你在程序中手动调用一条代码,就可以启动转换了。
2.硬件触发,就是这里的这些触发源,上面的是注入组触发源,下面是规则组的触发源。这些触发源主要来源于定时器,有定时器的各个通道,还有TRGO定时主模式的输出。这个之前讲定时器的也介绍过,定时器可以通向ADC、DAC这些外设,用于触发转换。那因为ADC经常需要过一个固定时间段转换一次,比如每隔1ms转换一次,正常的思路就是,用定时器,每隔1ms申请一次中断,在中断里手动开始一次转换,这样也是可以的,但是频繁进中断对我们的程序是有一定影响的,比如你有很多中断需要频繁进入,那肯定会影响主程序的执行。并且不同中断之间的优先级不同,如果触发ADC的中断不能及时响应,那我们ADC的转换频率就肯定会产生影响了。所以对于这种需要频繁进中断,并且在中断里只完成了简单工作的情况,一般都会有硬件的支持。
比如这里,就可以给TIM3定一个1ms的时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC这里,选择开始触发信号为TIM3的TRGO,这样TIM3的更新事件就能通过硬件自动触发ADC转换了,整个过程不需要进中断,节省了中断资源。这就是定时器触发的作用,当然这里还可以选择外部中断引脚来触发转换,都可以在程序中配置,这就是触发转换的部分。
参考电压与供电
VREF+和VREF-是ADC的参考电压,决定了ADC输入电压的范围。下面两个是ADC的供电引脚,一般情况下,VREF+和VREF-分别要接VDDA和VSSA。在我们这个芯片上没有VREF+和VREF-的引脚,他在内部就已经和VDDA和VSSA接在一起了。VDDA和VSSA在引脚定义里也可以看到,VDDA和VSSA是内部模拟部分的电源,比如ADC、RC振荡器、锁相环等。在这里VDDA接3.3V,VSSA接GND,所以ADC的输入电压范围就是0~3.3V。
ADC的时钟

ADCCLK是ADC的时钟,是用于驱动内部逐次比较的时钟,这个时钟来自于ADC预分频器,这个ADC预分频器是来源于RCC的。我们可以在时钟树中找到
,ADCCLK最大是14MHz,所以这个预分频器就有点尴尬,它可以选择2、4、6、8分频,如果选择2分频,72M/2 = 36M,就超出允许范围了。同样4分频也超了,所以对于ADC预分频器,只能选择6分频和8分频,结果分别是12M和9M。
DMA请求
DMA请求就是用于触发DMA进行数据转运的,这个我们下节再讲。

ADC中断

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

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

这里只有ADC1有通道16和17,ADC2和ADC3是没有的。ADC1和ADC2的引脚是完全相同的,ADC3中间会有些变化,不过我们这个芯片没有ADC3,不用管的。由于我们这个芯片也没有PC0~PC5,所以对应通道10~15也是没有的。

ADC12_IN0的意思是,ADC1和ADC2的IN0都是在PA0上,同理,其他的也是。既然都相同,那要ADC2有啥用呢?这个就要再说一个ADC的高级功能了,就是双ADC模式,这个模式比较复杂,这里只简单介绍一下,不需要掌握,双ADC模式就是ADC1和ADC2一起工作,他俩可以配合组成同步模式、交叉模式等等模式,比如交叉模式,ADC1和ADC2交叉地对一个通道进行采样,这样就可以进一步提高采样率,就像你打拳一样,左手一拳右手一拳快速交叉地打拳。那打击的频率肯定就比一个拳头打的快对吧。当然还有其他的模式,这里就不再详细说了。这就是ADC1和ADC2配合使用的双ADC模式。当然ADC1和ADC2也是可以分开使用的,可以分别对不同引脚进行采样,这样也是可以的。
规则组的4种转换模式
那在我们ADC初始化的结构体里,会有两个参数,一个是选择单次转换还是连续转换;另一个是选择扫描模式还是非扫描模式。这两个参数组合起来就有4中转换方式:
单次转换,非扫描模式。
连续转换,非扫描模式。
单次转换,扫描模式。
连续转换,扫描模式。
单非

在非扫描模式下,这个菜单就只有第一个序列1的位置有效。这时,菜单同时选中一组的方式就退化为简单的选中一个方式了。
在这里,我们可以在序列1的位置指定我们想转换的通道,比如通道2。然后我们就可以触发转换,ADC就会对这个通道2进行模数转换,过一小段时间后,转换完成,转换结果放在数据寄存器里,同时给EOC标志位置1。整个转换过程就结束了。我们判断这个EOC标志位,如果转化完了,我们就可以在数据寄存器里读取结果了。
如果你想要再启动一次转换,那就需要再触发一次。如果想换一个通道转换,那就在转换之前,把第一个位置的通道2换成其他通道。
连非

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

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

这个套路和之前的是一样的,一次转化完成后,立刻开始下一次转换。
另外,在扫描模式下,还有一种模式,叫间断模式,它的作用是在扫描过程中,每隔几次转换,就暂停一次,需要再次触发,才能继续。这个模式没有单独列出来,要不然模式太多了。大家了解一下就可以了,暂时不需要掌握。
触发控制

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

我们这个ADC是12位的,它的转换结果就是一个12位的数据,但是这个数据寄存器是16位的,所以就存在一个数据对齐的问题。
第一种是数据右对齐,就是12位的数据向右靠,高位多出来的几位就补0。
第二种是数据左对齐,就是12位的数据向左靠,低位多出来的几位就补0。
在这里我们一般都使用第一种右对齐,这样读取这个16位寄存器,直接就是转换结果。
那要这个左对齐有啥用呢?
这个用途就是,如果你不想要那么高的分辨率,你觉得0~4095数太大了,我就做个简单的判断,不需要那么高的分辨率。那你就可以选择左对齐,然后再把这个数据的高8位取出来,这样就舍弃掉了后面4位的精度,这个12位的ADC就退化为了8位ADC了。
转换时间
转换时间这个参数,我们一般不太敏感,因为AD转化都很快,如果不需要非常高速的转换频率,那转换时间就可以忽略了。
AD转换是需要一小段时间的,AD转化你的时候有哪些步骤需要花时间呢?
AD转换的步骤:1.采样 2. 保持 3. 量化 4. 编码 其中采样保持可以放在一起,量化编码可以放在一起,总共是两大步。
量化编码好理解,就是我们之前讲过的ADC逐次比较的过程,这个是需要花一段时间的,一般位数越多,花的时间越长。
那采样保持是干什么的呢?为什么需要采样保持呢?

这是因为,我们的AD转换,就是后面的量化编码,是需要一小段时间的,如果在这一小段时间里,输入的电压还在不断变化,那就没法定位输入电压到底是多少了,所以在量化编码之前,我们需要设置一个采样开关,先打开采样开关,收集一下外部的电压,比如可以用一个小容量的电容存储一下电压,存储好了之后,断开采样开关,在进行后面的AD转换。这样在量化编码期间,电压始终保持不变,这样才能精确的定位未知电压的大小。这就是采样保持电路。
那采样保持的过程,需要闭合采样开关,过一段时间再断开,这里就会产生一个采样时间,所以:
STM32 ADC的总转换时间为: TCONV = 采样时间 + 12.5个ADC周期
采样时间可以在程序中进行配置,采样时间越大,越能避免一些毛刺信号的干扰。
12.5个ADC周期是量化编码花费的时间,因为是12位的ADC,所以需要话费12个周期,这里多了半个周期,可能是做了一些其他东西花的时间。
ADC周期就是从RCC分频过来的ADCCLK,这个ADCCLK最大是14MHz,所以下面这个是最快转换时间的例子:
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期 TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
这就是最快1us的时间的来源,如果你采样周期再长一些,它就达不到1us了。另外,你也可以把ADCCLK的时钟设置的超过14MHz,这样的话ADC就是在超频了,那转换时间可以比1us还短,不过这样稳定性就没法保证了。
校准
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差,建议在每次上电后执行一次校准。
启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期。
这段话看上去很复杂,但实际上我们不需要理解,这个校准过程是固定的,我们只需要在ADC初始化的最后,加几条代码就行了。
至于怎么计算的,怎么校准的,我们不需要管。
硬件电路

对于ADC的外围电路,我们应该怎么设计呢?
这里我给出来了3个电路图:
第一个,是电位器产生了一个可调的电压,这里电位器的两个固定端,一端接3.3V,另一端接GND。这样中间的滑动端就可以输出一个0~3.3V可调的电压输出了。我们这里可以接ADC的输入通道,比如PA0口。当滑动端往上滑时,电压增大,反之减小。另外注意一下这个电阻的组织不要给太小,因为这个电阻两端也是直接跨界在电源正负极的,如果阻值太小,那这个电阻就会比较费电,再小就有可能发热冒烟了。一般至少要接KΩ级的电阻。
第二个,是传感器输出电压的电路,一般来说像光敏电阻、热敏电阻、红外接收管、麦克风等等,都可以等效为一个可变电阻,那电阻值没法直接测量,所以这里就可以通过和一个固定的电阻串联分压,来得到一个反应电阻值电压的电路。那这里,传感器阻值变小时,下拉作用变强,输出端电压就下降;传感器阻值变大时,下拉作用变弱,输出端受上拉电阻的作用,电压就会升高。这个固定电阻一般可以选择和传感器阻值相近的电阻,这样可以得到一个位于中间电压区域比较好的输出,当然这里传感器和固定电阻的位置也可以反过来,这样的话,输出电压的极性就会反过来。这就是分压方法输出传感器阻值的电路。
第三个,是简单的电压转换电路,比如你想要测一个0~5V的VIN电压,但是ADC只能接收0~3.3V的电压,那就可以搭建一个这样的简易转换电路。在这里还是使用电阻进行分压,上面阻值17K,下面阻值33K,加一起50K,所以根据分压公式,中间电压就是VIN/50K * 33K 得到的电压范围就是0~3.3V,就可以进入ADC转换了。如果你是5~10V可以采用这个电路,但是如果你的电压再高一些,就不建议使用这个电路了,那可能会比较危险,高电压采集最好使用一些专用的采集芯片,比如隔离放大器等等,做好高低电压的隔离,保证电路的安全。