内容发布更新时间 : 2024/11/15 0:21:27星期一 下面是文章的全部内容请认真阅读。
如何在STM32中得到最佳的ADC精度
STM32家族中的所有芯片都内置了逐次逼近寄存器型ADC模块.内部大致框
架如下:
每次ADC转换先进行采样保持,然后分多步执行比较输出,步数等于ADC的位数,每个ADC时钟产生一个数据位。说到这里,用过STM32 ADC的人是不是想到了参考手册中关于12位ADC转换时间的公式:
ST官方就如何保障或改善ADC精度写了一篇应用笔记AN2834。该应用笔记旨在帮助用户了解ADC误差的产生以及如何提高ADC的精度。主要介绍了与ADC设计的相关内容,比如外部硬件设计参数,不同类型的ADC误差来源分析等,并提出了一些如何减小误差的设计上建议。
当我们在做STM32的ADC应用遇到转换结果不如意时,常有人提醒或建议你对采样时间或外部采样电路做调整。这里调整的最终目的就是让信号进入ADC模块的充电时间与内部采样时间匹配,保证采得的电压尽量真实,最终得到符合精度要求的转换结果。下面就聊聊相关话题。
一、模拟信号源阻抗的影响
在做ADC操作时,在信号源与ADC引脚之间,或者说在串行电阻RAIN与ADC引脚AIN之间总有电流流过,自然会产生压降。内部采样电容CADC的充电由阻容网络中的开关和RADC控制。
显然,对CADC有效的充电由【RADC +RAIN】控制,充电时间常数是tc = (RADC + RAIN) CADC。不难理解如果采样时间小于CADC通过RADC +RAIN充电的时间,即ts tc,则ADC转换得到的数值会小于实际数值。
可以看出,随着电阻(RADC+RAIN)的增加,对保持电容的充电时间也需要相应增加。对
于STM32而言,RADC是内部的采样开关电阻,阻值相对固定,具体数值在芯片的数据手册里有给出。所以,这里真正可能变动的电阻就是信号源电阻RAIN了,它的变化影响充电常数,进而影响到芯片内部采样时间的选择。
注:tc是电容CADC充电完全的时间,此时Vc = VAIN(最大1/2LSB 误差) Vc:采样电容CADC上的电压
tc = (RADC + RAIN) CADC 【CADC的值也是相对固定的】
二、信号源的容抗与PCB分布电容的对ADC的影响做ADC时,除了考虑信号源端的电阻外,还需要考虑信号源本身容抗和在模拟输入端的分布电容(参见下图)。信号源的电阻和电容构成一个阻容网络,如果外部的电容(CAIN +Cp)没能完全充电至输入信号电压,ADC转换的结果显然是不准确的。(CAIN + Cp)的值越大,信号源的频率也就越受限制。(信号源上的外部电容和分布电容分别用CAIN和Cp表示。)
当外部电路的电容没有被模拟信号源完全充电的情况下,模拟输入信号电压与模拟输入脚的电压VAIN就不相同。如果模拟输入信号产生变化,它的变化频率(FAIN)的周期至少应该满足10RC原理,即10 RAIN (CAIN +Cp)。 TAIN = 模拟信号的周期 =1/FAIN 因为:TAIN 10 x RAIN x (CAIN + CP) 因此:FAIN 1 / [10 x RAIN x (CAIN+ CP)] 假如:RAIN = 25k,CAIN = 7pF,CP = 3pF,则: FAINmax = 1 / [10 x 25x103 x (7 +3)x10-12] 即信号源的最高频率FAIN(max)= 400kHz。
对于上述给出的信号源特性(容抗与阻抗),它的频率不能超过400kHz,否则ADC的转换结果将是不准确的。
三、模拟信号源的阻抗估算上面聊了信号源阻抗和AD输入端的电容对ADC的影响,在
这个基础上来看下最大允许信号源阻抗的估算。假定最大允许的误差是1/2 LSB。 参照上面的图9中的描述,假定此时输入端不存在输入信号充电不充分的情况。
这样得到误差 = VAIN Vc 【Vc为内部采样电容CADC上的电压】
这里tS是采样时间。
tS = TS / fADC,其中TS是以ADC时钟周期为单位的采样时钟个数 。