本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。
一、ADC误差校准引言
MCU 片内 ADC 模块的误差总包括了 5 个静态参数 (静态失调,增益误差,微分非线性误差 (DNL),积分非线性误差(INL),绝对精度误差) 和 5 个动态参数 (信噪比,信噪失真比,无杂 散动态范围,有效位,总谐波失真) 。其中, 静态失调和增益误差是可以利用微控制器 MCU 进行修正, 可以通过软件算法, 也可以通过硬件固化的方式进行补偿。本文提供一种两点法 ADC 模块误差校正并结合硬件计算的方式来完成 ADC 的误差补偿。 ADC 静态失调被定义为第一次理想编码跳变与第一次实际编码跳变之间的偏差。第一次理想编码跳变发生在 0.5 LSB 处。如果输入电压小于 0.5 LSB 时输出代码大于零,则 ADC 产生正失调误差。如果输入电压大于 0.5 LSB 时发生第一次输出编码跳变,则 ADC 产生负失调误差,参考如下
图1 ADC静态失调图
ADC增益误差被定义为补偿失调误差后理想 ADC 传输的最后一步中点与实际 ADC 的最后一步中点的偏差,参考如下图 2所示。
图2 ADC增益误差图
为理解ADC静态失调和ADC增益误差(文中将以Offset error和Gain error指代),通过下图3来进行说明。
图3 ADC模块Offset error(左图)和Gain error(右图)
如图3(左)所示,在理想的ADC转换中,数字输出为000时理想的模拟电压输入范围应为0~0.5LSB,而实际模拟输入在0~2LSB时数字输出均为000,那么此时的Offset error即为1.5LSB。如图3(右)可知,当输入模拟信号为8LSB时实际数字输出比理想输出小1LSB,即Gain error为1LSB并且是负向error。MCU的Datasheet中可以查找到如下图4 ADC误差电气参数特性,可以看到在使用内部电压参考时Gain error为±45LSB,这在精密应用场景可能会带来不小的影响。同时除了被重点关注的Gain error和offset error,ADC可能还会存在INL error(积分非线性误差)、DNL error(微分非线性误差)共同决定了实际采样转换的非线性度。
图4 ADC误差电气参数(摘自F2800137数据手册)
二、ADC模块误差校准方案
1. 传统单点法校准失调和增益误差的方案
单点ADC校准方案通常是外部提供一个固定的电压参考点(在全域输入电压范围内选取),使用一个采样通道定时对该参考点进行采样,计算出该点误差后直接同步校准到整个电压输入域。
该方案的劣势在于单点的误差无法完全反应全域的误差,单纯使用单点的误差状态推广到全域进行校准,会存在无法达到预期校准精度的可能,如下图5所示。
图 5. 单点ADC误差校准
2. 使用两点法校准失调和增益误差的方案
实际上ADC在全域输入模拟电压范围内每一个点的Offset error和Gain error是不尽相同的,并且是非线性的,但出于性价比考虑这边提出一种实现成本最优的ADC两点动态校准法,如下图6所示:
图6. 双点ADC误差校准
如上图 6 所示,两点校准法需要在全域模拟输入内选取两个点 AinA(Vref1)和 AinB(Vref2)进行曲线 拟合、校准。
具体实施过程:
1. 本案例在当 ADC 输入模拟电压大于 0.4432V 左右时执行误差校准程序(Note:在低电压 0~0.4432V 范围 ADC 转换误差较小);
2. 计算 Gain error 比(实质就是斜率之比)
3. 计算各点的 Offset error:
a) 计算 A 点的 Offset error: CalOffsetA = AoutA_idea − (AoutA_actual ∗ CalGain)
b) 计算 B 点的 Offset error: CalOffsetB = AoutB_idea − (AoutB_actual ∗ CalGain)
c) 计算两点的平均 Offset error: CalOffsetAve = (CalOffsetL + CalOffsetH)/ 2
4. 设定一个非线性的误差补偿比:
a) 计算当前点之于非线性起始点的偏移量:CalNonP = ADCOUT_actual / AoutA_idea (其中ADCOUT_actual 为当前采样输出的 AD 值,AoutA_idea为非线性补偿段的起始点,此处以 A 点代指,此值不固定、应以实际调试为准);
b) 计算补偿值:CalOffsetNonL=(CalNonP * CalOffsetAve)/x (其中 x 为常量, 手动调节的补偿放大比例);
由于 ADC 误差实际表现的非线性,为得到更为精确的补偿,本案例将校准分为两段式补偿:低区 误差补偿(AinS ~ AinA 段,如上图 6 所示)、高区误差补偿(AinA ~ AinB 段)。 将计算所得参数带入输出误差校准公式:
低区误差补偿公式:CaliAout = ADCOUT_actual ∗ CalGain + CaiOffsetA
高区误差补偿公式:CaliAout = ADCOUT_actual ∗ CalGain + CaiOffsetAve + CalOffsetNonL 注:实际应用中为提高动态特性,需在特定时间内调用一次误差补偿程序以实时更新补偿量。
图7. 两点校准实施实例
三、校准中常见的问题
如图 8 所示,C2000 产品 ADC 模块有不同静态误差特性,利用上述误差补偿的算法来实现 ADC 误差校准。针对单点方案, 无论是参考电压源或高精度电阻, 对参考器件特性要求很高。 针对两点方案, ADC 校准效果取决于参考点选择, 以及校准算法,要求实时性。然而, F28P65x 新一代 Type-4 ADC 模块硬件计算模块可以保证校准实时性, 同时减小 CPU 的带宽。
图8. 不同 C2000 产品系列 ADC 误差特性(左图-校准前;右图-校准后)
四、总结
本案例通过实验验证 ADC 两点校准的有效性,同时在 C2000 系列芯片中导入应用(包含但不限 于 F280013x/F28002x/F28003x/F28004x/F28P6x/F28P5x)。若进一步优化算法, ADC 高精度可 进一步提升,实际应用中可根据使用场景进行适配。但需注意的是确保两个输入参考点的稳定、 准确。此外,最新一代 C2000 F28P65 ADC 模块的全新特性(求和、平均、求最大/小值)在 ADC 误差校准过程中可以提供更高效的处理过程,使得 ADC 动态校准具备了实际可行的可能性。