作者 | 逸珺来源 | 嵌入式客栈(ID:embInn)头图 |  CSDN 下载自东方IC[导读] 相信ADC的应用或多或少都会用到,在很多场合都有分辨率要求,要实现较高分辨率时,第一时间会想到采用一个较高位数的外置ADC去实现。可是高分辨率外置ADC往往价格都不便宜,这就带来一对矛盾:高指标与低成本。其实利用单片机片上的ADC利用过采样技术就能很好的解决这样一对矛盾体,本文来聊聊这个话题。

什么是过采样?在信号处理中,过采样是指以明显高于奈奎斯特速率的采样频率对信号进行采样。从理论上讲,如果以奈奎斯特速率或更高的速率进行采样,则可以完美地重建带宽受限的信号。奈奎斯特频率定义为信号带宽的两倍。过采样能够提高分辨率和信噪比SNR,并且通过放宽抗混叠滤波器的性能要求,有助于避免混叠和相位失真。在很多项目应用中,需要测量信号的动态范围较大,且需要参数的微小变化。例如,ADC需要测量很大的温度范围(比如工业中甚至要求从-200℃~500℃),但仍要求系统对小于1度的变化做出响应。常见的单片机片上ADC位数为12位,如要实现高于12位分辨率要怎么做呢?我们知道奈奎斯特-香农采样定理可知:

其中:

  • 为输入待采样信号最高频率
  • 为奈奎斯特频率。

如果实际采样频率高于奈奎斯特频率,即为过采样。那么低于奈奎斯特采样频率进行采样就称为欠采样,如下图:

或许你会问,常规的应用都是过采样,怎么也没见分辨率提高了呀?如果仅仅过采样,要实现更高分辨率显然是不够的,那么要怎么利用过采样实现更高的分辨率呢?要知道所采用的ADC硬件核分辨率是固定的,难道还会变不成?

过采样提高分辨率

如果对一模拟信号,采用过采样,然后再进行一定的软件后处理,理论上是可以得到更高分辨率的:

为增加有效位数(ENOB :effective number of bits),对信号进行过采样,所需的过采样率可以由下面公式确定(省略理论推导,过于枯燥):

其中:

  • 为过采样频率
  • 产品所需实际采样频率
  • W为额外所需增加的分辨率位数

假设系统使用12位ADC每100 ms输出一次采样值也即(10 Hz)。为了将测量的分辨率提高到16位,我们按上述公式计算过采样频率:

因此,如果我们以f对信号进行过采样,然后在所需的采样周期内收集足够的样本以对它们进行平均,现在可以将16位输出数据用于16位测量。

具体怎么做呢?

  • 首先将256个连续采样累加
  • 然后将总数除以16(或将总数右移4位)。该过程通常称为抽取,也即将速率采样。
  • 在类似进行下一次16位样本处理

注意:用于累积过采样数据并执行除法抽取数据类型必须具有足够的字节宽度,以防止溢出和截断错误。比如这里累积和可以采样32位无符号整型。

由上面公式可得出一个重要结论:每提高W位分辨率,需要提高采样率倍。

过采样提高ADC的信噪比

ADC测量的SNR理论极限基于量化噪声,这是基于在没有过采样和平滑滤波情况下模数转换过程中固有的量化误差所致。而量化误差取决于ADC分辨率的位数,其中N为ADC的位数,为参考电压。

SNR理论情况下极限值的计算方式是数据转换的有效位数,如下所示:

这个公式没必要去记,用到的时候参考计算一下即可。从公式中可看出,要提升一个模数转换器的理论SNR的一种可行方案可以通过提升采样位数,但是需要注意的是这里的信噪比是度量模数转换器本身的,就一个真实系统的信噪比还与整个信号链相关!

从上式中不难算出,12位ADC的理论SNR极限值为74dB,而通过过采样提升4位分辨率后,其SNR理论极限提高至96 dB!

到底怎么实现呢?

这里以伪代码的方式给出编程思路:

void init_adc(void){    /*配置ADC的采样率为过采样率连续中断模式*/}void start_adc(void){   /*控制ADC启动采样*/}/*不同的开发平台中断函数写法略有差异,比如51需要指定向量   *//*OVERSAMPLE_FACTOR=4^RSHIFT_BITS 下面两个宏一起修改 */#define RSHIFT_BITS        (4)#define OVERSAMPLE_FACTOR  (256)static unsigned short adc_result=0U;void adc_isr(void){    static unsigned short adc_index = OVERSAMPLE_FACTOR;    static unsigned int accumulator = 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位样本。

总结一下

在成本受限的情况下,可以通过单片机片内ADC过采样以及累积抽取的技术来提升采样分辨率,这种技术的特点:

  • 可以使用过采样和平均来提高测量分辨率,而无需增加昂贵的片外ADC。

  • 过采样和加和抽取将以提高CPU利用率和降低吞吐量为代价来提高SNR和测量分辨率。

  • 过采样和加和抽取可以改善白噪声的信噪比。

更多精彩推荐

☞300亿美元,AMD为什么要买Xilinx?

☞“我们的边缘计算技术点,可能超前了业界一点”
☞1024程序员节开源技术英雄会,参会“英雄榜”发榜

☞5行Python代码实现刷爆全网的动态条形图!

☞如何应对云原生之旅中的安全挑战?

☞区块链+生鲜:杜绝“偷梁换柱”和“以次充好”
点分享点点赞点在看

adc采样时间_太秀了!单片机内置 ADC 实现高分辨率采样?相关推荐

  1. STC32G单片机内置ADC及应用编程

    一  STC32G单片机内置ADC模块简介 STC32G单片机内部集成了一个12位高速ADC转换器,ADC的最高时钟频率为系统频率的1/2.其输入通道多达15个(第15通道为专门测量内部1.19V参考 ...

  2. 太秀了!单片机内置 ADC 实现高分辨率采样?

    作者 | 逸珺 来源 | 嵌入式客栈(ID:embInn) 头图 |  CSDN 下载自东方IC [导读] 相信ADC的应用或多或少都会用到,在很多场合都有分辨率要求,要实现较高分辨率时,第一时间会想 ...

  3. 我的世界服务器修改器1.7.10,我的世界修改器_我的世界TMI内置修改器1.7.10 - 99单机游戏...

    我的世界TMI内置修改器适用于1.7.10版本的我的世界,可以修改我的世界内部的参数,非常的有意思,想要的朋友欢迎前来下载. 安装方法: 1.有FORGE版 关闭Minecraft. 使用winrar ...

  4. python什么元素为真_如何使用Python基础内置函数

    如何使用Python基础内置函数 发布时间:2020-08-05 13:46:59

  5. eclipse不报错 intelliji 报错_小白提问:导入内置包winsound不报错但没声音是什么情况?...

    6月6日网友@Puyang The Process 在python论坛提问: 导入内置包winsound不报错但没声音是什么情况? 咱公众号的大佬们能帮助解答吗? 哈哈,python论坛设置了邮箱提醒 ...

  6. 51单片机怎么显示当前时间_(进阶篇)51单片机之按键控制蜂鸣器、数码管、按键值移位显示...

    一.实操演示- 按键控制蜂鸣器 1.图文详细 独立按键硬件电路 蜂鸣器硬件电路 2.连接方式: J20的第3号引脚连接到J7引脚,即P15连接J7. J29的第7.8号引脚连接到JP1的第1.2号引脚 ...

  7. 用python画的炫酷图形_太秀了,没想到这些既炫酷又能动的图竟然是用 Python 画的!...

    点击蓝色"Python空间"关注我丫 加个"星标",每天一起快乐的学习 选自TowardsDataScience    作者:Liana Mehrabyan 机 ...

  8. macbook禁用键盘_一行命令禁用 MacBook 内置键盘

    去年底阿麦换了新的 MacBook Pro,于是她自学生时代就一直在用的老款 MacBook Pro 就归我当玩具了.一度考虑过将其出售,但是想到自己还闲置了一块 SSD,就想着干脆换上让它继续服役. ...

  9. mysql中没有内置函数_[mysql]MySQL中的内置函数

    用在select  语句,以及子句where   order  by    hacing  中    update   delete 函数中可以将字段名作为字段来用,变量的值就是这个列对应的每一行记录 ...

最新文章

  1. 剖析IntentService的运作机理
  2. Python 有序字典(OrderedDict)与 普通字典(dict)
  3. SQLite学习手册(内置函数)
  4. Python配置-virtualenv和conda的区别
  5. 未能连接到许可证服务器 发生错误 -96,ug启动许可证错误怎么办 UG软件启动许可证错误96解决方法...
  6. 04:输出保留3位小数的浮点数
  7. memcached 远程拒绝服务漏洞
  8. matlab无穷积分求解_matlab编程求无穷限定积分
  9. 网络社区划分的算法分类
  10. Echarts带渐变色的折线图
  11. 华为云服务器怎么更改系统版本,华为云服务器怎么更改系统版本
  12. 在家远程控制公司电脑 掌握这两种方法你就超神了
  13. 数据结构分析之线性哈希表(Linear Hash Tables)
  14. 程序员人人都会遇到的“画饼”,一招教你破解
  15. JavaScript:表格生成器
  16. 十分钟安装一套即时通讯 IM 私有云
  17. 7000字用户画像技术及方法论
  18. 2020东京奥运会奖牌排行--数据可视化
  19. yocto 安装toolchain
  20. 第59期、基于Java springboot医院信息管理系统

热门文章

  1. Magic Leap有新动态!成立由斯蒂芬森领头的内容团队
  2. nginx 服务脚本编写模板
  3. Unity Mono脚本 加密
  4. Application Performance Management Monitoring | New Relic
  5. 为了你,我一定要写诗
  6. Vue.js 打造酷炫的可视化数据大屏
  7. RabbitMQ 的概念
  8. Dubbo对于REST协议的支持
  9. 重量级锁的加锁的基本流程
  10. SIMPLE/REUSE/BATCH 三种执行器的区别?