ADC模数转换器

122次阅读
没有评论

STM32 主要是数字电路,数字电路只有高低电平,没有几 V 电压的概念,所以如果想读取电压值,就需要借助 ADC 模数转换器来实现了,ADC 读取引脚的模拟电压,转换为一个数据,存在寄存器里,我们再把这个数据读取到变量里来,就可以进行显示、判断、记录等等操作了,ADC 可以将模拟信号转换为数字信号,是模拟电路到数字电路的桥梁,ADC 是模拟到数字的桥梁,那反过来,有模拟到数字的桥梁 那肯定就有数字到模拟的桥梁,这就是 DAC,数字模拟转换器,使用 DAC 就可以将数字变量转化为模拟电压,不过在上一节,我们还学到了一个数字到模拟的桥梁,PWM,上一节我们使用 PWM 来控制 LED 的亮度、电机的速度,这就是 DAC 的功能,同时 PWM 只有完全导通和完全断开两种状态,在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景,使用 PWM 来等效模拟量,是比 DAC 更好的选择,并且 PWM 电路更加简单,更加常用,所以可以看出 PWM 还是挤占了 DAC 的很多应用空间,自前 DAC 的应用主要是在波形生成这些领域,比如信号发生器,音频解码芯片等,这些领域 PWM 还是不好替代的,这就是 ADC 和 DAC 的简单介绍了,我们本节学习的是 ADC,DAC 大家就自行了解了,我们这个型号的 STM32 也没有 DAC 的外设

STM32 的 ADC 是,12 位(分辨率,一般用多少位来表示,12 位 AD 值,它的表示范围就是 0 - 2 的 12 次方减 1,就是量化结果的范围是 0 -4095,位数越高,量化结果就越精细,对应分辨率就越高)逐次逼近型(ADC 的工作模式)ADC,1us 转换时间(转换频率,AD 转换是需要花一小段时间的,这里 1us 就表示从 AD 转换开始,到产生结果,需要花 1us 的时间,对应 AD 转换的频率就是 1MHz,这个就是 STM32 ADC 的最快转换频率,如果你需要转换一个频率非常高的信号,那就要考虑一下这个转换频率是不是够用,如果你的信号频率比较低,那这个最大 1MHz 的转换频率也完全够用了)

输入电压(一般要求都是要在芯片供电的负极和正极之间变化的,0V 对应 0,3.3V 对应 4095,中间都是一一对应的线性关系)范围:0-3.3V,转换结果范围:0-4095

18 个输入通道,可测量 16 个外部(16 个 GPIO 口,在引脚上直接接模拟信号就行了,不需要任何额外的电路,引脚就直接能测电压)和 2 个内部信号源(内部温度传感器和内部参考电压,温度传感器可以测量 CPU 的温度,比如你电脑可以显示一个 CPU 温度,就可以用 ADC 读取这个温度传感器来测量,内部参考电压是一个 1.2V 左右的基准电压,这个基准电压是不随外部供电电压变化而变化的,所以如果你芯片的供电不是标准的 3.3V,那测量外部引脚的电压可能就不对,这时就可以读取这个基准电压进行校准,这样就能得到正确的电压值了)

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

模拟看门狗自动监测输入电压范围,这个 ADC,一般可以用于测量光线强度、温度这些值,并且经常会有个需求,就是如果光线高于某个阈值、低于某个阈值,或者温度高于某个域值、低于某个阈值时,执行一些操作,这个高于某个值、低于某个阈值的判断,就可以用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当 AD 值高于它设定的上阈值或者低于下阈值时,它就会申请中断,你就可以在中断函数里执行相应的操作,这样你就不用不断地手动读值,再用 if 进行判断了

STM32F103C8T6 ADC 资源:ADC1、ADC2,10 个外部输入通道(也就是它最多只能测量 10 个外部引脚的模拟信号,前面说 16 个外部信号源,这是这个系列最多有 16 个外部信号源,但是我们这个芯片引脚比较少,有很多引脚没有引出来)

接下来我们来了解一下这个逐次逼近型 ADC 到底是怎么测电压的

这就是逐次逼近型 ADC 的内部结构,了解这个结构对你学习 STM32 的 ADC 有很大帮助,因为 STM32 的 ADC 原理和这个是一样的,但是 STM32 只画了一个框表示 ADC,并没有描述内部结构

ADC 模数转换器

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

首先左边这里 IN0~IN7,是 8 路输入通道,通过通道选择开关,选中一路,输入到这个点进行转换,下面这里是地址锁存和译码,就是你想选中哪个通道,就把通道号放在这三个脚(ADDA,ADDB,ADDC)上,然后给一个锁存信号(ALE),上面这里对应的通路开关就可以自动拨好了,这部分就相当于一个可以通过模拟信号的数据选择器,因为 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。

这样依次进行下去,就能最快地找到未知电压的编码,并且这个过程,如果你用二进制来表示的话,你会发现 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 参考电压,最后左边是整个芯片电路的供电,VCC 和 GND,通常参考电压的正极和 VCC 是一样的,会接在一起,参考电压的负极和 GND 也是一样的,也接在一起,所以一般情况下,ADC 输入电压的范围就和 ADC 的供电是一样的。

正文完
 0
评论(没有评论)