|||
过采样技术
推荐转自http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1667154&bbs_id=9999
其实原理很简单, 很容易明白, 怎样实现提高分辨率?
假定环境条件: 10位ADC最小分辨电压1LSB 为 1mv
假定没有噪声引入的时候, ADC采样上的电压真实反映输入的电压, 那么小于1mv的话,如ADC在0.5mv是数据输出为0
我们现在用4倍过采样来, 提高1位的分辨率,
当我们引入较大幅值的白噪声: 1.2mv振幅(大于1LSB), 并在白噪声的不断变化的情况下, 多次采样, 那么我们得到的结果有
真实被测电压 白噪声叠加电压 叠加后电压 ADC输出 ADC代表电压
0.5mv 1.2mv 1.7mv 1 1mv
0.5mv 0.6mv 1.1mv 1 1mv
0.5mv -0.6mv -0.1mv 0 0mv
0.5mv -1.2mv -0.7mv 0 0mv
ADC的和为2mv, 那么平均值为: 2mv/4=0.5mv!!! 0.5mv就是我们想要得到的
这里请留意, 我们平时做滤波的时候, 也是一样的操作喔! 那么为什么没有提高分辨率?????
是因为, 我们做滑动滤波的时候, 把有用的小数部分扔掉了, 因为超出了字长啊, 那么0.5取整后就是 0 了, 结果和没有过采样的时候一样是 0 ,
而过采样的方法时候是需要保留小数部分的, 所以用4个样本的值, 但最后除的不是4, 而是2! 那么就保留了部分小数部分, 而提高了分辨率!
从另一角度来说, 变相把ADC的结果放大了2倍(0.5*2=1mv), 并用更长的字长表示新的ADC值,
这时候, 1LSB(ADC输出的位0)就不是表示1mv了, 而是表示0.5mv, 而(ADC输出的位1)才是原来表示1mv的数据位,
下面来看看一下数据的变化:
ADC值相应位 9 8 7 6 5 4 3 2 1 0
0.5mv测量值 0 0 0 0 0 0 0 0 0 0 0mv(10位ADC的分辨率1mv,小于1mv无法分辨,所以输出值为0)
叠加白噪声的4次过采样值的和 0 0 0 0 0 0 0 0 1 0 2mv
滑动平均滤波2mv/4次 0 0 0 0 0 0 0 0 0 0 0mv(平均数, 对改善分辨率没作用)
过采样插值2mv/2 0 0 0 0 0 0 0 0 0 0 1 2mv/2=0.5mv, 将这个数作为11位ADC值, 那么代表就是0.5mv
这里我们提高了1位的ADC分辨率
这样说应该就很简单明白了吧, 其实多出来的位上的数据, 是通过统计输入量的分布, 计算出来的,
而不是硬件真正分辨率出来的, 引入噪声并大于1LSB, 目的就是要使微小的输入信号叠加到ADC能识别的程度(原ADC最小分辨率).
理论来说, 如果ADC速度够快, 可以无限提高ADC的分辨率, 这是概率和统计的结果
但是ADC的采样速度限制, 过采样令到最后能被采样的信号频率越来越低,
就拿stm32的ADC来说, 12ADC, 过采样带来的提高和局限
分辨率 采样次数 每秒采样次数
12ADC 1 1M
13ADC 4 250K
14ADC 16 62.5K
15ADC 64 15.6K
16ADC 256 3.9K
17DC 1024 976
18ADC 4096 244
19ADC 16384 61
20ADC 65536 15
要记住, 这些采样次数, 还未包括我们 要做的 滑动滤波,
看到这些文档, 啰啰嗦嗦说一大堆公式什么的, 忍不住就随便写了些,
如果我是做IC的, 我一定要求把文档写到白话文一样, 小学生都能看明白的, 自然小学生都会用, 人多用了, 才有钱赚嘛,
都不知道这些芯片厂是怎么推广的, 写一大堆公式有什么用, 这么复杂的芯片都设计了, 写个文档却马马虎虎,
其实不管多复杂的公式, 实现起来还不是加减乘除, 废话少说, 有时间再写了......