单片机学习!
目录
文章目录
前言
一、ADC简介
1.1 ADC名称
1.2 ADC功能
1.3 分辨率与转换时间
1.4 输入电压与转换范围
1.5 输入通道
1.6 增强功能
1.7 自动监测输入电压范围
1.8 STM32F103C8T6 ADC资源
二、逐次逼近型ADC
2.1 ADC内部结构原理图
2.2 输入通道选择
2.3 电压比较
2.4 输出
2.5 逐次逼近型ADC总结
总结
前言
GPIO只能读取引脚的高低电平,只有两个值:高电平或低电平。而ADC可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示。读取这个变量就可以知道引脚的具体电压是多少。ADC好比一个电压表,可以把引脚的电压值测出来,放在一个变量里。
一、ADC简介
- ADC(Analog-Digital Converter)模拟-数字转换器
- ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
- 12位逐次逼近型ADC,1us转换时间
- 输入电压范围:0~3.3V,转换结果范围:0~4095
- 18个输入通道,可测量16个外部和2个内部信号源
- 规则组和注入组两个转换单元
- 模拟看门狗自动监测输入电压范围
- STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
1.1 ADC名称
ADC模拟到数字转换器,简称模数转换器或者AD转换器。
- AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号。
- DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号。
1.2 ADC功能
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量。建立模拟电路到数字电路的桥梁。
STM32主要是数字电路,数字电路只有高低电平,没有几伏电压的概念。要想读取电压值,就需要借助ADC模拟转换器来实现了。ADC读取引脚上的模拟电压,转换为一个数据,存在寄存器里,再把这个数据读取到变量里来就可以进行显示、判断、记录等操作了。
ADC是模拟到数字的桥梁,DAC是数字到模拟的桥梁。DAC数字模拟转换器,使用DAC就可以将数字变量转换为模拟电压。DAC主要应用在波形生产这些领域,如信号发生器、音频解码芯片等。
还有一个数字到模拟的桥梁是PWM,PWM可以控制LED的亮度、电机的速度等。PMW只有完全导通和完全断开两种状态,这两种状态都没有功率损耗,所以在直流电机调速这种大功率的应用场景使用PWM来等效模拟量是比DAC等好的选择,并且PWM电路更加简单,更加常用,所以PWM的应用空间比DAC更广。
1.3 分辨率与转换时间
STM32的ADC是12位逐次逼近型ADC,1us转换时间。
逐次逼近型是ADC的工作模式,下文展开描述。
12位和1us转换时间涉及到ADC的两个关键参数。
第一个是分辨率,一般用多少位来表示,12位AD值,它的表示范围就是0到2的12次方减1,就是量化结果的范围是0~4095,位数越高量化结果就越精细,对应分辨率就越高。
第二个是转换时间,就是转换频率,AD转换是需要花一小段时间的,这里1us就表示从AD转换开始到产生结果,需要花1us的时间,对应AD转换的频率就是1MHz。1MHz就是STM32 ADC的最快转换频率。如果需要转换一个频率非常高的信号,就需要考虑一下这个转换频率是不是够用;如果信号频率比较低那最大1MHz的转换频率也完全够用。
1.4 输入电压与转换范围
输入电压范围:0~3.3V,转换结果范围:0~4095。
ADC的输入电压一般要求都是要在芯片供电的负极和正极之间变化的。
- 最低电压就是负极0V,最高电压是正极3.3V。
- 经过ADC转换之后,最小值就是0,最大值是4095.
0V对应0,3.3V对应4095,中间都是一一对应的线性关系,计算起来比较简单,可直接乘除一个系数就行了。
1.5 输入通道
ADC有18个输入通道,可测量16个外部和2个内部信号源。
外部信号源就是16个GPIO口,在引脚上直接接模拟信号就行了,不需要任何额外的电路,引脚就直接能测电压。
2个内部信号源是内部温度传感器和内部参考电压。温度传感器可以测量CPU的温度,如电脑可以显示一个CPU温度,就可以用ADC读取这个温度传感器来测量。内部参考电压是一个1.2V左右的基准电压,这个基准电压是不随外部供电电压变化而变化的。如果芯片的供电不是标准的3.3V,那测量外部引脚的电压可能就不对。这时就可以读取这个基准电压进行校准,校准后可得到正确的电压值了。
1.6 增强功能
规则组和注入组两个转换单元,这个是STM32 ADC的增强功能,普通的AD转换流程是,启动一次转换、读一次值,然后再启动、再读值,这样的流程。而STM32的ADC就比较高级,可以列一个组,一次性启动一个组,连续转换多个值。并且有两个组可以启动,一个是用于常规使用的规则组;一个是用于突发事件的注入组。
1.7 自动监测输入电压范围
模拟看门狗自动监测输入电压范围。
ADC一般可以用于测量光线强度、温度这些值。并且经常会有个需求:如果光线高于某个阈值或低于某个阈值;温度高于某个阈值或低于某个阈值时。需要执行一些操作。高于某个阈值、低于某个阈值的判断,就可以用模拟看门狗来自动执行。
模拟看门狗可以监测指定的某些通道,当AD值高于它设定的上阈值或者下阈值时,就会申请中断,可以在中断函数里执行相应的操作。执行这个操作可以不用不断手动读值,再用if进行判断了。
1.8 STM32F103C8T6 ADC资源
STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道。
STM32F103C8T6 ADC资源有ADC1、ADC2 共两个ADC外设。10个外部输入通道也就是它最多只能测量10个外部引脚的模拟信号。上文所说ADC有16个外部信号源,这是这个系列最多有16个外部信号源,但是STM32F103C8T6芯片引脚比较少,有很多引脚没有引出来,所以只有16个外部信号源。
二、逐次逼近型ADC
2.1 ADC内部结构原理图
了解逐次逼近型ADC如何测电压,需要先了解逐次逼近型ADC的内部结构,以下结构图和STM32的ADC原理是一样的,它是ADC0809的内部结构图。ADC0809是一个独立的8位逐次逼近型ADC芯片。在单片机性能还不够强的时候,需要外挂一个ADC芯片才能进行AD换, ADC0809就是一款比较经典的ADC芯片。现在单片机的性能和集成度都有很大的提升,很多单片机内部就已经集成了ADC外设,不用外挂芯片,引脚可以直接测电压。
2.2 输入通道选择
(1)IN0~IN7是8路输入通道。通过(2)通道选择开关,选中输入通道其中一路输入进行转换。(3)地址锁存和译码可以将选中通道的通道号放在(4)ADDA、ADDB、ADDC三个引脚上,然后给一个锁存信号(5)ALE,对应选中的输入通道通路开关就可以自动拨好了。ADDA、ADDB、ADDC三个引脚就是用来控制通道选择开关选择哪一路通道输入的。
这部分就相当于一个可以通过模拟信号的数据选择器。因为ADC转换是一个很快的过程,给个开始信号,过几个us就能转换完成。所以如果要转换多路信号,不用设计多个AD转换器,只需要一个AD转换器再加一个多路选择开关。需要转换哪一路就拨一下多路选择开关选中对应通道,然后再开始转换。
以上就是输入通道选择的部分,ADC0809芯片只有8个输入通道,STM32内部的ADC有18个输入通道,对应通道选择开关就是一个18路输入的多路开关。
2.3 电压比较
输入信号选好后怎么能得出电压对应的编码数据是多少呢?这里需要用逐次逼近的方法来一一比较。(6)电压比较器可以判断两个输入电压的大小关系。输出一个高低电平指示谁大谁小,电压比较器的两个输入端,一个是选中输入通道的带测电压,另一个是DAC的电压输出端。DAC是数模转换器,给DAC一个数据,DAC就可以输出数据对应的电压。DAC内部是使用加权电阻网络来实现的转换。
有一个外部通道输入的未知编码的电压,还有一个DAC输出的已知编码的电压。将两个电压同时输入到电压比较器,进行大小判断。
- 如果DAC输出的电压比较大,就相应调小DAC数据;
- 如果DAC输出的电压比较小,就相应调大DAC数据。
直到DAC输出的电压和外部通道输入的电压近似相等。这样DAC输入的数据就是外部电压的编码数据了,这就是DAC实现的原理,电压调节的过程就是(7)逐次逼近SAR来完成的。
为了最快找到未知电压的编码,通常会使用二分法进行查找。这里ADC0809芯片是8位的ADC,那编码就是从0~255.举例一个未知电压在0~5V之间。
- 第一次比较:用5/2V的电压和未知电压比较,DAC输入电压编码也为255/2也就是128来比较。转换为二进制就是1000 0000.
若未知电压比5/2V的电压小
- 第二次比较:用5/4V的电压和未知电压比较,DAC输入电压编码也为128/2也就是64来比较。转换为二进制就是0100 0000.
若未知电压比5/4V的电压大
- 第三次比较:用(5/4+5/8)V的电压和未知电压比较,DAC输入电压编码也为64+(64/2)也就是96来比较。转换为二进制就是0110 0000.
............
一直进行到第八次比较后,得出与未知电压近似的电压值。
分析发现,在对电压编码进行二等分的时候,就是转化为二进制的数值1000 0000从左到右依次判断:
- 若第一次判断未知电压小于电压编码第一次二等分的值,则二进制数值第一位置0:0100 0000,再用这个值进行第二次判断;
- 若第一次判断未知电压大于电压编码第一次二等分的值,则二进制数值保留第一位置1:1100 0000,再用这个值进行第二次判断。
二进制的8位数值每一位依次判断完后,得到的数值就是未知电压的近似编码电压。
AD转换结束后,(8)DAC的输入数据就是未知电压的编码。
2.4 输出
通过(9)8位三态锁存缓冲器进行输出,8位就有8根线,12位就有12根线。
- EOC:是End Of Convert,转换结束信号。
- START:是开始转换,给一个输入脉冲,开始转换。
- CLOCK:是ADC时钟。因为ADC内部是一步一步进行判断的,所以需要时钟来推动这个过程。
- VREF+和VREF-:是DAC的参考电压。如给一个数据255,是对应5V还是3.3V就取决于参考电压。DAC的参考电压也决定了ADC的输入范围,所以它也是ADC参考电压。
- VCC和GND:整个芯片电路的供电。通常参考电压的正极和VCC是一样的,会接在一起;参考电压的负极和GND也是一样的,会接在一起。一般情况下,ADC输入电压的范围就和ADC的供电是一样的。
2.5 逐次逼近型ADC总结
输入一个未知电压,再用DAC输出一个已知电压和输入的未知电压比较。如果未知电压大,就将DAC输出调高;如果未知电压小,就将DAC输出调低。多次调节后DAC调节得到一个和未知电压接近相等的已知电压,最终得到的已知的DAC电压值就可以表示为未知电压的值。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了ADC.