ADC模数转换器

目录

一、ADC简介

2.图示详解

1.外挂式逐次逼近型ADC

2.STM32的逐次逼近型ADC

二、细节之处

1.输入通道

2.四种转换模式(规则组)

1、单次转换,非扫描模式

​编辑

2、连续转换,非扫描模式

3、单次转换,扫描模式

4、连续转换,扫描模式

3.触发控制

4.数据对齐

5.转换时间

6.校准

7.硬件电路


提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、ADC简介

   注:开关控制对应ADC_Cmd库函数,用于给ADC上电
ADC(Analog-Digital Converter)模拟-数字转换器,ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。

    》12位逐次逼近型ADC,1us转换时间 >>这里涉及到了ADC的两个关键参数,

1.分辨率:一般用多少位来表示,12位AD值,它的表示范围就是0~2^12-1即0~4095.

2.转换时间:就是转换频率AD转换是需要花一小段时间的,这里1us就表示从AD转换开始到产生结果需要花1us的时间,对应AD转换的频率就是1MHz。这个就是stm32 ADC的最快转换频率

        》输入电压范围:0-3.3V,转换结果范围:0~4095。>对应的线性关系

        》ADC有18个输入通道,可测量16个外部和2个内部信号源。外部信号源就是16个GPIO口,在引脚上直接接模拟信号就行了,不需要任何额外的电路,引脚就可以直接能测电压。2个内部信号源是内部温度传感器和内部参考电压,温度传感器可测CPU的温度;内部参考电压是一个1.2v左右的基准电压,它不随外部供电电压变化而变化,如果芯片的供电电压不是标准3.3v,那么测量外部引脚的电压可能就不对,此时可读取基准电压进行校准得到正确的外部引脚电压值。

        》规则组和注入组两个转换单元。属于stm32 ADC的增强功能,普通的AD转换流程为启动一次转换读一次值,然后再启动再读值的流程。增强后,可以列一个组,一次性启动一个组,连续转换多个值,并且有两个组,规则组用于常规使用,注入组用于突发事件。

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

        》STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道,上面所说的16个是这个系列最多的通道数,本型号只有10个。

拓展:
DAC与之相反位数模转换器,是数字到模拟的桥梁!不过学习定时器输出比较讲的PWM,也可实现数字到模拟的转换,同时PWM只有完全导通和完全断开两种状态,无功率损耗,所以在直流电机调速这种大功率应用场景,使用PWM来等效模拟量是比DAC更好的选择,且PWM电路更加简单更常用。而DAC的应用主要是在波形生成领域,比如信号发生器、音频解码芯片等,这些领域PWM不好替代!!实操用的SYM32没有DAC外设。

2.图示详解

1.外挂式逐次逼近型ADC

》外挂式逐次逼近型ADC:(与STM32里的ADC原理基本一样)
它是一款外挂的(独立出来的)ADC芯片,随着单片机集成度的提升现在很多单片机内部就已经集成了ADC外设,不用这种外挂芯片了,引脚可直接测电压非常方便!

1、首先左边IN0-IN7是8路输入通道,通过通道选择开关选中一路输入到下一步进行转换,地址锁存和译码就是想选中哪个通道(8路)就把通道号放在ADDA-ADDC三个引脚上,ALE给一个锁存信号上面对应的通路开关就可自动拨好。这部分就相当于一个可以通过模拟信号的数据选择器,当然STM32的ADC有18个输入通道!

2、逐次逼近方法:信号到一个电压比较器,可以判断两个输入信号电压的大小关系,输出一个高低电平指示谁大谁小;两个输入端一个为待测电压,另一个是DAC的电压输出端(DAC内部是使用加权电阻网络来实现转换,可参考51教程),两者比较并不断调整DAC电压的输入编码值使两者不断逼近,这样DAC的输入数据就是外部电压的编码数据了。电压调节的过程由图中的逐次逼近SAR完成,为了快速常使用二分法查找,8位的ADC从高位到地位需要依次判断8次,12位的需要12次。

3、AD转换结束后,DAC的输入数据(SAR向下的双箭头)就是位置待测电压的编码,通过朝右的双箭头输出到三态锁存缓冲器,8位8根线,12位12根线。

4、引脚:EOC为End of Convert即转换结束信号;START是开始转换,给一个输入脉冲;CLOCK是ADC时钟,因为ADC内部是一步一步进行判断的,需要时钟来推动这个过程;下面的VREF+和VREF-是DAC的参考电压,比如给DAC个数据255,是对应5V还是3.3V就由参考电压决定,DAC的参考电压也决定了ADC的输入范围,所以也是ADC的参考电压;Vcc与GND为供电,通常参考电压+和Vcc一样,会接在一起,负极和GND也是一样接在一起!

2.STM32的逐次逼近型ADC

》STM32的逐次逼近型ADC:

下面截取上图局部,一部分一部分分析:

相比上面的外挂ADC的高级之处:可同时选中多个通道,且转换的时候分成了两组规则通道和注入通道。比喻成餐厅菜单介绍:

1)规则组菜单可同时存16个菜,但是存在一个不足之处:规则组只有一个数据寄存器,就是桌子比较小最多只能放一个菜,如果上16个菜那么前15个菜都会被挤掉,只能得到第16个菜。所以对于规则组转换来说如果使用这个菜单,最好配合DMA来实现,DMA是一个数据转运小助手,它可以每上一个菜之后把这个菜挪到其他地方,防止被覆盖,下节笔记我们一起学习DMA。上图DMA请求就是用来触发DMA进行数据转运的。

(2)注入组就比较高级,比作餐厅的VIP座位,在这个座位上一次最多可以点4个菜,且数据寄存器有4个(可以同时上这4个菜),不必担心数据覆盖。

一般使用规则组就足够,下面也主要涉及规则组,注入组可参考芯片手册!

》触发STM32的ADC开始转换的信号有两种:

(1)软件触发。即在程序中手动调用一条代码,就可启动转换

(2)硬件触发。即上图的这些触发源,上面为注入组的触发源,下面为规则组的触发源,这些触发源主要来自定时器,有定时器的各个通道,还有TRGO定时器主模式的输出。定时器可以通向ADC、DAC这些外设用于触发转换,因为ADC经常需要过一个固定时间段转换一次,正常实现思路为用定时器每隔一定时间申请一次中断,在中断里手动进行一次转换,但就像之前一直强调的频繁进中断会阻塞主程序。一般这样的问题都会有硬件支持,比如以上图举个例子:给TIM3定个1ms的时间,并且把TIM3的更新事件选择为TRGO输出,然后在ADC选择开始触发信号为TIM3的TRGO,这样TIM3的更新事件就能通过硬件自动触发ADC转换,整个过程不需要进中断节省了中断资源。当然也可选择外部中断引脚EXTI_11来触发转换。

》STM32ADC的时钟ADCCLK来自ADC预分频器,而ADC预分频器来源于RCC。如图RCC时钟树:
因为ADCCLK最大14MHz,虽然ADC预分频器有2、4、6、8分频,但实际上只有6分频12MHz,8分频9MHz满足要求。

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


二、细节之处

1.输入通道

下图为ADC通道和引脚复用的关系:(也可对照引脚定义表)

只有ADC1有通道16和17,ADC2和ADC3没有。通道0-15GPIO口的引脚,ADC1和ADC2的引脚完全相同,ADC3中间有些变化,不过本实操所用芯片无ADC3。标绿部分引脚本芯片也无。(STM32F10xxx)

2.四种转换模式(规则组)

用库函数初始化ADC的结构体里,会有两个参数,一个选择单次还是连续转换,另一个选择扫描还是非扫描模式。


1、单次转换,非扫描模式

最简单的一种模式(没用到“菜单”列表),此列表就是规则组里的“菜单”,序列1-16,可在此处“点菜”,就是写入你要转换的通道,在非扫描模式下,菜单只有序列1的位置有效,这时“菜单”同时选中一组的方式就退化为简单选中一个的方式。可在序列1处写入我们想转换的通道,比如上图中的通道2,就可触发转换,转换结果放在数据寄存器里,同时给EOC标志位置1,转换过程结束。判断EOC标志位,如果转换完了就可在数据寄存器里读取结果了,如果想再启动一次转换,就需要再触发一次,以此循环。如果想换一个通道转换,在转换前把序列1位置的通道2改成其他通道。

2、连续转换,非扫描模式

还是非扫描模式,“菜单”只用序列1位置,与上一种单次转换不同之处是它在一次转换结束后不会停止,而是立刻开始下一轮转换,一直持续下去。即只需要最开始触发一次,之后就可以一直转换了,好处是开始转换后不需要等待一段时间,不需要手动开始转换。

3、单次转换,扫描模式

也是单次转换,每触发一次转换结束后就会停下;扫描模式就会用到“菜单”列表,可在菜单“点菜”,比如上图中的几个通道,每个位置是通道几可以任意指定并且可以重复。在ADC初始化结构体里还有个参数——通道数目,如图选了7。

4、连续转换,扫描模式

3.触发控制

之前讲过触发控制,此表为规则组的触发源,也就是下图绿圈部分,有来自定时器的信号、引脚或定时器的信号(具体是引脚和定时器,需要用AFIO重映射来确定)、最后的软件控制位就是软件触发。这些触发信号的选择,可以通过设置表右边的寄存器完成,使用库函数的话只需一个函数给个参数即可。

4.数据对齐

我们这里的ADC是12位的,它的转换结果就是一个12位的数据,但是数据寄存器是16位,所以存在数据对齐的问题。高位补0
1、数据右对齐

2、数据左对齐

一般选择右对齐,这样读取16位寄存器直接就是转换结果,如果是左对齐直接读的话得到的数据会比实际的大,左移四位等于乘16倍。
左对齐的用途是:如果不想要这么高的分辨率,觉得0~4095太大了,就做个简单的判断,不需要这么高分辨率,就可选择左对齐,然后把这个数据的高8位取出,这样就舍弃了后面4位精度,退化为8位ADC。这样也可使用右对齐把12位取出来再做处理,只不过多了一步。

5.转换时间


对于这个参数我们一般不太敏感,因为AD转换速度很快,如果不需要非常高速的转换频率,那么转换时间就可忽略。
AD转换的步骤:采样,保持,量化,编码。
采样保持可放一起,量化编码可放一起,总共两大步。量化编码是ADC逐次比较的过程,这个需要时间,位数越多时间越长;为什么要采样保持?因为AD转换也就是量化编码需要时间,如果在这段时间输入电压还在不断变化,就没法定位输入电压到底在哪里。所以在量化编码之前,需要设置一个采样开关,先打开采样开关收集一下外部电压,比如可用一个小容量的电容存储一下这个电压,存储好之后断开采样开关再进行AD转换,这样在量化编码期间,电压时钟保持不变,这样才能精确定位未知电压的位置,这就是所谓的采样保持电路。这里会产生采样时间,所以可得:

采样保持花费的时间可以在程序里配置,采样时间越大,越能避免一些毛刺信号的干扰,不过转换时间相应被延长。12.5个ADC周期是量化编码所需时间,ADC位12位所以需要花费12个周期,多了0.5个周期可能是要做其他事情。ADC周期就是从RCC分频过来的ADCCLK,ADCCLK最大14MHz,例子就是最快转换时间。其实可以超频转换(>14MHz),不过稳定性不强。

6.校准


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

7.硬件电路

对于ADC外围电路的设计给出以下三个电路图:

图一为电位器产生一个可调的电压,电位器两个固定端一端接3.3V,另一端接GND,这样中间滑动端就可输出一个0~3.3V可调的电压输出,这里可接ADC输入通道如图上PA0口。电阻阻值不可太小,若太小电阻会比较费电,再小就有可能发热冒烟,一般为KΩ级的。
 

图二为传感器输出电压的电路,一般如光敏电阻、热敏电阻、红外接收管、麦克风等都可等效为一个可变电阻N1,与一个固定电阻串联分压,得到一个反应电阻值的电压电路。固定电阻一般可选与传感器阻值相近的电阻,这样可得到位于中间电压区域比较好的输出。
 

图三为一个简单的电压转换电路,比如想测一个0~5V的VIN电压,但ADC只可接收0-3.3V的电压,用电阻分压,如PA2输入点的电压为VIN/50Kx33K。如果电压过高就不建议使用这种电路了,可能比较危险,高电压采集最好使用专用芯片,比如隔离放大器等,做到高低电压隔离保证电路安全。
更多内容在芯片手册第11章!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值