You are on page 1of 13

AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

AVR120:AVR 的 ADC 校正和说明


翻译:邵子扬 2006 年 10 月 20 日
http://shaoziyang.bloger.com.cn
shaoziyang@gmail.com

特点:
 理解模拟到数字转换(ADC)的特点
 测量参数说明 ADC 特点
 温度、频率和电压的依赖性
 偏移量和增益误差补偿

1 介绍
这篇应用笔记解释了各种 ADC(模拟到数字转换)的特性以及它们怎样影响测量。同时说明
了怎样在产品测试中测量这些参数,以及怎样在运行时补偿测量误差。

AVR 单片机的 Flash 存储器的一个很大的优点在于校正代码可以用程序替换,这样校正代


码不会在最终产品中占用空间。

2 理论
在进入讨论前,先介绍一些中心概念。下面小节(一般 ADC 的概念)可以忽略如果读者已经
熟悉了量化、分辨率和 ADC 转化。

2.1 一般 ADC 的概念


ADC 转变一个模拟输入信号为数字输出参数,表示出输入信号和参考信号的相对大小。为了
更好的说明 ADC,这篇应用笔记区别说明完美、理论和实际的 ADC。

一个完美的 ADC 只是一个理论概念,在实际中并不存在。它有无限分辨率,每个输入在指定


范围输出一个唯一的值。理想的 ADC 是一个线性转换函数,如图 1。
图 1. 完美的 ADC

第 1 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

为了定义一个理论的 ADC,必须介绍量化的概念。由于将 ADC 数字化,不可能连续的输出数


值,输出范围分为一定的台阶,每个都是一个可能的输出值。这意味着一个输出值不是只
对应一个唯一输入,而是一个小范围的输入值。结果就是一个阶梯转换函数,分辨率是不
同输出的个数。例如,ADC 输出为 8 个台阶,即分辨率是 8,或者说 3 位。转换函数如图 2 所
示,理论 ADC 等于完美的 ADC 在每一级台阶的中间点。这说明理论 ADC 本质上是输入参数对
应的最接近的台阶输出参数。

图 2. 理论上的 3 位 ADC 转换函数

对于一个理论上的 3 位 ADC,最大误差是±1/2 台阶,也就是说最大的量化误差总是 1/2


LSB,LSB 是输入电压对应输出参数最小数据位。实际的 ADC 还存在其他误差,这将在后面
说明。

2.2 转换范围
Atmel 的 AVR 单片机可以配置为单端输入或者差分输入。单端输入用于测量单个通道的输入
电压,差分模式用于测量两个不同通道之间的差。不论哪种模式,每个通道的输入电压范
围都要在 GND 到 Avcc 之间。

使用单端模式,相对于 GND 的输入电压被转换为数值信号。使用差分模式,从差分运放的输


出(可选增益)转化为数字量(可能是负数)。一个简化的图例如图 3:

第 2 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

图 3. 简化的 ADC 输入电路

为了决定转换范围,转换电路需要一个参考电压(VREF),用于代表最大输出值。根据数据
手册,对于标准芯片 VREF 至少是 2V,对于工作电压是 1.8V 的芯片参考电压允许低至 1V,
对于单端输入和差分输入都是一样。

2.2.1 单端转换范围
单端转换输入通道直接连到转换电路,如图 3A 所示。AVR 的 10 位 ADC 将从 GND 到 VREF 的连
续输入信号转换为从 0 到 1023 的离散输出信号。

2.2.2 差分转换范围
差分转换连接两个输入通道到可变增益差分放大器,放大器的输出反馈到转换电路,如图
3B。差分电压从-VREF 到+VREF ,转换结果从-512 到+511。XX。即使测量负的差分电压,每个通
道的输入电压范围还是在 GND 到 AVcc 之间。

小于-VREF 的差分电压将得到最小值(在 10 位 ADC 时是-512),大于 VREF 的差分电压将得到


最大值(在 10 位 ADC 时是 511)。

注意某些型号的器件不能测量负的差分电压,如 ATiny26。

2.3 校正
ADC 实际的总误差不只是量化误差,这篇文档说明了偏置和增益误差,以及如何进行补偿。
同时介绍了两种测量非线性度的方法,微分法和积分法。

对于大多数应用,在使用单端模式时 ADC 无需校正。典型精度是 1-2LSB,既不需要也难以


通过校正获得更高的精度。

但是,使用差分模式时情况就不同了,特别在高增益时,微小的变化通过放大器就变成了
很大的误差,未补偿的误差通常大于 20LSB。这些误差需要用软件针对每个器件进行补偿。

初看起来 20LSB 是一个很大的参数,但是这并不代表差分模式就没有用处了,经过简单的


校正算法,误差就可以控制在 1-2LSB 之内。

第 3 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

2.4 绝对误差
绝对误差是理想直线和实际曲线,包括量化误差的最大差值。因为量化误差,最小绝对误
差是 ½LSB。

绝对误差或者叫绝对精度是未补偿误差的总和,包括了量化误差、偏置误差、增益误差和非
线性误差。偏置、增益和非线性在后面说明。

绝对误差可以通过使用斜坡输入电压测量,在这种情况下所有的输出参数都和输入电压做
比较,最大差值给出了绝对误差。

注意绝对误差不能直接补偿,除非使用占用很大内存的查表或多项式逼近。但是绝对误差
最重要的贡献是可以补偿偏置和增益误差。
绝对误差会缩小 ADC 的范围,需要考虑最大和最小输入范围,避免被绝对误差截短。

2.5 偏置误差
偏置误差定义为在 0 输入时,实际 ADC 转换函数和理想直线的差。

当输入参数是 ½LSB 时输出没有产生从 0 变到 1,我们就称之为偏置误差。对于正偏置,当


输入从下往上逼近 ½LSB 时输出值大于 0;对于负偏置第一次输出变化时输入大于 ½LSB。换
句话说,如果实际的转换结果低于理想直线,就是负偏置。偏置示意图如图 4。

图 4. 正偏置(A)和负偏置(B)

因为单端转换只产生正数结果,所以单端和差分的偏置测量过程是不同的。

第 4 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

2.5.1 偏置误差 – 单端通道


为了测量偏置误差,从 GND 开始增加输入电压直到输出产生第一个转换结果变化。计算输入
电压差,这个差值转换到 LSB,就等于偏置误差。

在图 5A,第一次转变发生在 1LSB。转变从 2 到 3,等效输入电压是 2½LSB。差值是+1½LSB,


这就是偏置误差,双箭头指示出差值。在图 5B 中显示了同样的过程,第一次转变发生在
2LSB,从 0 到 1 时,等效输入电压为 ½LSB,偏置误差也就是差值为-1½LSB。

第 5 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

图 5. 单端模式下的正偏置(A)和负偏置(B)误差

测量过程如图 6。

图 6. 单端偏置误差测量过程

偏 置 测 量

保 存 输 入 电 压 为
设 置 输 入 为 0 实 际 电 压

保 存 当 前 输 出 到 A 计 算 输 出 从 A变 到
B需 要 的 理 论 电 压

增 加 输 入 直 到 输
出 产 生 变 化 偏 置 误 差 等 于
( 理 论 -实 际 )
换 算 为 LSB
保 存 当 前 输 出 到 B
结 束

为了补偿单端模式下的偏置误差,可以从每个测量结果中减去偏置误差。注意到偏置误差
会影响 ADC 的范围,一个大的正偏置误差使输出值在输入达到最大值前就已经饱和,而大
的负偏置误差使输出值变为 0 在输入变为最小值前。

2.5.2 偏置误差 – 差分通道


使用差分通道,测量偏置误差变得更容易,因为不需要外部输入电压。两个差分输入端可
以连接到同一内部电压上,输出就是偏置误差。因为这种方法无法确定何时发生第一次转
换,所以给出误差是 ½LSB 到 1LSB(最差情况)。

第 6 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

为了补偿差分模式下的偏置误差,同样是从每次测量结果中减去偏置误差。

2.6 增益误差
增益误差的定义是在补偿了偏置误差后,最后输出中点和理想直线的偏离。在补偿了偏置
误差后,输入电压是 0 时输出结果通常也是 0,但是增益误差将导致实际的转换函数斜率
偏离理想直线的斜率。这个增益误差可以通过将输出值比例化来测量和补偿。

实时补偿通常使用整数算法,因为浮点数计算起来要花费较长的时间。为了获得最高的精
度,斜率偏离的测量要尽量远离 0 点。参数越大,精度越高。这将在后面详细论述。

图 7 显示了一个 3 位 ADC 的增益误差,下面的说明同时包括了单端模式和差分模式。

图 7. 正(A)和负(B)增益误差例子

为了测量增益误差,输入从 0 开始直到达到最后的输出。增益补偿的比例系数等于理想输出
值和最后输出值中点除以实际步数。

如图 7A,输出值在达到最大之前就已经饱和,垂直箭头显示了最后输出的中点。在这个电
压下理想输出值是 5.5,比例系数等于 5.5 除以 7。在图 7B,输入电压达到最大时输出值只
有 6,这对于实际值是负偏差。在这个情况下理想的输出值是 7.5,比例系数等于 7.5 除以
6。测量过程如图 8。

第 7 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

增 益 测 量
用 实 际 最 大 输 出 值
作 为 分 母 A
设 置 输 入 到 0

增 加 输 入 直 到 达 到 用 理 论 值 作 分 子 B
最 大 输 出

补 偿 系 数 = B/A
找 出 基 于 前 级 长 度
的 最 后 级 中 点
结 束

2.7 非线性
当补偿了偏置误差和增益误差后,实际的转换函数应当等于理论 ADC 的转换函数。但是由于
存在着非线性,时间的曲线和理论曲线还是有微小的差别。有两个办法可以用来测量非线
性,它们将在后面说明,图 9 显示了两种测量方法。

图 9. 非线性曲线例子

2.7.1 差分非线性
差分非线性(DNL)定义为在实际台阶宽度和理论宽度(1LSB)之间最大和最小差异。

非线性产生变化宽度的量化台阶:所有台阶应当都是 1LSB 宽,但是有的宽有的窄。

为了测量 DNL,输入一个斜坡电压并记录下所有的转换值。步长由转换间的距离而定,来自
1LSB 的最大正偏离和负偏离用来报告最大和最小的 DNL。

第 8 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

2.7.2 整体非线性
整体非线性(INL)定义为实际曲线和理论曲线之间最大垂直差。

INL 可以被解释为所有 DNL 的总和。例如,一些连续的负 DNL 使得实际曲线高于理论曲线,


如图 9A。负的 INL 说明实际曲线低于理论曲线。

最大和最小 INL 使用同样的斜坡输入电压测量,记录下每个台阶中点的偏离,其中最大的


正偏离和负偏离就是最大和最小的 INL。

2.7.3 测量和补偿
在补偿了偏置误差和增益误差之后再测量 DNL 和 INL 误差很重要。否则,偏置误差和增益误
差会影响测量结果,就不能得到真实的 DNL 和 INL。

非线性误差不能通过简单的计算来补偿,可以用多项式逼近或查表法补偿。不过 AVR 的 10
位 ADC 的 DNL 和 INL 的典型值是 ½LSB,足以满足一般的实际应用了。

2.8 温度、频率和电压影响
使用 ADC 的内部电压参考源时,必须考虑它的精度。内部电压参考源和能隙电压成正比,它
的特性在数据手册中说明了。特性显示能隙电压轻微的受到供电电压和温度影响。

ADC 的精度也受到 ADC 时钟的影响。推荐最大的 ADC 时钟频率受内部 DAC 转换电路的限制,


为了优化性能,ADC 时钟不要超过 200KHz。但是即使频率达到 1MHz 也不会显著降低 ADC 的
分辨率的。

不要用高于 1MHz 的频率来操作 ADC。

2.9 带宽和输入阻抗
使用单端模式时,ADC 的带宽受 ADC 的时钟速度限制。因为 1 次转换需要 13 个 ADC 时钟周期,
所以最大时钟 1MHz 的 ADC 时钟意味着大约每秒 77K 的采样速度。按照 Nyquist 采样定律单
端模式的带宽是 38.5KHz。

使用差分模式时,因为差分放大器带宽被限制在 4KHz。大于 4KHz 的信号需要通过外部的滤


波器过滤掉,避免非线性。

对于 Vcc 和 GND 的输入阻抗典型是 100MΩ。与之对应的是信号源输出阻抗,它会产生一个


分压。信号源的输出阻抗要足够低才能获得正确的转换结果。

第 9 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

3 执行
图 10 显示了一个 ADC 校正的例子。

在产品测试中,每个设备的 ADC 都要使用一个类似的测试装置。AVR 使用高精度 DAC(如 16


位分辨率)产生校正需要的输入电压。校正完成后,偏置和增益补偿参数编程到 EEPROM 中。

第 10 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

注意这里需要编程 EESAVE 熔丝,这样在编程 Flash 存储器是不会擦除 EEPROM 内容的。否则


就需要暂存 ADC 参数。

3.1 偏置和增益误差补偿的定点算法
浮点数运算对于 ADC 的比例化计算缺乏效率。增益补偿的比例系数一般接近 1,需要一个比
较合适的精度进行 ADC 参数补偿,这可以使用通过整数进行计算的定点数。

因为增益补偿系数肯定不会超过 2,如果乘以 214 也不会超过一个有符号的 16 位字。换句话


说,比例系数可以用两字节 1:14 的有符号定点数表示。偏置误差和增益误差补偿的公式如
公式 1。

公式 1.
实际参数 = (ADC 参数 – 偏置)* 增益系数
计算结果取整后,结果是小于或等于计算结果的最大整数。为了保证结果是最接近的整数
在取整前需要加上 0.5(译者注:即四舍五入)。加上 0.5,乘以比例 214 并减去偏置就得
到了公式 2。

公式 2.
214 * 实际参数 = 214 * ADC 参数 * 增益系数 + 214 * 0.5 - 214 * 偏置 * 增益系数

因为增益系数和偏置修正是常数,可以进一步进行优化。如果等式两边乘以 22,得到 216,


高 2 字节等于取整后的结果,这样不用右移 16 位。

我们引入一些常数,并在公式 3 中总结。
公式 3.
系数 = 214 * 增益系数
修正 = 214 * (0.5 – 偏置 * 增益系数)
216 * 实际结果 = 22 * (ADC 参数 * 系数 + 修正)

使用这个方法,校正软件计算常数系数和修正,并存储它们到 EEPROM 中。运行中,只需要


对 ADC 参数进行一次乘法,一次加法和左移两位。使用 IAR C 编译器以及最高速度优化,只
需要 42 个 CPU 周期。

3.1.1 校准
测试工装设计超出了这篇笔记的范围。下面只给出了 AVR 校准流程图,它使用了外部 DAC。
无需使用多个 ADC 通道,只使用一个开关切换单端和差分模式。ADC 参数认为和使用的通道
是一致的,多路复用不会引入误差。

软件执行过程如图 11。

图 11. 软件校正流程

第 11 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

校 正

等 待 校 正 信 号

使 用 外 部 DAC测 量 偏 置
误 差

使 用 外 部 DAC和 偏 置 误
差 补 偿 测 量 增 益 误 差

存 储 参 数 到 EEPROM

发 出 校 正 结 束 信 号

结 束

这一段程序应当先编程到 AVR 单片机中以进行校正,以后在用最终的程序替换。再次说明要


编程 EESAVE 熔丝,这样在编程 Flash 时可以防止将 EEPROM 的数据也擦除了。

3.1.2 补偿
运行时补偿的代码可以做为一个小函数,每次 ADC 测量后都通过这个函数校正,使用公式
3 中的系数和修正参数。
图 12. 配置和增益补偿的流程图

增 益 和 配 置 补 偿

获 取 ADC原 始 值

乘 以 系 数

加 上 修 正

左 移 两 位

È¡ ¸ß Á½ ¸ö ×Ö ½Ú

结 束

计算过程可以用下面的 C 函数,也可以用宏的方式表示:
signed int adc_compensate(signed int adcvalue,
signed int factor,
signed long correction)

第 12 页 共 13 页
AVR120: AVR 的 ADC 校正和说明 翻译 : 邵子

{
return (((((signed long)adcvalue*factor)+correction)<<2)>>16);
}
存放在 EEPROM 中的参数可以在程序启动时复制到 SRAM 中,这样可以在程序中快速访问。

4 参考
 Robert Gordon – A Calculated Look at Fixed-Point Arithmetic
http://www.embedded.com/98/9804fe2.htm
 Application Note AVR210 – Using the AVR Hardware Multiplier
http://www.atemel.com/dyn/resources/prod_documents/DOC1632.PDF

(全文完)

第 13 页 共 13 页

You might also like