AD转换芯片精度计算及校正方法


前言

本文对模数转换芯片的精度进行简要介绍,帮助大家正确选型,并介绍了一个基本的ADC转换结果校正方法。专业术语在不同厂家的芯片使用手册中可能不相同,若要详细了解还需要阅读产品手册~


一、转换精度

【重要参数】
FS:满量程值。
LSB:最低有效位,即ADC输出的二进制码最低位0…(n个0)1代表的电压值大小。

假设ADC的输出位数为n位,那么 L S B = [ + F S − ( − F S ) ] 2 n LSB={[+FS-(-FS)]\over2^{n}} LSB=2n[+FS(FS)]

【量化误差】
ADC输出的值是按LSB变化的,当输入电压值介于1LSB之间时,输出值会按一定规则入位或舍弃,这个过程产生的误差是量化误差,无法消除。

量化误差最大是1LSB,因此在对ADC芯片进行选型时,首先考虑芯片的输出位数,这决定了其LSB值。在满量程值不变的情况下,输出位数越高,LSB值越小,精度也就越高。

若计算得到的LSB满足设计对ADC误差的要求,那么才对芯片进行其他性能的考量。

下图是某16位输出ADC芯片的理想传递函数曲线,该芯片可以测量负输入,输出为二进制补码,且输出码的转换在LSB的中间位置(1/2LSB或3/2LSB处)。由于输出是补码形式,因此当最高位为1时表示输入为负电压,最高位是0时表示输入为正电压。
在这里插入图片描述

例如,输出100…000时,对应输入是 − F S − 1 2 L S B ∼ F S + 1 2 L S B -FS-{1\over2}LSB \thicksim FS+{1\over2}LSB FS21LSBFS+21LSB
输出为000…000时,对应输入是 0 − 1 2 L S B ∼ 0 + 1 2 L S B 0-{1\over2}LSB \thicksim 0+{1\over2}LSB 021LSB0+21LSB

经推导,输入正电压时,将输出码直接转换为十进制,与LSB相乘得到对应的电压值;输入负电压时,将输出码按位取反后转换为十进制,再取该十进制的相反数,与LSB相乘后即为对应的电压值。

二、重要参数

1.线性误差(INL)和差分线性误差(DNL)

线性误差又称积分非线性,指实际测量中每一个独立编码与一条从“0”端到“满量程”端直线之间的偏移值。其中“0”端指在第一次码变化的前1/2LSB处,“满量程”端指在最后一次码跳变的后1/2LSB处。每一个码的偏移值是从码的中间位置计算的。如下图所示:

Alt
理想状态中,输出码值与其中间位置对应的输入值满足线性关系,且为 V o u t = V i n Vout=Vin Vout=Vin(斜率为1,偏置为0)

但在实际使用中,二者的关系并非严格线性,存在线性误差,每一个码的误差不一样。

  • 若该误差的最大值在 ± 1 2 L S B ±{1\over2}LSB ±21LSB 以内,当输入模拟电压值正好是码的中间位置值时,能正确译出码值;当输入电压相对中间位置值有偏差时,可能会译为相邻码值。
  • 若该误差的最大值在±1LSB内,则译码结果为正确码值或者是相邻码值。

因此,在芯片选型时,尽量选择INL在全量程范围内的绝对值小于1/2LSB的型号,输入输出的关系更接近于线性,精度会更高。
下图为某ADC芯片的INL性能曲线,能看出每一个码的偏移值并不相同。
在这里插入图片描述
还有一个对应参数,是差分线性误差,又称差分非线性(DNL),其含义是任意两个相邻码之间所测得变化值与理想的 1 L S B 1LSB 1LSB 值之间的差异。设置该参数的目的是为了保证在输入电压增加的过程中,输出码能够没有遗漏地递增出现。

2.失调误差和增益误差

实际使用时,我们一般假设输入与输出之间满足线性关系,但是线性的斜率与偏置值并不理想(理想中斜率为1,偏置为0),这就是在校正时需要计算的值。

其中偏置值由失调误差决定,斜率由增益误差(Gain Error)决定。

【失调误差】 指码跳变时的实际电压值与理想电压值之差,是将整个传递函数偏移了相同的值,对应线性函数中的偏置,可以通过从ADC输出中减去该值来校准。

消除失调误差后,可以保证实际输出码的第一次跃迁与理想的转换一致,但不能保证其他跃迁也和理想情况在相同输入值下发生。这就引出了增益误差的概念。

【增益误差】 指消除失调误差后,理想增益点与实际增益点之差(增益点是最后一次码跳变后的1/2LSB点),对术语的解释在不同厂家的手册中可能不一样,但是本质相同。增益误差的概念如下图所示:
在这里插入图片描述
由图可知,增益误差带来的是斜率的改变。

还有一个相似的参数是满量程误差(Full Scale Calibration Error),该误差是在未进行失调误差校正的情况下,最后一次码跃迁时的实际输入与理想输入之间的差值。

三、转换校正

在使用ADC芯片时,为了修正增益误差和失调误差,提高转换精度,一般会使用硬件或软件校正。校准过程根据实际测得的输入与输出值进行计算,不依靠器件手册中提供的误差参考值。

例如,在下图中,输入电压量程为 − 10 V ∼ 10 V -10V \thicksim 10V 10V10V
实线是理论转换结果,表达式为 V o u t = V i n Vout=Vin Vout=Vin
虚线为实际转换结果,偏置是 y 0 y0 y0,斜率为 k k k,即 V o u t = k × V i n + y 0 Vout=k \times Vin+y0 Vout=k×Vin+y0,那么对Vout的修正结果即为 V c o r r e c t e d = ( V o u t − y 0 ) k Vcorrected={(Vout-y0) \over k} Vcorrected=k(Vouty0),可以在软件中利用公式完成此修正。

其中, y 0 y0 y0的值是在输入电压0V时,实际输出与输入间的偏差;

计算 k k k值时,选择量程内的两个不同输入电压 V i n 1 Vin1 Vin1 V i n 2 Vin2 Vin2,测量其对应的实际输出 y 1 y1 y1 y 2 y2 y2,则
k = ( y 2 − y 1 ) ( V i n 2 − V i n 1 ) k={(y2-y1) \over ( Vin2-Vin1)} k=(Vin2Vin1)(y2y1)

在这里插入图片描述
根据上述方法,即可完成对ADC输出值的校正。


总结

在使用ADC时,除了前期选型注意精度要求外,在实际调试时一定要根据实际转换值与输入值做校正,校正后的转换结果误差会很小。

参考链接:
ADC失调误差和增益误差

  • 10
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: C语言是一种常用的编程语言,可以用来实现8051与AD芯片进行AD转换。 在C语言中,我们可以使用8051的特殊功能寄存器和中断来控制AD芯片进行AD转换。下面是一个简单的示例代码: ```c #include <reg52.h> sbit AD_CS = P1^0; // AD芯片的片选引脚 sbit AD_RD = P1^1; // AD芯片的读取引脚 sbit AD_BUSY = P1^2; // AD芯片的忙碌状态引脚 unsigned int ADCResult = 0; // 存储AD转换结果 void AD_Convert() { AD_CS = 0; // 选中AD芯片 AD_RD = 0; // 开始读取 while (AD_BUSY); // 等待AD芯片准备好 ADCResult = P2; // 将P2口的值(即AD转换结果)存储到ADCResult AD_RD = 1; // 停止读取 AD_CS = 1; // 取消选中AD芯片 } void main() { while (1) { AD_Convert(); // 调用AD转换函数 // 在这里可以对ADCResult进行处理或者发送到其他设备 } } ``` 以上代码中,我们使用P1口的引脚来控制AD芯片的片选、读取和忙碌状态引脚,使用P2口接收AD转换的结果。在`AD_Convert`函数中,首先选中AD芯片,然后开始读取,等待AD芯片准备好,将AD转换的结果存储到`ADCResult`变量中,并停止读取,最后取消选中AD芯片。在`main`函数中,我们可以循环调用`AD_Convert`函数来不断进行AD转换。 需要注意的是,由于8051是一种8位的单片机,所以AD芯片转换的结果也是8位的,但如果要进行更高精度AD转换,我们可以使用外部模数转换器以获得更多的精度。 ### 回答2: 要实现8051单片机与AD芯片进行AD转换,可以按照以下步骤进行: 1. 首先,通过引脚连接将AD芯片与8051单片机连接。通常,AD芯片的输入引脚(AIN)需要连接到要进行AD转换的外部电路上。 2. 然后,根据AD芯片的规格书,配置8051单片机的相应引脚作为ADC输入引脚。一般来说,这些引脚可以通过8051单片机的控制寄存器(例如P1寄存器)进行配置。 3. 接下来,在C语言程序中,需要配置ADC转换的参数和设置。这可以通过设置ADC控制寄存器来完成。例如,可以设置参考电压、通道选择、分辨率等。 4. 在代码中,还需要编写AD转换的相关函数或子程序。这些函数通常包括启动AD转换、等待转换结束、读取转换结果等步骤。 5. 在程序的主循环(或其他适当的位置),调用AD转换函数来执行AD转换操作。这样,就可以将外部电路的模拟信号转换为数字信号,并将结果存储在指定的变量中。 需要注意的是,具体的实现方法和步骤可能会根据使用的AD芯片型号和8051单片机型号而有所不同。因此,在实际操作中,应仔细参考芯片的规格书和相关资料,以确保正确配置和操作AD转换。 ### 回答3: 要在C语言中实现8051与AD芯片进行AD转换,首先需要了解8051芯片的工作原理和AD芯片的使用方法。 8051芯片是一种经典的8位单片机,具有强大的计算和控制功能。它通过与外部设备的IO口进行数据传输和控制,实现了与AD芯片的连接。 AD芯片是一种模数转换器,能将模拟信号转换为数字信号,供处理器读取和处理。典型的AD芯片包括MCP3008、ADS1115等。这些芯片通过SPI通信协议与单片机进行数据交互。 在C语言中实现8051与AD芯片AD转换,需要以下步骤: 1. 配置8051芯片的SPI接口参数,包括通信速率、数据位数、时钟极性等。SPI通信是一种全双工的同步通信方式,需要根据AD芯片的要求进行配置。 2. 初始化AD芯片,将其置于工作状态。这通常包括向AD芯片发送一些特定的控制命令,配置其工作模式、参考电压等参数。 3. 在AD转换前,先发送读取通道的命令给AD芯片,以选择要采集的模拟信号。AD芯片通常支持多个输入通道,需要根据需求进行选择。 4. 发送启动转换命令,开始进行AD转换AD芯片会将模拟信号转换为数字信号,并将其存储在自己的缓冲区中。 5. 读取AD芯片转换结果。通过SPI接口,读取AD芯片的缓冲区中的数字信号,并保存到8051芯片的寄存器或变量中。 6. 根据需要,对转换的数字信号进行进一步处理。可以进行滤波、放大或者校准等操作,以得到准确的测量结果。 以上是使用C语言实现8051与AD芯片进行AD转换的基本步骤。具体的代码实现需要根据所用的8051芯片型号和AD芯片型号进行具体调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值