
[导读] 相信ADC的应用或多或少都会用到,在很多场合都有分辨率要求,要实现较高分辨率时,第一时间会想到采用一个较高位数的外置ADC去实现。可是高分辨率外置ADC往往价格都不便宜,这就带来一对矛盾:高指标与低成本。其实利用单片机片上的ADC利用过采样技术就能很好的解决这样一对矛盾体,本文来聊聊这个话题。 在很多项目应用中,需要测量信号的动态范围较大,且需要参数的微小变化。例如,ADC需要测量很大的温度范围(比如工业中甚至要求从-200℃~500℃),但仍要求系统对小于1度的变化做出响应。常见的单片机片上ADC位数为12位,如要实现高于12位分辨率要怎么做呢?我们知道奈奎斯特-香农采样定理可知:3 E( D6 R( ?4 D3 K; R ![]() 其中:
![]() 或许你会问,常规的应用都是过采样,怎么也没见分辨率提高了呀?如果仅仅过采样,要实现更高分辨率显然是不够的,那么要怎么利用过采样实现更高的分辨率呢?要知道所采用的ADC硬件核分辨率是固定的,难道还会变不成?. a2 Q, Q; M, p+ w. n7 l e! c- _9 ]7 p# R3 g 过采样提高分辨率 如果对一模拟信号,采用过采样,然后再进行一定的软件后处理,理论上是可以得到更高分辨率的: ![]() 为增加有效位数(ENOB :effective number of bits),对信号进行过采样,所需的过采样率可以由下面公式确定(省略理论推导,过于枯燥):, x7 {% c6 ?1 r5 n9 e2 y" ? ![]() 其中:
![]() 因此,如果我们以f对信号进行过采样,然后在所需的采样周期内收集足够的样本以对它们进行平均,现在可以将16位输出数据用于16位测量。具体怎么做呢?
![]() 1 Z6 j, p* u( K! S SNR理论情况下极限值的计算方式是数据转换的有效位数,如下所示:7 z$ b' |' D5 h- M& N- i ![]() 这个公式没必要去记,用到的时候参考计算一下即可。从公式中可看出,要提升一个模数转换器的理论SNR的一种可行方案可以通过提升采样位数,但是需要注意的是这里的信噪比是度量模数转换器本身的,就一个真实系统的信噪比还与整个信号链相关!从上式中不难算出,12位ADC的理论SNR极限值为74dB,而通过过采样提升4位分辨率后,其SNR理论极限提高至96 dB! 到底怎么实现呢? 这里以伪代码的方式给出编程思路: void init_adc(void) ?: k# ?8 h& M# l* Y0 n- a" o {5 X" J8 Y# u' m /*配置ADC的采样率为过采样率连续中断模式*/ } void start_adc(void)- n: s, w' c. u( Q4 U1 ~ {% `2 c" A4 q2 U6 i /*控制ADC启动采样*/! y. \: }" |6 L+ w, A2 p } / u" O& J: W8 n% z /*不同的开发平台中断函数写法略有差异,比如51需要指定向量 */ /*OVERSAMPLE_FACTOR=4^RSHIFT_BITS 下面两个宏一起修改 */1 c1 E/ N" s$ V1 ^1 R* E #define RSHIFT_BITS (4)! J0 b4 E* o0 `; ^, B$ f& @+ y #define OVERSAMPLE_FACTOR (256)7 E4 L) P9 u+ M) X3 \; ] S static unsigned short adc_result=0U;) `2 K! }+ G! U4 h; B1 L void adc_isr(void)% A6 d3 g" k1 s1 H {: y- Y. E) O2 p; N static unsigned short adc_index = OVERSAMPLE_FACTOR;6 N/ N9 S7 {5 k static unsigned int accumulator = 0U; " c5 N% ^7 X" Z( {6 ^- m3 c) O /*ADC_REG ADC转换结果寄存器,不同平台名称不同*/ 2 I- K) u' y8 n+ s0 V& R: T accumulator += ADC_REG; " z5 j6 T. e2 m% v1 x3 e adc_index--; if( adc_index==0 ): l+ r5 l% [; d% x6 l7 L {: t, J, Z; c# i- { /* 加和按因子抽取 */2 |$ V4 f! j8 m( T4 P adc_result = accumulator>>RSHIFT_BITS;, ^% {/ ]. @1 U' K# z accumulator = 0; adc_index = OVERSAMPLE_FACTOR; } } 该方案有一个缺陷,就是每次ADC中断都需要CPU参与,在过采样率很高的情况下,上述方案消耗很多CPU资源,那么如果单片机内存资源足够的情况下可以考虑采用DMA模式,采集很多数据并将数据暂存下来,然后再做累加平均抽取。这是空间换时间的策略的体现。这个编代码也很容易,只需要申请一片内存区,内存区的大小可以定为256的倍数,这是因为在提升4位分辨率情况下,一个16位的输出样本需要256个12位样本。+ U/ V' L7 s* u' r4 q) x; P) u , o) x: n/ ~) E9 P) v * F+ B, D1 @% K# a. Z5 l 总结一下( _4 r6 K. `3 {$ O) g6 Z 在成本受限的情况下,可以通过单片机片内ADC过采样以及累积抽取的技术来提升采样分辨率,这种技术的特点:
# ]9 g# z! N% o8 @& a4 | |