AD校正
我们知道 2812 的 AD 是具有 12 位的精度的,也就是说误差应该至少可以达到 0.1%,但是我们在实际的使用过程中发现,ADC的转换结果和实际的值相比,误差比较大,最大可达到 9%左右,这样的数据显然是不能拿来直接使用的,如果直接将这样的转换结果用于控制回路,必然会降低控制精度。有朋友可能会问,这么差的精度那 2812 内部的 AD 不就是没用了吗?呵呵,请不要心急,事实上我们通过对 AD 误差产生的原因进行详细的分析,从硬件和软件两个方面着手,可以制定正确的校正方案,可以有效的提高 AD转换的精度,实现将误差控制在0.1%左右。
硬件上我们采用一些精准电源,目的是使采样到的电压值之类的模拟量使之非常的精确(意思是你输入多少就有多少,失真少),软件软件上,我们采用滤波法,对输入的模拟量进行多次的滤波,取平均值,以减少增益误差。这两方面做好了,自然ADC转换的精度也会大大的提高了。
基本上每个厂家的 demo 程序都有 AD 采样,那是最基本的,最简单的,我们可以在实验板上做这样的实验,给 AD引脚一个1.5V左右的直流信号进行采集,一般的干电池就可以,我们可
以通过watch window来观察采样结果,会发现采样值和理论结果差的比较多。当然经常看到有朋友会问,我的 AD 有些通道采样数据怎么会很不稳定,杂乱无章,这可能是您的这些AD输入引脚悬空的缘故,AD引脚悬空就处于高阻态,是一个不确定的状态,所以结果寄存器里保存的会是一些随机值。
好了,言归正传,2812的 ADC 转换精度较差的主要原因是存在增益误差和偏移误差,要提高转换精度就必须对这两种误差进行补偿。
首先我们介绍一下什么偏移误差?什么是增益误差?增益误差是指从负满量程转为正满量程输入时实际斜率与理想斜率之差。偏移误差是指对AD转换器采用零伏差动输入时实际值与理想值之间的差异。增益和偏移增益误差通常是AD转换器中主要的误差源。为了减小增益误差和偏移误差,可采取检测其值,然后对其进行修正的方法。系统误差(增益和偏移误差)。
我们下面从原理开始进行分析,AD转换曲线如图13所示:
图 13 AD 转换曲线
其中,这里 增益和偏移误差的定义
    一个理想的12位ADC模块是没有增益和偏移误差的满足公式1.
  公式1:
                    Y1=X*mi
  式中,x---模拟量输入值
        Y------输出值;
        mi-----理想增益
F2812的ADC模块的增益和偏移误差定义如公式2所示:
公式2:
Y2=x*ma+b
其中,ma---------实际增益;
    b------------实际的偏移量(当输入为0时测量的输出值)。
从图上我们可以看到,理想的 12 位 ADC 转换应该是没有增益误差和偏移误差的,因此模拟量输入 X和数字量输出Y之间的关系应该是:
                                                                  (2) 
这根理想的转换曲线上有一个点式固定的也是明确的,就是(3.0,4095),因此我们可以得到理想增益:
                                                            (3)
但是,实际上 2812 的 AD 转换是存在增益误差和偏移误差的,如图 13 所示,假设实际增益为 ma,实际偏移量为b,则模拟量输入与数字量输出Y之间的关系为:
                                                                (4) 
在这个式子里,很明显,ma 和 b 是个未知量。假如我们知道了 ma 和 b,那么通过采样结果显示的数据 Y, 我们就能够知道实际输入的电压X。也就是说关键是如何来求出ma和 b。我们在初中的时候就学过,对于二元一次方程,如果下面两条方程组成了二元一次方程组的话,其中(X1,Y1)和(X2,Y2)已知的话,ma和 b 就可以得到了。
                              (5)
我们可以通过两路精准电源,提供给 ADC 的任意两个输入通道,例如 ADCINA7 和 ADCINB7,精准电源的输入电压是很容易确定的,也就是X1和 X2,我们可以通过读取ADCINA7和 ADCINB7 的转换结果来获得Y1和Y2,这样,我们根据式5,就可以得到转换过程中的实际增益ma和实际的偏移量 b了,如式6 所示:
                                          (6)
这样,只要知道数字量转换结果Y,我们就可以得到实际的输入量X 了。
                                                          (7) 
此方法需要我们在设计硬件 AD 采样电路时设计两路精准电源,其原理就是将这两路精准电源提供给AD 的任意两个通道,通过采集已知的信号来求出 2812 的 AD 采样过程中本身存在的增益系数和偏移量,再利用这两个系数去校正其他AD采样通道。试验表明,经过校正后的AD采样精度基本可以到达千分之一,这对于在实际应用中足够了。
硬件校准时芯片的选择和基本思路如下:先选择一电压基准,一般实际考虑成本我们选择的时候TL431,如下图所示:
,如果Vout =3V  Vin =5V,那么可以根据R1 和R2 的比值计算出电阻值(电阻一般取K级的)。
电压基准已经出来,如果我们要用两路已知的基准信号其校正其他14路 AD采样,我们一般是将这个3V 信号经过运放生成两路子电压,进行采样。假设我们需要进入 AD 采样的两路电压分别是 0.5V 和 2.5V那么我们先要在一路基准的情况下,生成两路,这是我们可以选择运放,TL084,LM324 这些是首选,一路子信号生成电路如下:
模块电源是什么意思
已知输入是3V 信号,输出分别是0.5V和2.5V,根据最基本的模拟电路知识,就能求出相对
应的各个电阻的值。我们在这里用ADINA7和 ADINB7 两采样端口进行校准。校正程序如下所示:
AD校正算法
t1=0;                               
//每次采样校准之后将t1清零,确保每次转换的正确性
 
RefHighActualCount=0;                 
//将实际采样2.5V 寄存器清零
 
RefLowActualCount=0;                 
//将实际采样0.5V 寄存器清零
RefHighActualCount=AdcRegs.RESULT4>>4;
//2.5V实际采样值放寄存器4中
 
RefLowActualCount=AdcRegs.RESULT3>>4;
  //0.5V实际采样值放寄存器3中
 
  if(SampleCount>SAMPLES)
  {SampleCount=SAMPLES;}
Avg_RefHighActualCount=(Avg_RefHighActualCount*SampleCount+RefHighActualCount)/(SampleCount+1);
  //2.5V采样软件滤波 取平均值
 
Avg_RefLowActualCount=(Avg_RefLowActualCount*SampleCount+RefLowActualCount)/(SampleCount+1);
  //0.5V采样软件滤波
t2=2730.0;   
//t2=RefHighActualCount-RefLowActualCount=3413-683=2730.0
//实际2.5 与0.5V采样值放寄存器后的差值 3413=2.5V*mi    683=0.5V*mi
 
t1= Avg_RefHighActualCount -  Avg_RefLowActualCount;               
 
CalGain= t2/t1;
//增益误差系数
                                               
CalOffset=RefLowActualCount/CalGain-REF_LOW_IDEAL_COUNT;   
//失调误差系数
//滤波次数
  SampleCount++;
通过计算出的CalGain和CalOffset,我们就能得到校正后其他通道的输入电压了。在AD软件校正方面,我们还可以加入滤波算法,这种方法一般在采样直流信号中,考虑到成本时用到,一般是把采样值取N 个点存储在数组 a[ ]  中,在作处理时比较常用的有两种方法:取N 个点的均值,或者将N个采样点的值按从小到大进行排列之后,取中间的N/2个值进行求和取平均值。
为了使得 AD 能够获得比较好的精度,在我们 PCB 布线时就需要注意,下面这段话引自于 TI 的手册,以供大家参考: “对 ADCINxx 引脚最主要的限制是不要运行在靠近数字通路的地方,这样可以避免数字信号的干扰耦合进 ADC的输入线。此外,可以采用适当的隔离技术,将ADC模块电源引脚和数字电源隔离。” AD 部分的内容我们就介绍这么多,希望对大家能够有所帮助,水平有限,时间仓促,不足之处在所难免,欢迎大家批评指正。