模数转换器主要包括Sigma-Delta型、逐次逼近型和闪速型,应用中工程师普遍关注的问题是如何提高转换精度?本文给出了按实际需要选择并校正模数转换器的一些软件和硬件的应用技巧。
模数转换器(ADC)接收模拟输入(电压或电流),并转换为可被微处理器读取的数字值。图1给出了一个简单的电压输入ADC,假定该器件的输入由两部分组成:参考信号和测量信号,另外还带有一个输出和表示输入值的8位数字字。
参考电压是ADC所能转换的最大值,示例中的8位ADC可转换为介于0V和参考电压之间的任意电压,电压范围分为256个值或步长。步长的大小由下式给定:Vref/256,这里Vref表示参考电压,转换器的步长定义为转换器的分辨率。对于5V的参考电压,步长为:
5V/256=0.0195V或19.5mV
8位转换器将模拟输入表示为数字字,数字字的最高有效位指示输入电压是否大于参考电压的一半(5V参考电压的一半为2.5V),后续的各位均表示前一位所表示范围的一半。
表1说明了这一点,将0010 1100中各位表示的电压相加,可以得到:
0.625+0.156+0.078 =0.859V
ADC的分辨率由参考输入和字宽决定,分辨率定义了可被ADC测量的最小电压变化。如前所述,分辨率的大小等于最小的步长大小,并可用参考电压除以转换值的数目加以计算。
上例的分辨率为19.5mV,这意味着任何低于19.5mV的输入电压得到的输出结果为0,介于19.5mV和39mV之间的输入电压得到的输出结果为1,介于39mV和58.6mV之间的输入电压得到的输出结果为2。
可以通过降低参考输入提高分辨率,如将参考输入由5V变成2.5V,那么分辨率将为2.5/256,或9.7mV。但这时可被测量的最大电压将为2.5V,而非5V。
既能提高分辨率,又不降低可测量电压范围的唯一方法是增加ADC的位数。10位的ADC具有210或1,024个可能的输出代码,因此此时的分辨率为5V/1024,即4.88mV;而相同的参考输入条件下,12位ADC具有1.22mV的分辨率。
ADC的类型
ADC具有各种速率,使用不同的接口电路,并可提供不同的精确度。最常用的ADC类型包括闪速ADC、逐次逼近ADC和sigma-delta ADC。
1. 闪速ADC
闪速ADC是转换速率最快的一类ADC。闪速ADC在每个电压阶跃中使用一个比较器和一组电阻。因此4位ADC具有16个比较器,8位ADC则具有256个比较器。所有的比较器输出连接到一块逻辑器件上,该逻辑器件根据比较器的电压高低确定输出。
闪速ADC的转换速率是比较器延迟和逻辑器件延迟(逻辑器件的延迟通常可以忽略不计)之和。闪速ADC的转换速率很快,但需要占据巨大的IC空间;而且由于所需的比较器数目很大,闪速ADC简直就是功率“黑洞”,需要消耗很高的电流强度。10位闪速ADC所需的电流约为0.5A。
闪速ADC的一种变形就是半闪速ADC,该ADC利用内置的数模转换器(DAC)减少了内部比较器的数目。半闪速转换器的转换速率低于真正的闪速转换器,但高于其它类型的ADC。这里将其归为闪速转换器类型。
2. 逐次逼近ADC
逐次逼近转换器采用一个比较器和计数逻辑器件完成转换。转换的第一步是检验输入是否高于参考电压的一半,如果高于,将输出的最高有效位(MSB)置为1。然后输入值减去输出参考电压的一半,再检验得到的结果是否大于参考电压的1/4,依此类推直至所有的输出位均置“1”或清零。逐次逼近ADC所需的时钟周期与执行转换所需的输出位数相同。
3. Sigma-delta ADC
Sigma-delta ADC采用1位DAC、滤波和附加采样来实现非常精确的转换,转换精度取决于参考输入和输入时钟频率。
Sigma-delta转换器的主要优势在于其较高的分辨率。闪速和逐次逼近ADC采用并联电阻或串联电阻,这些方法的问题在于电阻的精确度将直接影响转换结果的精确度。尽管新式ADC采用非常精确的激光微调电阻网络,但在电阻并联中仍然不甚精确。sigma-delta转换器中不存在电阻并联,但通过若干次采样可得到收敛的结果。
Sigma-delta转换器的主要劣势在于其转换速率。由于该转换器的工作机理是对输入进行附加采样,因此转换需要耗费更多的时钟周期。在给定的时钟速率条件下,Sigma-delta转换器的速率低于其它类型的转换器;或从另一角度而言,对于给定的转换速率,Sigma-delta转换器需要更高的时钟频率。
Sigma-delta转换器的另一劣势在于将占空(duty cycle)信息转换为数字输出字的数字滤波器的结构很复杂,但Sigma-delta转换器因其具有在IC裸片上添加数字滤波器或DSP功能而日益得到广泛应用。
ADC比较器
图2显示了sigma-delta、逐次逼近和闪速转换器的分辨率范围,同时还给出了每种转换器类型的最大转换速率。如图所示,sigma-delta ADC的转换速率在逐次逼近ADC的转换速率范围以内,但比不上转换速率最低的闪速转换ADC。表中没有给出速率和精确度的折衷结果。例如,可以找到8至16位的逐次逼近ADC,但在给定的系列产品中16位ADC的转换速率并不是最快的;而且在闪速ADC中,速率最快的不是12位ADC,而是6位或8位ADC。
上述图表简要描述了ADC技术的当前发展状况。随着CMOS工艺的不断改进,逐次逼近转换的时间已由以前的数十微秒迅速下降至数微秒。虽然并非所有的技术进步都将对所有类型的转换器产生影响,CMOS工艺的改进仍将提高各类转换器的速率,但在ADC芯片上添加更为复杂的DSP功能并不能改进逐次逼近转换器的性能。DSP功能可以改进sigma-delta型ADC,因为该产品可以在芯片上添加更好、更快,也更复杂的滤波器。
采样与保持
ADC转换直流信号的工作原理简单明了。但如果在转换期间输入信号的变化超过一个最低有效位(LSB),ADC将得到不正确(或至少是不精确)的结果。减小误差的一种方法是在ADC之前添加低通滤波器,并选择适当的参数以保证ADC的输入在一个转换周期中的变化不超过一个最低有效位。
处理变化的输入信号的另一种方法是在ADC之前添加采样-保持(S/H)电路,图3显示了采样-保持电路的工作原理。S/H电路具备带有控制输入的模拟(固态)开关,当开关闭合时,输入信号将连接至保持电容,而缓冲器的输出将跟踪输入。当开关开启时,输入信号将与保持电容断开。
图中还给出了S/H的工作波形,S/H输入连接一个缓慢上升的信号,当控制信号较低时(采样模式),输出将跟踪输入;随着控制信号的增强(保持模式),输出将与输入的保持电容断开,并保持在S/H切换至保持模式时的输入值。当电路再次闭合,电容迅速充电,输出再次跟踪输入。通常S/H在ADC转换开始前切换至保持模式,而当转换结束后切回至采样模式。
在理想条件下,保持电容不会发生漏电并且缓冲放大器具有无穷大的输入阻抗,因此输出将保持恒定。但在实际中,保持电容会漏电,而且缓冲放大器的输入阻抗是有限的,因而输出电平将随着电容放电产生缓慢的漂移。
S/H电路在保持模式下保持输出的性能取决于保持电容的质量、缓冲放大器(主要是输入阻抗)的特性和采样/保持开关(实际的电子开关在开路时总会有漏电)的质量。保持模式下输出呈现出的漂移量称为固定偏差率(droop rate),可用毫伏/秒、毫伏/微秒或微伏/微秒来表示。
实际中,S/H电路由于电子开关无法达到理想状况而具有有限的输入阻抗。这意味着在采样模式下,保持电容需要通过某些电阻进行充电,这限制了S/H可获取的输入速率。S/H在采样模式下为获得满刻度输入所必须保持的采样时间称为采集时间,单位是纳秒或微秒。
采样时一些电阻与保持电容相串联,这样的效果等同于低通RC滤波器。这无疑限制了S/H所能获取的最大频率,该频率称为满功率带宽,单位是千赫或兆赫。
如前所述,由于电子开关无法达到理想状况,某些输入信号将出现在输出中,即便在保持模式下也是如此,这种状况称为馈通,单位是分贝。
输出偏移表示输入信号与输出信号之间的差异,S/H电路数据表通常以毫伏的形式表示保持模式下的偏移和采样模式的偏移。
应用软件
使用S/H的ADC系统必须能处理硬件异常情况。在某些系统中,软件通过端口或寄存器输出位直接控制S/H的控制输入。S/H通常置为采样模式,而软件必须满足采集时间要求。在某些系统中,这项工作的完成仅仅只需将S/H置为采样模式,直到需要转换为止。
当S/H置为保持模式后,另一位(或写入地址,或进行其它操作)将启动ADC。转换完成后,软件将读取结果。然而,一旦异常中断(或出现最坏情况的中断堆栈)导致S/H的输出电路变化至少一个最低有效位,将会出现问题。这种情况一旦发生,软件必须在S/H切换至保持模式之前禁止中断,并在开始转换之前开放中断,这样就能保证ADC在发生S/H偏差之前完成转换工作。
软件还必须能调节S/H的充电时间。当电子开关闭合并与S/H电容的输入信号连通时,电容必须在有限的时间内充电,因为此时开关和任何驱动输入的电源都将具有非零阻抗。如果这些阻抗之和充分大,软件将需要增加延迟,以使得保持电容在转换之前,在终值的一个最低有效位变化以内有充分的时间进行充电。
内部微控制器ADC
许多微控制器均带有片上ADC。典型的器件包括Microchip的PIC167C7xx系列产品和Atmel的AT90S4434。大多数微控制器ADC采用逐次逼近法,因为这种方法能对转换速率和微控制器裸片空间成本进行最佳折衷。
PIC16C7xx微控制器包含一个带有模拟输入多路复用器的8位逐次逼近ADC。该系列微控制器具有4至8个通道,内部寄存器控制所选的通道并启动转换。输入一旦选定,在启动A/D转换之前,必须经过一段稳定时间使S/H电容充电。软件必须保证上述操作所需的延迟时间。
转换精确度
一些微控制器(如Microchip系列产品)允许使用一个输入引脚作为参考电压,该引脚通常与某种精密参考电源相连。转换后从A/D转换器上读取的值为:
(Vin/Vref)×256
某些微控制器使用电源电压作为参考。在5V系统下,这意味着Vref为5V。因此采用8位ADC测量3.2V信号将得到如下结果:
(Vin×256)/Vref =(3.2v×256)/5V =16310 =A316
然而得到的结果还取决于5V电源值。如果电源电压超过1%,即为5.05V,那么A/D转换的结果将为:
(3.2V×256)/5.05V=16210=A216
因此电源电压1%的变化将导致转换结果计数改变1。典型电源的电压变化范围为2%或3%, 因此电源电压的变化将对转换结果产生显著的影响。电源电压的输出常常受到电源间负载、温度、交流输入变化的影响。
这里提出了一个影响所有ADC设计的问题:参考电压的精确度。典型的ADC参考电压可为2.5V额定值,但可在2.47V和2.53V(这些数值来自数据表的实数部分)之间变化。如果采用10位的ADC,在上述给定的参考范围极限条件下,转换2V的输入将得到如下结果:当Vref=2.47V时, 转换结果=(2V×1,024)/2.47=82910;当Vref = 2.53V时,转换结果=(2V×1,024)/2.53=80910。
各部分之间参考电压的变化可导致输出发生20个计数的变化。图4显示了参考变化对ADC结果的影响。尽管误差的百分比在整个范围内维持不变,但ADC值越大,误差值显然也越大。
软件校正
有时由于需要得到精确的参考电压,对精确度的要求甚至超过了产品成本所能承受的范围。当无法进行手工调节时,即可采用软件来补偿参考电压的变化。这通常可通过提供已知的用于校正ADC的精确输入来实现。这个参考电压可以非常精确(当然也非常昂贵),因为只有很少的生产线需要这类参考电压。
在上述2.47V示例中,ADC的输入可采用2V的精确电压。当软件读取ADC时,知道正确的值应为819,由此校正常数为829/819,或1.012。类似地,2.53V参考电压的校正常数为809/819,或0.988。
这意味着需要浮点运算来校正ADC值。如果使用的处理器可处理浮点运算,那么这种方法就是可取的。但对于比较简单的处理器,则有可能不具备必要的处理时间或代码空间来实现浮点运算。
进行ADC校正的一种有效方法是查表。但该方法的缺陷是需要足够大的固定存储器来维持对应于每个可能的ADC值的查表值,对于10位的ADC,查表需要1024字的存储空间。
电压参考与其额定值相当接近,否则就不能称其为参考了。假定在工作温度中参考电压足够稳定,ADC误差占ADC读数值的百分比将是恒定的。因为ADC具有有限的分辨率,精度校正ADC误差的精度不会大于1LSB。
这样我们就可按下面给出的方法简化ADC的校正工艺。作为查询表的替代,我们可以另外存储一个值,该值通知软件将要从ADC读取值中添加或删除的(二进制)百分比,由此校正误差。我们可以添加或删除输入的1/8、1/16或1/24,但都将导致精确度下降1 LSB。我们只需存储单个校正常数,而除法运算则可由一系列移位加或移位减运算实现。
上述2.47V示例可由ADC值与.988相乘的结果加以校正,也可通过初始值减去1/128,再减去1/256和1/512得到相同的结果。在初始的2V示例中,采用整数表示法,可得到如下结果:
829-829/128-829/156-829/512 =829-6-3-1 =819
上述结果将ADC读取值校正为819,这是额定参考电压为2.5V条件下的理想值。类似地,2.53V参考电压可通过增加1/128 和1/256加以校正。
我们还必须确信在期望的工作温度范围内参考电压充分稳定,否则在期望温度附近只能得到较好的校正结果。如果参考电压的温度稳定性不够好,那么必须选择更好的参考电压,或者将工作温度范围分为多个段并在每个段上使用不同的校正值。当然,这也意味着需要使用热敏电阻或其它方法来测量温度。
该方法通过对移位结果进行截断舍入而实现舍入误差处理。在2.47V示例给出的电子表格中,所有情形下的校正值均在理想值的两个计数以内。大多数校正值都是正确无误的,或者仅偏差一个计数。2V输入条件下得到的校正结果明显优于最初的偏差(10个计数),这正好满足了诸多应用系统的需要。如果应用系统连这点偏差都无法承受,那么确实需要更好的参考电压或者求助于手工调节。
校正技术同样可用来补偿其它系统的不精确度,如电阻累计误差。如果所测量的系统包含电压输入,即可在输入中应用精确电压,并进行适当的校正,由此在ADC中补偿参考输入的变化并在输入条件下补偿电阻公差的影响。
校正值的计算和使用
校正值可通过读取已知的参考输入并找到适当的校正系数(二进制系数)计算得到。对于上述给定的示例,理想值与最坏条件下的ADC值之间的差异将不会超过1.2%,因此初始值的1/2和1/4中不会出现分数,而能被测试和使用的值只能为1/128、1/256和1/512。这样就可以从接近期望值的地方开始工作。
我们可以轻易地利用计算器求得校正系数,但如果要在应用系统的固定点处理器上计算校正系数,那么还需要采用基于整数的方法。根据该方法,单个字节(或字)用来存储校正常数,而第7位指示参考电压的高低状态(如参考电压为低,则需减去校正值,否则加上校正值)。第0、1和2位指示是否需要使用1/128、1/256和1/512系数。
当然也可为每个可能的系数分别使用一个字节,其中第4个字节指示参考电压的高低状态。
写入校正值
不管使用表格还是校正常数,如何使校正值写入系统呢?任何校正设计的一项关键组成部分就是固定存储器的有效性。许多微控制器都带有片上EEPROM,而校正通常在电路板测试过程中进行。在高产量环境下,校正或许可以利用某类自动测试设备加以实施。
我们通常希望通过使引脚接地,将处理器置于某种“校正模式”中。生产测试设备可用程序加以控制,因此可在模拟输入应用非常精确的电压,并使校正引脚接地。微控制器可进入校正模式,并在该模式下读取参考值并计算补偿值或生成检索表。
在某些情形下,由于内存不够而无法向微控制器添加校正代码。此时就必须使微控制器将ADC值返回至输出引脚(串联情况),或者返回至一组引脚(并联情况),该值由生产测试设备读取。这样外部计算机就能计算校正值或查表值,并经由相同的接口返回至微控制器。
如果生产测试设备能对微控制器的内部电路进行程序控制,那么校正数据就能嵌入闪存的程序数据中。如果校正的参考电压在微控制器以内,那么测试设备首先必须将校正程序载入微控制器中并运行校正程序,然后载入实际的应用代码。
但是某些非常小的微控制器由于没有充足的引脚,因而无法进行必要的校正。在这类情形中,必须使输出引脚还充当校正引脚,可以采用外部电阻使该引脚实现此双重功能。生产测试设备通常在启动选择校正模式之前使引脚接地。
上述功能实现中,微控制器启动时所有的引脚均处于输入状态,并在将校正引脚配置为输出引脚之前读取校正值。如果引脚的电压为高,则启动正常的工作方式;如果引脚的电压为低,则必须在外部接地,由此使微控制器进入校正模式。当然引脚在外部接地时,输出不应对系统产生任何破坏。
如果要校正应用于备用ADC输入的精确参考电压,那么可以应用备用输入本身对系统校正。只需使用一个电阻器即可在备用输入中使ADC电压归零(在上述示例中只需接地即可)。当引脚测量得到的电压超过某些预先确定的阈值(即超过满标度电压的2/3)时,必须使软件进入校正模式。
选择校正电压时,必须在参考电压为最低可能值时,不使ADC到达饱和时的最大值。这能保证计算校正常数(或表)时,不会因为校正常数的位舍入误差而降低精确度。这通常使校正电压高于满标度的90%,尽管期望能选择最接近标准的参考电压以方便设计。
在某些应用中,还可以通过改变ADC的输入来解决参考输入问题:可以采用变化范围为10%的光传感器,取代具有固定值的光传感器,或者采用变化范围为25%的温度传感器。当然还必须考虑这些传感器的精度,但这已超出了本文讨论的范围。
尽管有时很难确定哪种ADC适用于具体的应用系统,但该产品的多个系列使得我们可以轻松地挑选满足需要的产品。使软件与硬件相匹配就能确保选择的ADC满足应用系统的精确度和稳定性要求。