选择正确的模数转换器 (ADC) ,微控制器内部ADC
扫描二维码
随时随地手机看文章
许多微控制器都包含片上 ADC。典型器件包括 Microchip PIC167C7xx 系列和 Atmel AT90S4434。大多数微控制器 ADC 都是逐次逼近的,因为这可以在速度和微控制器芯片上的空间成本之间进行最佳权衡。
PIC16C7xx 微控制器包含一个带有模拟输入多路复用器的 8 位逐次逼近型 ADC。该系列中的微控制器有 4 到 8 个通道。内部寄存器控制选择哪个通道、开始转换等。一旦选择了一个输入,必须经过一个稳定时间以允许 S/H 电容器在 A/D 转换开始之前充电。软件必须确保发生这种延迟。
转换精度和公式
一些微控制器,例如 Microchip 系列,允许我们使用一个输入引脚作为参考电压。这通常与某种精度参考相关。转换后从 A/D 转换器读取的值为:
(V输入/V参考) x 256
一些微控制器使用电源电压作为参考。在 5V 系统中,这意味着 V ref始终为 5V。因此,使用 8 位 ADC 测量 3.2V 信号会产生以下结果:
(V in x 256)/V参考
= (3.2vx 256)/5V
= 163 10
= A3 16
但是,结果取决于 5V 电源的值。如果电源电压高 1%,则其值为 5.05V。现在 A/D 转换的值将是:
(3.2V x 256)/5.05V = 162 10 = A2 16
因此,电源电压 1% 的变化会导致转换结果改变一个计数。典型的电源可能会发生 2% 或 3% 的变化,因此电源变化会对结果产生重大影响。电源输出经常随负载、温度、交流输入变化以及从一个电源到另一个电源而变化。
这带来了一个影响所有 ADC 设计的问题:基准的准确性。典型的 ADC 基准电压可能标称 2.5V,但可以在 2.47V 和 2.53V 之间变化(这些值来自实部的数据表)。如果这是一个 10 位 ADC,在参考范围的极端转换 2V 输入会产生以下结果:
在 V ref = 2.47V 时,
结果 = (2V x 1,024)/2.47 = 829 10
在 V ref = 2.53V 时,
结果 = (2V x 1,024)/2.53 = 809 10
不同器件之间的参考电压变化会导致 20 个计数的输出变化。
显示了参考变化对 ADC 结果的影响。尽管误差百分比在整个范围内保持不变,但对于较大的 ADC 值,数值误差当然更大。
软件校准
有时我们需要一个准确的参考,比产品成本所能支持的更准确。当无法进行手动调整时,软件可以补偿参考电压变化。这通常通过提供用于校准 ADC 的已知精确输入来完成。该参考可以非常精确(并且非常昂贵),因为生产线只需要很少的参考。
在我们一直在查看的 2.47V 示例中,可能会向 ADC 输入 2V 的精确电压。当软件读取 ADC 时,它知道正确的值应该是 819;校准常数由 829/819 或 1.012 给出。同样,2.53V 参考的校准常数为 809/819,即 0.988。
这似乎意味着需要浮点数学来校正 ADC 值。如果我们使用的是能够进行浮点运算的处理器,这是一种可以接受的方法。但是,在更简单的处理器上,我们可能没有可用的执行时间或代码空间来实现浮点计算。
处理 ADC 校正的一种方法是使用查找表。这样做的缺点是需要足够的非易失性存储来维护每个可能的 ADC 值的查找值——对于 10 位 ADC 的 1,024 字表。
电压参考非常接近其标称值,否则它不会用作参考。假设我们的参考在我们的工作温度范围内足够稳定,则 ADC 误差将是我们从 ADC 读取的值的恒定百分比。由于 ADC 具有有限的分辨率,因此尝试以任何大于 1 LSB 的精度来校正 ADC 误差是没有意义的。
知道了这一点,我们就可以简化 ADC 校正过程。我们存储的不是查找表,而是一个值,该值告诉软件要从 ADC 读数中添加或减去多少(二进制)百分比以纠正错误。我们可以添加或减去 1/8、1/16 或 1/24,一直到 1 LSB 的精度。我们只需要存储一个校准常数,我们的除法过程由一系列移位和加法或移位和减法运算组成。
可以通过将 ADC 值乘以 0.988 来校正 2.47V 示例。同样的事情可以通过减去初始值的 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 来校正。
请注意,我们不需要将精确的校准电压应用于我们正在使用的输入。我们可以使用任何备用 ADC 输入,只要该 ADC 使用我们要校准的参考。
我们需要确保我们的参考在我们的预期工作温度范围内足够稳定,否则结果只会在校准期间接近温度时才会好。如果参考的温度稳定性不够好,我们将不得不获得更好的参考或将我们的工作温度范围分成多个段并为每个段使用一个校准值。当然,这意味着我们也必须有一个热敏电阻或其他测量温度的方法。
这种方法确实会导致舍入错误,这是由于我们移动结果时发生的截断而导致的。我使用 2.47V 示例制作了一个电子表格,在所有情况下,校正值都在理想值的两个计数范围内。大多数校正值完全正确或仅相差一个。这种校正程度明显优于 2V 输入的原始变化(10 个计数),并且是许多应用所需的全部。如果我们的应用程序甚至无法忍受这个错误,那么我们可能真的需要更好的参考,或者我们可能不得不求助于手动调整。
这种校准技术还可用于补偿其他系统不准确,例如电阻容差叠加。如果我们正在测量的任何内容都包含电压输入,我们可以将精密电压应用于该输入并进行一次校准,以补偿 ADC 中的参考变化和输入调节中的电阻器容差效应。
计算和使用校准值
校准值可以通过读取已知参考值然后找出要使用的校正因子(二进制因数)来计算。对于给出的示例,理想情况和最坏情况 ADC 值之间的差异永远不会超过 1.2%,因此从原始值的二分之一或四分之一开始是没有意义的。测试和使用的唯一值是 1/128、1/256 和 1/512。你想从接近你期望看到的价值开始。
使用计算器很容易找到校正因子,但如果我们必须在应用程序中使用的定点处理器上计算它,则需要一种基于整数的方法。
以流程图形式显示了本示例中用于计算和使用校准常数的算法。在此方法中,使用单个字节(或字)来存储校准常数。位 7 指示参考电压是低(需要减去校准值)还是高(添加校准值)。位 0、1 和 2 指示是否使用 1/128、1/256 和 1/512 因子。
当然,我们可以为每个可能的因素使用一个单独的字节,用第四个字节来指示参考值是高还是低。
写入校准值
无论我们使用表格还是校准常数,如何将校准值输入系统?任何校准方案的一个关键组成部分是非易失性存储的可用性。许多微控制器都有片上 EEPROM。校准通常在测试电路板时进行。在大批量生产环境中,这可能会通过某种钉床自动测试设备来完成。
我们通常希望将处理器置于某种“校准模式”,可能通过将引脚接地。可以对生产测试设备进行编程,以将非常精确的电压施加到模拟输入并将校准引脚接地。然后微控制器可以进入校准模式,读取参考值并计算补偿值或创建查找表。
在某些情况下,我们没有足够的内存将校准代码添加到微控制器。在这种情况下,我们可以让微控制器将 ADC 值返回到输出引脚(串行)或一组引脚(并行),由生产测试设备读取。然后,外部计算机可以计算校准值或表格值,并通过相同的接口将它们返回给微控制器。
如果生产设备还对微控制器进行在线编程,则校准数据可以嵌入到闪存中编程的数据中。如果被校准的参考在微控制器内部,则测试设备可能必须首先将校准程序加载到微控制器中,执行校准,然后加载实际的应用程序代码。
最后,一些非常小的微控制器根本没有足够的引脚来进行校准。在这种情况下,我们通常可以使输出引脚兼作校准引脚。我们使用外部电阻器将引脚拉高。生产设备在上电前将引脚接地以选择校准模式。
它的工作方式是微控制器上电,所有引脚都处于输入状态。它在将引脚配置为输出之前读取校准引脚。如果该引脚为高电平,则开始正常操作。如果引脚为低电平,则必须外部接地,因此单片机进入校准模式。当然,输出必须是在引脚外部接地时不会损坏任何东西的输出。
最后,如果我们正在校准基准,将精确电压施加到备用 ADC 输入,我们可以使用该输入本身将系统置于校准模式。使用一个电阻器将备用输入拉至零电平 ADC 电压(在我们一直使用的示例中为接地)。然后,当在引脚上检测到超过某个预定阈值(例如,满量程电压的三分之二)的电压时,让软件进入校准模式。
选择校准电压时,我们希望选择在参考电压处于其可能的最低值时不会使 ADC 饱和的最大值。这可确保我们在计算校准常数(或表格)时不会因为位舍入误差而失去准确性。这通常会使校准电压高于满量程值的 90%,尽管我们可能希望选择最接近的标准参考电压以简化设计。
在某些应用中,我们可以通过寻找 ADC 输入的变化来解决参考问题。我们可能会看到光学传感器发生 10% 的变化,而不是将其与固定值进行比较,或者我们可能会看到温度下降 25%。当然,传感器的精度也包括在内,但该主题超出了本文的范围。
尽管有时很难知道要为我们的应用使用哪种 ADC,但种类繁多的部件可确保我们找到适合我们需要的部件。将软件与硬件相匹配可确保我们获得产品所需的准确性和可靠性。