嵌入式er必知:模数采样知多少(最全总结)

嵌入式ARM 2020-05-25
[导读]  生活环境周围信号万万千,对于一个嵌入式er。我们利用技术去了解世界、改变世界。而一个产品要与外界物理环境打交道,一个至关重要的触角就是采样真实模拟世界的信号,翻译成芯片可理解的数字信号,进而实现很多为人服务的应用产品。那么提到采样,ADC技术你绕不开,今天总结分享一下ADC的点点滴滴。

啥是ADC

在现代电子工业技术中,模数转换器(ADC, A/D,或A-to-D)是一种将模拟信号转换成数字信号的系统。ADC还可以提供隔离的测量,例如将输入模拟电压或电流转换为表示电压或电流大小的数字的电子设备。通常情况下,数字输出是一个与输入成比例的二进制补码,但也有其他的可能性。举些栗子:
  • KTV中麦克风将你唱歌的声音转成数字音频信号,经由信号处理,功放再播放出来
  • 数码相机将物体表面反射的光线转换为数字信号,从而成像
  • 疫情期间必用物资额温枪,将人体红外辐射经由光电转换成电压,最终转换为数字信号进行温度显示
  • .......举不胜举。
ADC将连续时间和连续幅度的模拟信号转换为离散时间和离散幅度的数字信号。转换涉及输入的量化,因此必然会引入少量的误差或噪声。此外,ADC不会连续执行转换,而是定期进行转换,对输入进行采样,从而限制了输入信号的允许带宽。
ADC的性能主要由其带宽和信噪比(SNR)来表征。
  • ADC带宽 (Band width):ADC的带宽主要由其采样率来表征。
  • ADC的SNR:SNR(signal noise ratio)是指信噪比,受许多因素影响,包括分辨率,线性度和准确性(量化级别与真实模拟信号的匹配程度),混叠和抖动。ADC的SNR通常以其有效位数( effective number of bits:ENOB),它返回的每个度量的位数平均来表示,而不是噪声。理想的ADC的ENOB等于其分辨率。
故,选择ADC以匹配待数字化信号的带宽和所需的SNR。如果ADC的采样率大于信号带宽的两倍,那么根据Nyquist–Shannon采样定理,就可以实现完美的重构。量化误差的存在甚至限制了理想ADC的SNR。但是,如果ADC的SNR超过输入信号的SNR,则其影响可能会被忽略,从而导致模拟输入信号的本质上是完美的数字表示。
整这么多文字还是不直观易懂,到底啥是ADC,来个会动的图吧:

须理解的指标

分辨率

ADC看成一个黑匣子,基本的有一个模拟输入及其等效数字输出。下图 所示示例为一个N位ADC。N通常是6到24之间的任何值,常见的是8、10、12或16位。参考电压可能为单端电压,也可能为一个 ~ ,是一个正负电压参考源。
输入是一个模拟电压,范围从0到参考电压,参考电压取决于实际ADC及外围电路。假设使用N位,则可能有 个可能的数字输出值,则1位表示的值为 。在很多书上也称这个指标为LSB(Least Significant Bit)。
这便是分辨率的概念。模数转换器的分辨率表示在模拟值范围内它可以产生的离散值的数量。该分辨率决定了量化误差的大小,因此决定了不使用过采样的理想ADC的最大平均信噪比。
举个栗子,如果给定ADC的最大输入值为5.0V,而ADC为10位类型,则每一位表示。这个ADC的分辨率,或者说量化步长,是4.89 mV。这是它的绝对理论分辨率。在这种特殊情况下,信号的分辨率不能高于 。这个极限称为量化误差,所有的ADC,即使是完美的ADC,都有一定程度的量化误差,具体取决于ADC的分辨率。分辨率的数学定义为:
其中 为ADC的参考电压,M为ADC的量化位数。可见M越大,Q数值越小,分辨率越高。
这个公式简单解读:就是将参考电压按照 进行等分,比如10位ADC,就是将参考电压 等分成1024份,输入电压 与参考电压 之比乘以1024,即为ADC的值。故

量化误差

量化误差是由理想ADC中的量化过程产生的。由于ADC的模拟输入电压与输出数字化值之间的存在舍入误差。 在理想的ADC中,量化误差均匀地分布在 之间,并且信号具有覆盖所有量化水平的均匀分布,因此信号量化噪声比SQNR(Signal-to-quantization-noise ratio)定义为:
其中,M为ADC的位数,M位数越大或越高,SQNR也越大。

精度

量化误差和非线性是模数转换器所固有的误差指标。用最低有效位(LSB)的单位进行度量。比如一个10位ADC,LSB为

非线性度

实际使用的ADC除了上面说的量化误差外,还具有更多的误差源:
  • 差分非线性误差DNL(Differential Non-Linearity):当ADC输出在应该改变的时候没有改变,就会出现DNL误差。例如,假设给定输入的当前输出代码是01101100,并且输入值增加了半步量化。代码应该是01101100 + 1位,或者01101101。当输入电压低于当前输入电压时,也会发生相反的情况。此时由于种种原因,这种情况可能不会发生。在本例中,ADC的误差为±1位DNL。
  • 积分非线性误差INL(Integral Non-Linearity):如果量化水平在整个输入范围内分布不均匀,就会出现INL误差。例如,某ADC具有12位(4096个计数)分辨率和4.096V的参考电压。每个比特数正好表示输入电压变化的1.000mV,因此,输入电压为4096 mV,输出电压为1111 1111 1111,即0xFFF。对于某些adc,输入4095mV,甚至4094mV,仍然会得到0xFFF的数字输出。实际情况是,在整个输入范围内,1位的值发生了非常微小的变化,比如1.001mV或0.999mV。积累的误差会导致一个或两个比特精度的全量程误差。
在为特定应用指定ADC时必须考虑这些因素。

所有ADC都存在由其物理缺陷引起的非线性误差,导致其输出偏离其输入的线性函数(或其他函数,在故意使用非线性ADC的情况下)。这些误差有时可以通过校准来减轻,或通过测试来避免。所谓校准,比如可以通过量点线性校准,假定y为ADC数值,x为输入模拟电压:
其中:
应用实施策略:将上述k/b,利用两个点进行校准,将校准数据k/b存储在非易失存储器中。补充说一下:工程实践中需要校准的原因还因为选取的外围电阻、电容器件都有误差,所以这也是另一个需要标定的重要原因。

采样率

模拟信号在时间上是连续的,因此有必要将其转换为数字序列,这是数字信号处理的基础。因此,需要定义从模拟信号中采样数字序列的速率。该速率称为转换器的采样率或采样频率。可以采样连续变化的带限信号,然后可以通过重构滤波器从离散时间值中再现原始信号。奈奎斯特-香农采样定理表明,只有当采样率高于信号最高频率的两倍时,才可以忠实再现原始信号。个人在使用时,一般会选4倍以上。
由于实际的ADC不能进行瞬时转换,因此在转换器执行转换期间(称为转换时间)输入值必须保持恒定。一个被称为采样保持电路——在大多数情况下,它使用一个电容来存储输入端的模拟电压,并使用一个电子开关或栅极来断开电容与输入端的连接。许多ADC集成电路包括内部的采样保持电路模块。图中的T为采样周期,其倒数就是采样频率。

混叠

ADC通过在不连续时间间隔(离散的含义)内对输入值进行采样来工作。假设以高于奈奎斯特速率的频率对输入进行采样(定义为有用信号频率的两倍),则可以重构信号中的所有频率。如果对高于奈奎斯特速率一半的频率进行采样,则会将它们错误地检测为较低频率,这一过程称为混叠。之所以会出现混淆,是因为每个周期对函数进行两次或两次以下的瞬时采样会导致丢失周期,从而出现频率错误地降低的情况。例如,以1.5 kHz采样的2 kHz正弦波将重构为500 Hz正弦波。
为了避免混叠,ADC的输入必须经过硬件低通滤波,最简单的实现形式为一阶无源RC滤波网络,以去除采样率一半以上的频率。这种滤波器被称为抗混叠滤波器,它对于实际的ADC系统至关重要,该系统适用于具有更高频率内容的模拟信号。在需要防止混叠的应用程序中,可以使用过采样来大大减少甚至消除混叠。
例如:六种不同采样速率采集的数字序列重建的4种波形。其中两种波形在采样率足够情况下未出现混叠。另外两个说明了在较低速率下会失真(混叠增加)。

过采样

为了经济起见,通常以所需的最小速率对信号进行采样,结果是引入的量化误差是白噪声在转换器整个通带上的扩散。如果以远高于奈奎斯特速率的速率采样信号,然后进行数字滤波以将其限制为信号带宽,则会产生以下优点:
  • 过采样可以更轻松地实现模拟抗混叠滤波器
  • 降低的噪声,尤其是在过采样之外还采用噪声整形处理后。
白噪声长啥样?
过采样通常用于音频ADC中,与典型晶体管电路的时钟速度(> 1 MHz)相比,所需的采样率(通常为44.1或48 kHz)非常低。在这种情况下,可以以很少的成本或不增加成本就可以大大提高ADC的性能。此外,由于任何混叠信号通常也都在频带外,因此使用非常低成本的滤波器通常可以完全消除混叠。下图比较直观,可以看出提高采样频率,可以更为真实的重建原始信号,而采样频率低些,对于信号的细部则无法准确重建。

ADC类型

积分型ADC

优点
  • 积分型ADC分辨率高,位数可做到12位甚至更高
  • 线性度非常好。本质上,输入端与一个集成的参考电压相比较来决定输出端,所以线性度将取决于比较器的精度。
  • 电路实现拓扑简单,用于实现这些设备的元件相对较少,因此电路相对简单且生产成本较低。
缺点:
  • 主要缺点是转换速度慢。N位ADC,输出可能需要长达2个N的时钟周期来转换单个采样点
  • 转换原理都是基于对电压积分并将积分后电压与另一电压比较以控制计数,计数输出即为ADC输出。积分对象要么是基于参考电压,要么是基于参考电压和输入电压。
  • 主要用于传感器应用和诸如电压表和电流表等设备,在这些设备中,精度比速度更重要。换句话说积分型ADC采样速度比较低,但精度非常高
  • 积分型ADC有不同的种类,常见的有单、双斜率积分等。增加一个“斜率”,以牺牲转换时间为代价而增加精度。

单斜率积分ADC

比较器将输入电压 与集成基准电压 的值进行比较(请注意,由于 已连接至运算放大器的反相输入,因此我们将 设为负)。同时计算时钟周期数。当积分器输出等于 时,比较器输出逻辑“ 0”,触发计数器和积分器复位,锁存器保持数字输出。



这就是转换时间,知道为啥说这种积分型ADC慢了吧。来看下最差的情况吧,假设输入电压 ,假定 ,假定是20位ADC,那么 !

双斜率积分ADC

双斜率ADC与单斜率ADC的不同之处在于,现在将 与地进行比较,并集成了两个电压 。刚开始时,负输入连接到积分器,使 斜升直到计数器溢出。由于在反相输入会切换到一个负值进行积分,因此积分器输出将始终为正且大于零,因此计数器将继续运行直到溢出为止,这需要2N个时钟周期(= T1)。


在T2时刻,将等于 之和,且为0,也即:





因此, 即为ADC转换的原理,双斜率比单斜率ADC更慢,由于执行了两次积分, 与积分器斜率相关的误差将被抵消,从而从原理上提高了精度。

Sigma-Delta Σ-∆ ADC

从输入端开始,差动放大器产生的输出为Vin与1位DAC输出之间的差。1位DAC的输出可以是以下两个值之一: 。在此拓扑结构中,可将积分器视为取前一个值和当前输入值的移动平均值。
因此,假设刚开始时比较器正向段固定在高于0V的很小一值,比较器反转。其值将为高或1。然后,DAC输出将为 。在下迭代中,将从 的当前值中减去该值。由于先前的值为0V,因此积分器输出现在将为– Vref。此时,比较器输出将为0,而DAC输出将为
在下一个采样中,由于前一个值为 ,积分器输出将为0,并且差动放大器实际上将减去 ,从而将 加到   .比较器输出将为1。
此过程继续迭代进行,因此,对于0V输入,比较器输出将为101010…的稳定流。记住逻辑1表示 ,逻辑0表示 ,那么如对N个样本进行采样并取平均值,则很容易看出平均值为0V。比较器之后的处理块将简单地将其输出为单个值0000…,假设参考值为(  ~ )或2 x
现在,假设 为1V,这是一个5V ADC。 为±2.5V。按照与之前相同的步骤进行迭代操作,输出将为:1011101…输出为1.07V。
概括起来:
Σ-∆ ADC 对所处理信号进行过采样(这个概念见模数采样知多少),并对待处理信号进行低通滤波。通常,在过滤器之后使用Flash ADC转换的比特数小于所需的比特数。所产生的信号连同由FLASH离散电平产生的误差,被反馈回并从输入中做差然后输入到滤波器。这个负反馈的可对噪声形成抑制作用,使它不出现在期望的信号频率。ADC之后的数字滤波器(利用抽取滤波器)可降低采样率,滤除不想要的噪声信号并提高输出分辨率(故称为sigma-delta调制,也称为delta-sigma调制)。

Flash ADC也称直接比较型

FLASH ADC的原理可能是最容易理解的。下图是一个两位ADC的示意图,由许多比较器组成,每个比较器都被提供了比上一个基准值高一个位值的基准电压。因此,对于一个8位ADC,需要256个这样的比较器。对于10位,则需要1024。
FLASH ADC(直接比较型)速度很快。它直接转换输入,而不需要任何采样或繁重的后期处理。问题是,它需要很多比较器,而且很多比较器占用了芯片上的大量硅空间。因此,只有在需要其他ADC实现方法无法达到的极高速度时才使用Fash ADC。

二分法在硬件中体现

实际应用中,还有一个变种比较常用,半 FLASH ADC。它使用两步的过程来减少实际转换链中所需的转换器数量:
  • 首先,将输入信号与恰好位于半 的电平集进行比较。如果它更低,那么最高有效的位MSB,被设置为0,输入被馈送到一个比较器链与参考电压设置为 ,以转换得到其余的位。
  • 如果输入信号高于 ,则将MSB设置为1,从输入信号中减去 。比较器链再次用于获取剩余的位。所以,本质上,半步FLASH ADC,以牺牲一个额外的比较,来节省一半比较器。这种思路还可以继续推演扩展,比如4分 FLASH ADC等等。

逐次逼近寄存器SAR

逐次逼近寄存器(Successive Approximation Register):逐次逼近ADC使用比较器逐次缩小包含输入电压的范围。在每个连续的步骤中,转换器将输入电压与内部数字与模拟转换器的输出进行比较,后者可能表示所选电压范围的中点。在这个过程的每一步,近似都被存储在一个逐次逼近寄存器(SAR)中。例如,假设输入电压为6.3 V,初始范围为0到16v。对于第一步,输入6.3 V与8v (0-16V范围的中点)进行比较。比较器报告输入电压小于8v,因此SAR被更新为将范围缩小到0 - 8v。第二步,将输入电压与4v (0 - 8v的中点)进行比较,比较器报告输入电压高于4v,因此更新SAR以反映输入电压在4 - 8v范围内。第三步,输入电压与6v比较(4v与8v的一半);比较器报告输入电压大于6伏,搜索范围变为6 - 8伏。继续这些步骤,直到达到预期的解决方案为止。
其拓扑结构如下,
为了直观,看看前文的动图:

Pipelined ADC

流水线ADC(也称为子例程量化器)使用两个或多个流水线。首先,进行粗略的转换。第二步,用数模转换器(DAC)确定输入信号的差异。然后将这个差异转换为更细的值,并在最后一步中合并结果。这可以被认为是后续逼近ADC的一种改进,其中反馈参考信号由整个范围的比特(例如,4比特)的中间转换组成,而不仅仅是下一个最重要的比特。结合逐次逼近法和flash adc的优点,该类型具有速度快、分辨率高、模具尺寸小等优点。
在这个原理图中,模拟输入VIN首先被采样并由采样保持器(S&H)保持稳定,而第一阶段的flash ADC将其量化为三位。然后将3位输出馈给3位DAC(精确到12位),然后从输入中减去模拟输出。这个“剩余量”扩大4倍并被送入下一阶段(第二阶段)。这个增加的剩余量继续通过下级流水线,每一阶段提供3位,直到它到达4位flash ADC,将解析最后的4LSB位。因为每个阶段的位是在不同的时间点确定的,所以相同样本对应的所有位在被馈送到数字错误校正逻辑之前都与移位寄存器进行了时间对齐。请注意,当一个流水完成对输入样本的处理,确定本流水采集位并将残差传递到下一个流水时,它便可以开始处理从每个流水中嵌入的采样保持器接收到的下一个样本。这种流水线操作是高吞吐量的原因,这也是流水的概念。

先描述一下坑

本文来解析一个盆友在使用STM32采集电池电压踩过的坑。以STM32F4 的ADC属于逐次逼近SAR 型ADC为例进行分析,参考STM32F405xx  Datasheet,对于如何编写ADC程序就不做描述了。

采集电池电压,利用两个电阻将电池电压分压,然后送入单片机,当电阻如上分别取4M欧/1M欧时,ADC采集到的ADC值与万用表测得的ADC输入端相差很大,取30K欧以及10k欧时,则相差变小。
盆友咨询我这是为什么?我给出了建议,先卖个关子,先来看看应用最为广泛的STM32单片机的一些特性。

STM32 ADC:

STM32 12位ADC是逐次逼近型的模数转换器。它有多达19个多路复用通道,允许它测量来自16个外部源、2个内部源和VBAT通道的信号。通道的A/D转换可以在单次、连续、扫描或间断模式下进行。ADC的结果存储在左对齐或右对齐的16位数据寄存器中。模拟看门狗功能允许应用程序检测输入电压是否超过用户定义的、更高或更低的阈值。
主要功能,具体操作,怎么编程这些细节,有大量的资料就不罗嗦了,主要来看看电气特性。

电气特性

  1. ADC 可支持采样频率 受供电电压影响,供电电压高,可支持采样频率范围更高
  2. 可支持输入电压 范围须在参考电压范围内
  3. 外部输入阻阻抗 最大为
  4. 开关切换阻抗  最大为
  5. 内部采样保持电容  为4pF
上面的公式用于确定误差小于1/4 LSB时允许的最大外阻抗。N = 12(12位分辨率),k是在ADC_SMPR1寄存器中定义的采样周期数。
ADC精度vs.负注入电流:应该避免在任何模拟输入引脚上注入负电流,因为这会显著降低在另一个模拟输入上执行转换的精度。建议在模拟引脚上增加一个肖特基二极管(引脚接地),这可能会注入负电流。
Page 136 图例(上图中标识解释):
  1. 见表68
  2. 实际转移曲线的示例。
  3. 理想转移曲线
  4. 终点相关线
  5. ET =未调整总误差:实际和理想传递曲线之间的最大偏差。EO =偏移误差:第一个实际过渡与第一个理想过渡之间的偏差。EG =增益误差:最后一个理想过渡与最后一个实际过渡之间的偏差。ED =微分线性误差:实际步长与理想步长之间的最大偏差。EL =积分线性误差:任何实际过渡和终点相关线之间的最大偏差。
寄生电容表示PCB的电容(取决于焊接和PCB布局质量)加上焊盘电容(大约5 pF)。寄生电容值高会降低转换精度。为了解决这个问题,应该减少fADC。

回到坑里

将盆友的电路等效绘制一下,忽略ADC采样通道内部ESD保护二极管,以及等效电流源,如下图:
好了,这图一画出来,问题的原因就显而易见了,SAR ADC是将采样电容上的电压通过逐次逼近原理转换为数字量的,按上述图,由于R2为兆级电阻,那么等效加载在采样电容上的电压就不能简单的看成是R1/R2的分压了,此时ADC的输入阻抗在百50K欧级别,简化定性看一下,忽略分布电容影响,计算方便将输入阻抗看成50K直流电阻(实际深入动态分析的话则不可忽略,假定电池电压为5V),具体计算就不做了。
为什么电阻选这么大呢?我想估计是为了将电池电压监控取样回路的电流降低,以节省电量。

跳出坑里

怎么办呢?我觉得这样应该可以:
找一个低功耗的运放做一个阻抗变换就可以兼顾两者需求,当然如果更完善一点,还可以考虑串入一个RC低通滤波环节,可以有效降低噪声。

总结一下

在单片机、DSP信号处理系统中,我们免不了要对物理信号进行采样,需要运用到模数转换器件,模数转换器万万千,那么要用好ADC器件,或者使用单片机、DSP内置ADC,了解这些技术指标以及其描述的真实含义,是非常必要的。
熟悉各类ADC的意义,因为如前文所说,嵌入式设备免不了需要采集物理世界的模拟信号。信号各具特点,有的频率高,有的噪声多,有的需要精度高但速度可能不要很快等等。这里整理几种常见ADC(当然还有其他种类比如电荷平衡原理ADC、分时ADC、FM ADC、时间拉伸ADC、增量编码ADC、Wilkinson ADC等等)的原理及特点,了解各类ADC的基本特点,有助于进行器件选型、系统设计。
对于单片机ADC的使用,个人总结了这几点:
  • 将输入短路,可测量热噪声。实际应用时,将输入端短路,采集一定数量的样本,由于热噪声符合高斯分布,可计算出其期望、方差,接入真实信号可以利用统计规律进行相应的噪声滤波处理。
  • 量化噪声,可以通过输入一定幅度及频率的正弦波,进行度量系统的量化噪声。
  • 设计ADC采样电路时,需要注意阅读芯片手册的电气特性参数,这个对于设计一个稳定的模数采集系统至关重要。

本文主要参考wikipedia, 加入了个人的理解,总结这个也是出于系统梳理知识的目的,并分享给小伙伴们,有喜欢的不妨点个在看,或者转发给需要的朋友。文中如有错误,也请联系我指出错误,不胜感激!

本文授权转载自公众号“嵌入式客栈”,作者逸珺


-END-




推荐阅读



【01】单片机软件模拟SPI接口
【02】不用买开发板, 使用 SkyEye 模拟 ARM Linux
【03】加深理解SPI总线协议,单片机软件模拟SPI接口
【04】牛人在Ubuntu上模拟ARM开发环境
【05】单片机软件模拟SPI接口—加深理解SPI总线协议


免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
热门推荐
相关推荐
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦