完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
相信ADC的应用或多或少都会用到,在很多场合都有分辨率要求,要实现较高分辨率时,第一时间会想到采用一个较高位数的外置ADC去实现。可是高分辨率外置ADC往往价格都不便宜,这就带来一对矛盾:高指标与低成本。其实利用单片机片上的ADC利用过采样威廉希尔官方网站
就能很好的解决这样一对矛盾体,本文来聊聊这个话题。
|
|
相关推荐
3个回答
|
|
什么是过采样?
在信号处理中,过采样是指以明显高于奈奎斯特速率的采样频率对信号进行采样。从理论上讲,如果以奈奎斯特速率或更高的速率进行采样,则可以完美地重建带宽受限的信号。奈奎斯特频率定义为信号带宽的两倍。过采样能够提高分辨率和信噪比SNR,并且通过放宽抗混叠滤波器的性能要求,有助于避免混叠和相位失真。 在很多项目应用中,需要测量信号的动态范围较大,且需要参数的微小变化。例如,ADC需要测量很大的温度范围(比如工业中甚至要求从-200℃~500℃),但仍要求系统对小于1度的变化做出响应。常见的单片机片上ADC位数为12位,如要实现高于12位分辨率要怎么做呢?我们知道奈奎斯特-香农采样定理可知: 其中: 为输入待采样信号最高频率 为奈奎斯特频率。 如果实际采样频率高于奈奎斯特频率,即为过采样。那么低于奈奎斯特采样频率进行采样就称为欠采样,如下图: 或许你会问,常规的应用都是过采样,怎么也没见分辨率提高了呀?如果仅仅过采样,要实现更高分辨率显然是不够的,那么要怎么利用过采样实现更高的分辨率呢?要知道所采用的ADC硬件核分辨率是固定的,难道还会变不成? 过采样提高分辨率 如果对一模拟信号,采用过采样,然后再进行一定的软件后处理,理论上是可以得到更高分辨率的: 为增加有效位数(ENOB :effective number of bits),对信号进行过采样,所需的过采样率可以由下面公式确定(省略理论推导,过于枯燥): 其中: 为过采样频率 产品所需实际采样频率 W为额外所需增加的分辨率位数 |
|
|
|
具体怎么做呢?
首先将256个连续采样累加 然后将总数除以16(或将总数右移4位)。该过程通常称为抽取,也即将速率采样。 在类似进行下一次16位样本处理 注意:用于累积过采样数据并执行除法抽取数据类型必须具有足够的字节宽度,以防止溢出和截断错误。比如这里累积和可以采样32位无符号整型。 由上面公式可得出一个重要结论:每提高W位分辨率,需要提高采样率4W倍。 |
|
|
|
过采样提高ADC的信噪比
ADC测量的SNR理论极限基于量化噪声,这是基于在没有过采样和平滑滤波情况下模数转换过程中固有的量化误差所致。而量化误差取决于ADC分辨率的位数,其中N为ADC的位数, 为参考电压。 SNR理论情况下极限值的计算方式是数据转换的有效位数,如下所示: 这个公式没必要去记,用到的时候参考计算一下即可。从公式中可看出,要提升一个模数转换器的理论SNR的一种可行方案可以通过提升采样位数, 但是需要注意的是这里的信噪比是度量模数转换器本身的,就一个真实系统的信噪比还与整个信号链相关! 从上式中不难算出,12位ADC的理论SNR极限值为74dB,而通过过采样提升4位分辨率后,其SNR理论极限提高至96 dB! 到底怎么实现呢? 这里以伪代码的方式给出编程思路: voidinit_adc( void) { /*配置ADC的采样率为过采样率连续中断模式*/ } voidstart_adc( void) { /*控制ADC启动采样*/ } /*不同的开发平台中断函数写法略有差异,比如51需要指定向量 */ /*OVERSAMPLE_FACTOR=4^RSHIFT_BITS 下面两个宏一起修改 */ # defineRSHIFT_BITS (4) # defineOVERSAMPLE_FACTOR (256) staticunsignedshortadc_result= 0U; voidadc_isr( void) { staticunsignedshortadc_index = OVERSAMPLE_FACTOR; staticunsignedintaccumulator = 0U; /*ADC_REG ADC转换结果寄存器,不同平台名称不同*/ accumulator += ADC_REG; adc_index--; if( adc_index== 0) { /* 加和按因子抽取 */ adc_result = accumulator》》RSHIFT_BITS; accumulator = 0; adc_index = OVERSAMPLE_FACTOR; } } 该方案有一个缺陷,就是每次ADC中断都需要CPU参与,在过采样率很高的情况下,上述方案消耗很多CPU资源,那么如果单片机内存资源足够的情况下可以考虑采用DMA模式,采集很多数据并将数据暂存下来,然后再做累加平均抽取。这是空间换时间的策略的体现。这个编代码也很容易,只需要申请一片内存区,内存区的大小可以定为256的倍数,这是因为在提升4位分辨率情况下,一个16位的输出样本需要256个12位样本。 |
|
|
|
只有小组成员才能发言,加入小组>>
22622个成员聚集在这个小组
加入小组761 浏览 1 评论
12412 浏览 0 评论
5870 浏览 3 评论
17661 浏览 6 评论
2690 浏览 1 评论
989浏览 1评论
959浏览 1评论
3515浏览 1评论
809浏览 1评论
1339浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 15:30 , Processed in 0.760566 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号