当前位置: 首页 > news >正文

通俗易懂的理解 ADC(2)

理解什么是ADC

文章目录

      1、通俗理解什么是ADC
      2、什么是ADC
      3、ADC的采样率
      4、采样位数
      5、采样精度

ADC实际没有这么的简单,深入了解需要去学各种寄存器之间如何协作,信号如何走通。这些概念在后面会有讲解。

1、通俗理解什么是ADC

完全理解什么是ADC还是比较难的,以下通过举例可以通俗易懂后建议实操一下;

2、什么是ADC

我们在高中物理学习时都了解过电压表,在生活中也都见过。万用表的红表头、黑表头分别去触碰待测电路两端,就可以测出来这段的分压。如果让黑表头去触碰电源的负极,那么测出来的就是红表头所在的地方的电压。

如果测试点是1V,电压表就显示1V,2V呢就显示2V。可以说他们有如下的对应关系

测试点电压

万用表显示的值

0.00V

0V

1.65V

1.65V

3.3V

3.3V

于是我们有了概念:万用表是一种感知电压大小的器件。

ADC也是这样的器件。不过呢ADC不能显示小数,我们以STM32F1单片机12位ADC为例。他只能显示0-4095这些整数。
                                       4095=(1111  1111  1111)二进制=2^{12}-1
这就是12位ADC的含义。

那么ADC的电压对应关系就要改一改,没有像电压表一样一一对应。具体关系如下

测试点电压

ADC的测试值

0V

0

1.65V

2048

3.3V

4096

表1

这个关系如果写成如下公式。

掌握表1对应关系就可以,没必要背公式
                             ADC的返回值=4096\tfrac{?}{3.3V}(?:待测电压)

比如我用ADC去测量1V的电压,那么ADC返回的数值是

                                                       4096*\frac{1}{3.3}=1241

当单片机收到ADC返回的1241,单片机就可以知道待测电压是1V了。

3、ADC的采样率

采样率这个概念需要在使用中去感受,这里就简单提下,在后续的文章中,我们会对他有更加准确的认识

之前我们都是在讨论用ADC去采集直流电压,比如一个稳定的1V。可是如果我们要采集的是一个在不断变化的信号呢?

比如采集1hz正弦信号。我们可以每1s采集一次,那么完全看不出这个信号的变化和波形;但如果我们每100ms采集一次呢,一个信号周期内就采集了10个点,可以大致看出这个信号的波形;如果我们每1ms,每1us采集一次呢?那么这个信号的波形就完全被我们知道了。

上面的1s,100ms,1us分别对应的是1 sps、10 sps、1M sps采样率。采样率表示的是ADC的采样速度。对于不同ADC,有自己的采样率上限的。比如STM32F103的单个ADC采样率支持1hz-1Mhz。

拿1M采样率去采集1K信号,一个周期有1000个点,效果非常好;但是如果1M去采集1M信号,这和每1s去采集一个1hz信号一样,一个周期1个点,根本看不出波形

常用单位:

M=10^{-3},U=10^{-6},N=10^{-9}
K=10^{3},M=10^{6},G=10^{9}

4、采样位数

这个对于初学者来说,可以忽略。当真的要临选择一款合适的ADC时,再来了解这个。先记住,采样位数越高,电压分辨能力越强(可以简单的认为测得越准)

(下面的讨论均默认采样位数=精度位数)

我们回看表1,一个可以测量0-3.3V的12位ADC。他有如下对于关系:

测试点电压

ADC的测试值

0V

0

1.65V

2048

...

...

3.3V

4096


相当于把0-3.3V等比例划分为了4096份,它的电压分辨能力是

                                                          0.0008V=\frac{3.3}{4096}
这是一个什么概念呢?

因为ADC只能返回整数,我们测量0V,ADC返回的是0。我们测量0.0008V,ADC返回的是1。同理,测量0.008V,ADC返回的是10。可是如果我们测量0.0004V呢?他返回的是0,测试结果与测量0V时是一样的。

可以看到12位的ADC是没办法分辨0V和0.0004V,原因在于我们把0-3.3V分成了4096份,这个份数还不够多,要分成8192份。就可以分辨了。
                                                          0.0004V=\frac{3.3}{8192}

这样的话测量0V测到是0,测量0.0004V得到的是1。

测试点电压

ADC的测试值

0V

0

0.0004V

1

...

...

1.65V

4096

...

...

3.3V

8192

上面所提到的4096和8192分别对应着12位ADC,13位ADC。因为

                                                          2^{12}=4096, 2^{13}=8192

ADC位数反应的是电压的分辨能力。一个24位的ADC能非常灵敏的检测到12位ADC感应不到的电压变动。

5、采样精度

这个对于初学者来说,可以忽略。默认采样精度和ADC位数基本成正比就行,ADC位数越高,采集的电压越精确。虽然这样说是错的,但是目前阶段够用。——真理的相对性

这个概念经常和采样位数混淆。精度的概念需要有一定的实际操作后才能理解他的含义。

还是拿0-3.3V的12位ADC为例子。如果我们去测量80mv的信号,理论值应该是

                                                            100=4096*\tfrac{0.08}{3.3}
可是实际我们测量出来的是95-105波动的,这是因为实际上的ADC不是理想器件,他会有误差。一个12位的ADC虽说能分辨0.0008V的电压,但是他的波动电压有10mv,那么这个分辨能力也就失去了他测得准的意义。

因为测得的电压的波动。通常一个12位的ADC只能当作8-9位的理想ADC来用,8-9位就是ADC的采样精度。

相关文章:

  • zabbix绑定钉钉进行通知,网页端添加JavaScript,无脑式操作
  • sharo反序列化漏洞
  • 算法| ss 双指针
  • CentOS7安装Tomcat
  • 如何在plesk面板安装域名付费SSL证书
  • 云原生架构(微服务、容器云、DevOps、不可变基础设施、声明式API、Serverless、Service Mesh)
  • 大语言模型中常见小模型LLM垂直领域应用微调数据集
  • C++20 semaphore(信号量) 详解
  • 摄影杂记一
  • MyBatis 解决上篇的参数绑定问题以及XML方式交互
  • Pytest教程:一文了解如何使用 pytest_runtest_makereport 修改 Pytest 测试报告内容
  • NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城
  • DFS序列
  • 双击返回键,轻松处理 WebView 中的后退事件
  • vue3从精通到入门14:内置组件之KeepAlive
  • JavaScript-如何实现克隆(clone)函数
  • $translatePartialLoader加载失败及解决方式
  • 【剑指offer】让抽象问题具体化
  • 【译】理解JavaScript:new 关键字
  • CAP 一致性协议及应用解析
  • MySQL数据库运维之数据恢复
  • PHP CLI应用的调试原理
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • win10下安装mysql5.7
  • 关于List、List?、ListObject的区别
  • 前端技术周刊 2019-02-11 Serverless
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 数据结构java版之冒泡排序及优化
  • 主流的CSS水平和垂直居中技术大全
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • $.proxy和$.extend
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二)windows配置JDK环境
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十)T检验-第一部分
  • (一)为什么要选择C++
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET CLR基本术语
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net6Api后台+uniapp导出Excel
  • .NET建议使用的大小写命名原则
  • .net中的Queue和Stack
  • @Autowired标签与 @Resource标签 的区别
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ 转载 ] SharePoint 资料
  • []指针
  • [2010-8-30]
  • [Asp.net mvc]国际化
  • [BT]BUUCTF刷题第4天(3.22)