ADC的原理和功能

ADC的简介

ADC:ADC指模/数转换器或者模拟/数字转换器,所谓的模/数转换器(A/D转换器)就是把电模拟量转换成数字量的电路,在当今的现代化生产中,被广泛应用的实时检测系统和实时控制系统都离不开模/数转换器,一个实时控制系统要实现微机监控实时现场工作过程中发生的各种参数变化,首先要由传感器把实时现场的各种物理参数(如温度、湿度、压力、位移等)测量出,并且转换为相应的电信号,经过放大、滤波处理,再通过多路开关的切换和采样/保持电路的保持,送到A/D转换器,由A/D转换器将电模拟信号转化为电数字信号,之后才能被微机采集,微机按一定的算法输出控制量,并且输出。输出的数据经过D/A转换器(数/模转换器)将数字量转换为电模拟量去控制执行机构。要实现闭环控制系统,A/D和D/A转换器由其关键。A/D转换器也称ADC,D/A转换器也称DAC。

下图为微机与控制系统的接口图和嵌入式闭环控制系统框图:

图中的

传感器:亦称换能器,是把现场各种物理信号按一定规律转换成与其对应的电信号。它是实现测量和控制的首要环节,是测控系统的关键部件。

放大器:经传感器转换后的电量如电流、电压的信号幅度很小,很难进行模数转换,因此,必须有放大环节。放大器即把传感器输出的电信号放大到AD转换所需要的量程范围。

低通滤波器:低通滤波器的作用是选出有用的频率信号,抑制无用的杂散高频于扰,提高信噪比。

多路开关:多路开关的作用是进行信号切换,即一次只能把一路信号传送到AD转换器,当对多路实时现场采集信息时,多路开关可对多路信号进行切换处理,控制每次只送一路信息到A/D转换器,实现多路信号的分时处理,从而降低整个系统的成本。

采样/保持电路:从启动信号转换到转换结束的数字量输出,经过一定的时间,而模拟量转换期间,要求模拟信号保持不变,所以必用采样保持器。该电路具有两个功能;采样-跟踪输入信号:保持-暂停跟踪输入信号,保持已采集的输入信号,确保在A/D转换期间保持输入信号不变。

AD转换器:把采样/保持电路锁存的模拟信号转换成数字信号,等待CPU用输入指令读到微机内。

ADC的转换方法

实现A/D转换的方法有很多,常用的有计数法、双积分法和逐次逼近法。

1)计数式A/D转换法

计数式A/D转换的原理图,其中,Vi是模拟输入电压,Vo是D/A转换器的输出电压,C是控制计数端,当C=1时,计数器开始计数,C=0时,则停止计数。D7~D0是数字量输出,数字输出量又同时驱动一个D/A转换器。

具体工作过程如下:首先开始转换信号有效(由高变低),使计数器复位,当开始转换信号恢复高电平时,计数器准备计数。因为计数器已被复位,所以计数器输出数字为0。这个0输出送至D/A转换器,使之也输出0V模拟信号。此时,在比较器输入端上待转换的模拟输入电压Vi大于Vo(0V),比较器输出高电平,使计数控制信号C为1。这样,计数器开始计数。从此D/A转换器输入端得到的数字量不断增加,致使输出电压Vo不断上升。在Vo<Vi时,比较器的输出总是保持高电平。当V上升到某值时,第一次出现Vo>Vi的情况,此时,比较器的输出为低电平,使计数控制信号C为0,导致计数器停止计数。这时候数字输出量D7~D0就是与模拟电压等效的数字量。计数控制信号由高变低的负跳变也是AD转换的结束信号,它用来通知计算机,已完成一次A/D转换。

计数式AD转换的特点是简单,但速度比较慢,特别是模拟电压较高时,转换速度更慢。当C=1时,每输入一个时钟脉冲计数器加1。对一个8位A/D转换器,若输入模拟量为最大值,计数器从0开始计数到255时,才转换完毕,相当于需要255个计数脉冲周期对于一个12位AD转换器而言,最长的转换周期达4095个计数脉冲周期。

2:双积分式A/D转换法{毫秒级}

双积分式AD转换的基本原理是对输入模拟电压和参考电压进行两次积分,变换成与输入电压均值成正比的时间间隔,利用时钟脉冲和计数器测出其时间间隔,因此,此类D/A转换器具有很强的抗工频干扰能力,转换精度高,但速度较慢,通常每秒转换频率小于10Hz,主要用于数字式测试仪表,温度测量等方面。双积分式A/D转换的电路原理如下图所示。电路中的主要部件包括积分器、比较器、计数器和标准电压源。

首先电路对输入待测的模拟电压Vi进行固定时间的积分,然后换至标准电压进行固定斜率的反向积分,如(b)所示。反向积分进行到一定时间,便返回起始值。从图(b)中可看出对标准电压进行反向积分的时间T正比于输入模拟电压,输入模拟电压越大,反向积分回到起始值的时间越长。因此,只要用标准的高频时钟脉冲测定反向积分花费的时间,就可以得到相应于输入模拟电压的数字量,即实现了A/D转换。

(3)逐次逼近式A/D转换法{微秒级}

逐次逼近式A/D转换法是A/D芯片采用最多的一种A/D转换方法,和计数式A/D转换一样,逐次逼近式A/D转换时,是由D/A转换器从高位到低位逐位增加转换位数,产生不同的输出电压,把输入电压与输出电压进行比较而实现。不同之处是用逐次逼近式进行转换时,要用一个逐次逼近寄存器存放转换出来的数字量,转换结束时,将最终的数字量送到缓冲寄存器中,其逻辑电路如图所示。输出为4位的逐次逼近A/D转换过程如图所示。当t0时刻启动信号由高电平变为低电平时,复位逐次逼近寄存器,使之清0,此时,D/A转换器输出电压V0也为0,当启动信号由低变为高电平时,转换开始,同时,逐次逼近寄存器进行计数。逐次逼近寄存器计数时和普通计数器不同,它不是从最低位向高位每次加1计数和进位,而是通过类似对分搜索的方式控制逐次比较寄存器进行计数。具体地讲,在启动信号后第一个时钟脉冲时,控制电路使逐次逼近寄存器的最高位为1,使它的输出为1000 B,这个数字进入D/A转换器,则其输出电压Vo为满量程的128/255。这时,如果Vo大于Vi那么,比较器输出低电平,控制电路根据此信号清除逐次逼近寄存器中的最高位;如果Vo小于Vi,比较器输出高电平,控制电路据此保留最高位的1,比较结果是C的状态为1,则输出寄存器的状态B4为1。此时逐次逼近寄存器的内容为1000 B,下一个时钟脉冲t1时刻控制电路使次高位B3为1。于是,逐次逼近寄存器的内容为1100 B,这个数字进入D/A转换器输出电压值为满量程的192/255,此数值与输入电压Vi比较,结果Vo大于Vi,则C输出状态为0,控制电路据此使B3位复位,输出寄存器的状态B3为0,再下一个时钟脉冲t2时刻时,控制电路使B2位为1,重复上述过程,直到B0位。经过4次比较以后,逐次逼近寄存器中的数据BBBB=1001就是A/D转换后,与被测(输入)模拟量相应的数字量。转换结束后,控制电路送出一个低电平信号作为结束信号,同时,将逐次逼近寄存器中的数字量送入缓冲寄存器,予以输出数字量从上面的过程可以分析出,用逐次逼近法时,首先使最高位置1,这相当于取出最大允许电压的1/2与输入电压比较,如果搜索值在最大允许电压的1/2范围内,那么,最高位置0,否则最高位置1。之后,次高位置1,相当于在1/2的范围中再作对分搜索。如果搜索值超过最大允许电压的1/2范围,那么,最高位为1,次高位也为1,这相当于在另外的一个1/2范围中再作对分搜索。

因此逐次逼近法的计数实质就是对分搜索法。逐次逼近式A/D转换法的特点是速度快,转换精度较高,对N位A/D转换只需N个时钟脉冲即可完成,一般可用于测量几十到几百微秒的过渡过程的变化,是计算机A/D转换接口中应用最普遍的转换方法

而STM32的ADC外设均采用逐次逼近式A/D转换法!!!

ADC的主要参数

1.分辨率(Resolution):

分辨率反应A/D转换器对输入微小变化响应的能力,通常是用数字输出最低位(LSB)所对应的模拟输入的电平表示,n位A/D转换能反应“1/2”满量程的模拟输入电平,由于分辨率直接与转换器位数有关,所以一般也可以简单的用数字量的位数来表示分辨率,及n位二进制数,最低位所具有的权值,就是她的分辨率!!!

需要注意的是,分辨率与精度是两个完全不同的概念,不要把两者混淆,及时分辨率很高,也可能由于别的原因使其精度不高!!

2.精度(Absolute Accuracy)

精度又分为绝对精度(Absolute Accuracy)和相对精度(Relative Accuracy)两种表示方法:

(1)绝对精度

在一个转换器种,对应于一个数字量的实际模拟输入电压和理想模拟输入电压之差并非一个常数,把她们之间的差的最大值,定义为“绝对误差”,通常以数字量的最小有效位(LSB)的分数值来表示绝对精度,如±LSB。绝对误差包括量化精度和其他所以精度。

(2)相对精度:

是指整个转换范围内,任一数字量所对应的模拟输入量的实际值于理论值的差,用模拟电压满量程的百分比表示:

如,满量程为10V,10位A/D芯片,若其绝对进度为±1/2LSB,则其最小有效位的量化单位为:9.77mV,其绝对精度=4.88mV,其相对精度为0.048%。

3.转换时间(Conversion Time)

转换时间是指完成一次A/D转换所需要的时间,即由发出启动转换命令到转换结束信号开始的有效的时间间隔。转换时间的倒数又称为转换速率。为了保证转换的正常运行,采样速率必须小于或等于转换速率,也可以说转换速率是最大的采样速率,我们经常的把采样速率与转换速率相等。

4.量程

量程是指所能转换的模拟输入电压范围,分单极性,双极性两个类型:例如:单极性量程为0~+5V,0~+10V;双机型的量程为-5V~+5V。

D/A转换器的原理与结构在本文就不再详细介绍,如果有兴趣的小伙伴们可以自己去了解或者学习:D/A转换器的工作原理、T型电阻解码网络、D/A转换器分类及其重要参数与指标。

基于参考手册分析STM32F10XXX的ADC主要特性

在使用ADC前需要了解每一个芯片内ADC的参数与简介,就需要在选择芯片的时候查看阅读她的features!!!如下图就是配置STM32F series(系列)所需要知道的ADC外设简介。如果需要详细的了解不同芯片的ADC,还是需要去查看参考手册。如果需要知道哪些引脚可以用ADC需要去看数据手册!!!

基于参考手册的STM32F10XXX的ADC简介与主要特性分析

STM32F10XXX的ADC的简介:12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。对于小容量、中容量和大容量。

接下来我们以STM32F10XXX为例分析一下他的ADC主要特性,大致分析他的参考手册:

(1)可以配置ADC为12位的分辨率【最大电压/2^12】。

(2)ADC有两种通道,一种是规则通道一种是注入通道,转换的时候,可以按设置的通道顺序依次的进行转换。例如某些ADC通道平时不用,但特定情况下突然需要用到此打开通道,那么通常就采用注入通道的手段。也就是在别的通道规则采样的时候,突然来了个插队。模拟看门狗就是可以设定一个阈值,如电压超过2.7v,当电压真的超过2.7V的时候,就会产生一个硬件中断,溢出事件是与电机相关的,当溢出的时候就会产生一个中断。

(3)单次转换模式:ADC只采样一次就关闭,只执行一次转换。

(4)连续转换模式:ADC一种连续的采样,当有需要的时候才读取ADC采样到的值,也可以随时关闭。

(5)从通道0到通道n的自动扫描模式:一个ADC具有着许许多多的通道,但一个ADC在同一时刻只能读取其中一个通道的值,那么在一个ADC内有多个通道都需要被采集的时候,ADC就会从0到通道n的自动扫描。有16个多路通道。可以把转换组织成两组:规则组和注入组。在任意多个通道上以任意顺序进行的一系列转换构成成组转换。例如,可以如下顺序完成转换:通道3、通道8、通道2、通道 2、通道0、通道2、通道2、通道15。也可以设置多个ADC器件同时,如果设置3个ADC对同一个通道进行采集,那么他的速率就是原来的3倍了(交替采集模式)。规则通道和注入通道都是有最大数量限制的。注入通道的前提是要设置好规则通道!!ADC的IO分配是随着芯片系列型号不同而不同的。

(6)带内嵌数据一致性的数据对齐:12位的ADC但没有12位的寄存器,所以只能保存在16位的寄存器内,要么选择右对齐,要么选择左对齐,这样就要有的位置被舍弃掉。

SEXT:SEXT位表示扩展符号值。

注意在数据左对齐的时候,注入组和规则组不是对称的,因为有SEXT位。

(注意:如果分辨率是6bit的时候,那么数据左对齐的时候,他的六位数据并不是高8位的高6位,而是低8位的高6位!!!!!!)

(7)可以独立设置各通道的采样时间:但我们经常的把采样时间与转换时间取相等。

(8)双重模式:用两个ADC器件对同一通道进行采集,那么采集的速度是原来的两倍

(9)ADC的供电要求:2.4V~3.6V,ADC的输入范围:VREF-必须要连接到VSSA,在此我们需要知道芯片各类关于电源名词的定义,这些定义十分的重要,需要牢记!!!

VCC

电路的供电正电压

VDDD

芯片的工作数字正电压

GND

电路的供电负电压

VSSD

芯片的工作数字正电压

VDD

芯片的工作正电压

VREF+

ADC基准参考正电压

VSS

芯片的工作负电压

VREF-

ADC基准参考负电压

VDDA

芯片的工作模拟正电压

VBAT

电池或其他电源供电

VSSA

芯片的工作模拟负电压

VEE

负电压供电

可以根据每个开发板的原理图来找到VREF+:以我手上的STM32F103ZET6的开发板来看,那么他的VDDA和VREF+是3.3V,VSSA和VREF-接的是地。

VREF+就是模拟电源输入电压(VIN)的上限!!!如果测超过3.3V的电压很容易把ADC模块烧掉!!!(虽然没有亲手烧,虽然电源要求的是最大不超过3.6V,但是建议大家还是测量在3.3V以下的!!!按原理来说,例如你ADC1的通道0电压超了,烧毁的不仅仅是ADC1的通道0,而是整个ADC1这个器件)。

ADC框图的大致分析

可以看到ADC的时钟是ADCCLK提供的,根据他的存储器映像也可以知道ADCCLK是由APB2提供的,所以不考虑分频的情况下ADCCLK实际是取决于APB2线的PCLK2,

模拟看门狗,设置了阈值的上限和下线,如果超过了阈值的上限和下限,就会产生一个看门狗中断。当然转换结束和注入结束也可以触发中断!!

ADC也可以搭配定时器使用,分为规则组和注入组!!

(注意:ADC与定时器搭配不能选择基本定时器,只能选用通用定时器和高级定时器)

那么ADC的框图的就大致分析完了。接下来我们就从HAL库代码对ADC进行说明讲解。

ADC结构体成员分析

句柄结构体

HAL库在使用每一个外设的时候,都先需要去看每一个外设的句柄结构体,XXX_HandleTypeDef;那ADC外设需要看的就是ADC_HandleTypeDef,通常是在stm32f1xx_hal_adc.h中被定义,可以发现ADC的句柄结构体中有6个成员:分别是Instance、Init、*DMA_Handle、Lock、State、ErrorCode。

Instance:用于设置寄存器基地址的指针

Init:ADC初始化参数结构体,设置ADC的基本参数,时钟、分辨率、扫描模式等等。

*DMA_Handle:如果你的ADC需要用到DMA处理的话,就需要用到DMA的Handle对DMA进行配置。

Lock:ADC锁定对象,HAL库为了保证代码在多线程环境下执行,增添了锁的概念,感兴趣的小伙伴也可以在此深入去了解HAL库锁的概念!。

ErrorCode:如果我们配置有错误,可以根据ErrorCode错误码来查找原因

typedef struct
{
  ADC_TypeDef                   *Instance;              /*!< Register base address,寄存器基地址指针 */

  ADC_InitTypeDef               Init;                   /*!< ADC required parameters,ADC初始化参数结构体*/

  DMA_HandleTypeDef             *DMA_Handle;            /*!< Pointer DMA Handler DMA处理程序句柄指针*/

  HAL_LockTypeDef               Lock;                   /*!< ADC locking object ADC锁定对象*/
  
  __IO uint32_t                 State;                  /*!< ADC communication state (bitmap of ADC states) ADC通信状态*/

  __IO uint32_t                 ErrorCode;              /*!< ADC Error code ADC错误码 */
}ADC_HandleTypeDef;

初始化结构体

HAL库函数对每个外设都建立了一个初始化结构体xxx_InitTypeDef(xxx为外设名称),结构体成员用于设置外设工作参数,并由HAL库函数xxx_Init()调用这些设定参数进入设置外设相应的寄存器,达到配置外设工作环境的目的。结构体 xxx_InitTypeDef和库函数xxx_Init 配合使用是HAL库精髓所在,理解了结构体xxx_InitTypeDef每个成员意义基本上就可以对该外设运用自如了。结构体xxx_InitTypeDef定义,在stm32f1xx_hal_xxx.h文件中,库函数xxx_Init定义在stm32f1xx_hal_xxx.c文件中,编程时我们可以结合这两个文件内注释使用。

typedef struct
{
  uint32_t DataAlign; 
  uint32_t ScanConvMode;
  uint32_t ContinuousConvMode;  
  uint32_t NbrOfConversion;  
  uint32_t DiscontinuousConvMode;
  uint32_t NbrOfDiscConversion; 
  uint32_t ExternalTrigConv;  
}ADC_InitTypeDef;

可以看到ADC_InitTypeDef有7个成员:

DataAlign:输出数据的对齐方式一般选择右对齐,因为左对齐的话还要换算。

ScanConvMode:如果是单通道的ADC不用设置,如果是2个通道以上的话就需要开启扫描设置他们的顺序。

ContinuousConvMode:连续转换模式是否使能,如果不使能,则ADC转换一次后就停止,如果需要再次用到ADC就要手动进行开启。

NbrOfConversion:指的是ADC规则转换的数目。

DiscontinuousConvMode:是否开启不连续采样模式,一般都是选择禁止。

NbrOfDiscConversion:不连续采样通道是要在设置不连续

ExternalTrigConv: 外部事件触发选择,选择有很多如定时器事件、外部中断事件、看门狗事件。

ADC_ChannelConfTypeDef结构体

接下来我们介绍一下ADC_ChannelConfTypeDef结构体;成员有Channel、Rank、SamplingTime。

Channel:ADC选择的转换通道。

Rank:ADC序列的数目

SamplingTime:ADC的采样时间

typedef struct 
{
  uint32_t Channel; 
  uint32_t Rank; 
  uint32_t SamplingTime; 

}ADC_ChannelConfTypeDef;

那么对于ADC通道的原理介绍和简单代码分析就到这啦,ADC相对于其他外设较为简单,但也常常需要配合其他外设一起使用,如USART串口外设,用来返回ADC采样的值,后续等发布完串口的原理讲解与代码分析后会出一篇关于ADC单通道、多通道的中断读取以及使用串口回显的一个实践。

本文就到这里啦,希望大家通过本文可以对ADC有深入的了解,毕竟知道外设原理和代码的实现才能更好的去使用外设,如果有错大家可以指出哟,感兴趣或者有不明白的地方的小伙伴可以私信问我!!如果喜欢可以点赞+关注哟!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值