电子入门教程[03]—带上它的眼睛

电子入门教程[03]—带上它的眼睛

在浏览此文之前,可能你需要先康康这个:

电子入门教程[02]—会呼吸的光

在正式开始学习本文之前,你需要先自学以下知识:

  • C语言或C++
  • 安装Arduino IDE
  • 认识Arduino Uno开发板
  • 懂得如何使用面包板连接电路
  • 电子入门教程系列的前作(们)

前言

上一节,我们学会了如何把LED点成呼吸灯的效果和PWM的基础概念,学会了使用Arduino产生一个PWM信号,并且可以自己设定它的占空比值。
这节,我们来学习电子技术中的 显微镜—AD转换。以下是一些基本概念

  • A即Analog,意为模拟
  • D即Digital,意为数字
  • AD转换,就是把连续的模拟信号转换为离散的数字信号的过程~
  • DA转换,也就是AD转换的逆过程~
  • ADC, Analog-Digital Converter,AD转换器,也就是具体实现AD转换操作的电子器件,通常是大规模的(集成)电路
  • DAC,你猜?

一.Why AD/DA?

呀,如果你认真仔细地看完了之前的文章,你就(可能…?)知道我们的单片机I/O端口是不可以输出一个任意的电压值的,也不可以识别电平标准之外的电信号值(要么电压过高就boom了,要么电压负得太厉害也boom了orz)

但是,我们de单片机不是数字电路系统吗!它为什么要跟那些连续变化,天天变心的模拟电路有一腿?(模电就是个渣男?)
答案是,在实际应用中,很多模拟电路系统是由数字电路来控制的,窝们来举几个栗子8:

  • 比如电动汽车的大大大大大电机,运行时有很强大的电流通过,但它们的控制信号是由数字电路产生并经过放大器件(MOS,IGBT等)放大之后,再控制电池组的能量进入电机的


KPo6Cn.jpg

  • 又比如…我们喜闻乐见的(HIFI)音乐,在一般的扬声器/耳机中也是通过连续的不断变化的交流电信号使它发声的,数字音频信号由你的播放设备(手机,电脑声卡)解码之后送进DAC,DAC将离散的数字信号值高速地、精准地转换成(伪连续de)模拟电压,转换后的信号再经过功率放大器(攻放)放大之后灌进耳机/扬声器发声单元,在我们听来就是冻人的音乐啦~


KPoc3q.jpg

  • 啊,如果窝们想录音,这个流程大概就是反过来吧!不过窝们录音用的是麦克风(不是麦克雷!),他将声波信号转换为连续的交流电信号,再被我们的高速ADC采集,ADC将采集到的数据实时发给电脑等运算设备进行处理并存储,就得到了我们的录音。

  • 类似的例子在生活中还有hin多hin多…

我们的电子科技大厦虽然建立在数字世界上,但数字的根源仍然是模拟。因此我们必须弄清楚模拟与数字的内外在联系和他们互相的转换方式。

二.How Analog to Digital?

2.1-举个栗子

在开始介绍原理之前,我们先来举个栗子~
在这里,我们把尺子比作AD转换器。
我们把一个5V的电压对应为5cm,相应的0V电压对应0cm。现在我们有一个绝对精准的理想电压表和一个最小刻度为1mm,可测量最长长度为5cm的刻度尺。


KPTcIH.jpg

好滴,我们的信号登场了,它的电压是3.84V,用万用表可以很轻松地测出它对地的电压是3.84V,对应地,我们用尺子测量它所对应的3.84cm,我们只能得出它的取值范围在3.8cm到3.9cm之间(在这里我们不估读)。我们在这里就取它的测量结果是3.8V。

第二个信号出现了!它的电压是1.80V,重复上述的操作,我们可以得到一个精确的1.80V和一个 "精确的" 1.8V。

现在我们来数格子,刻度尺总共有50个格子,每一格子代表0.1V(0.1cm),第一个信号我们能数出38个格子,第二个我们能数出18个格子。此时我们可以以把格子数通过二进制的形式存储到计算机系统中,虽然他在这里并不是非常准确,但是我们仍可以用它测得的数据来估测真实的电压值。

50个格子 就相当于这个ADC的分辨率,它的长度5cm 就相当于这个ADC的量程。

通过上述的比喻,想必你已经有了一个大致印象。你可能会说,这ADC怎么这么蔡啊(拒收律师函),这种分辨率能测个锤子?事实上,现代的高精度ADC普遍已经达到了32位分辨率(也就是它在它的量程之内有2^32=4294967296个格子!),比如一款16位分辨率,量程0-10V的ADC器件,它的电压分辨率达到了0.000153V,也就是0.1mV的级别。

2.2-石剑是检验真理的唯一标准

那么让我们来实♂战一下,加深一下理解:
我们有一个量程0-5V,10位(2^10=1024个格子)分辨率的ADC供我们使用。
红色的线是我们的正弦信号,x轴代表时间。
假设我们有一个连续的正弦波信号需要采样(左图),在每一个蓝色竖线处我们对信号采一次样(测量一次),当一个周期的正弦波信号过去之后,我们得到了一系列的 格子数,比如前三个数值分别是512,768,936。


KPI1Wq.png

然后我们来计算这些数值相对应的电压值:

  • [ (5-0) / (2^10-1) ] * 512 = 2.502V
  • [ (5-0) / (2^10-1) ] * 768 = 3.754V
  • [ (5-0) / (2^10-1) ] * 936 = 4.575V

看到这里 是不是明白了很多?
下图是另一个简洁的示意图,这里的ADC的电压分辨率为0.25V,这样像一个阶梯。


KPI8S0.jpg

三.Arduino的眼睛在哪?

3.1-应有尽有的单片机

我们已经了解到单片机几乎是所有电子设备的控制核心,但是仅凭几个能改变电平状态的GPIO的话,是无法承受起这样的重担的…
所以,单片机的设计者们就在单片姬里面塞进了各种高级的玩意儿!我们的ADC/DAC也在其中~
翻开窝们的ATMEGA328P数据手册,发现这个单片姬里面竟然有6个10位的ADC!


KPTRJA.jpg

这6个ADC对应了6个I/O管脚,在这里你可能又有疑惑了,这些I/O管脚只是用作ADC输入来使用吗?
Of Course Not!!!
这就是神奇的 复用 ~,通过代码中对单片姬中寄存器的配置,可以让这些管脚工作在特定的模式下,你想让他作为ADC输入时就在代码中写好对应的操作,让他变成ADC输入;当你想让他就当一个与世无争的I/O时,一般给他保持默认值就好~
在我们的Arduino UNO上,这6个ADC管脚全部被引出并且在一排上紧挨着:


KPT2id.png

它们被称作Analog Channels,并在板上的白色丝印上标注了 "Analog IN"字样。一般窝们就把他们当作ADC输入使用。

3.2- 暗 中 观 察

这次,俺懒得搭实物来演示并录屏转GIF了…(好累的说
我直接用了这里的教程示例 谢谢他们qwq

窝们吧一个电位器(也就是高中用的滑动变阻器)两端接到电源两端(+5V和GND),中间的滑动片接到我们的ADC输入端口A0,通过改变滑片位置可以改变滑片上分得的电压,窝们用ADC把它读出来并发给电脑供我们观察。


KP7o11.png

以下是代码,我改了下注释。

int sensorPin = A0;  // ADC输入端口A0口
int digitalValue = 0;// 一个用来储存ADC读书的变量

void setup() {
  Serial.begin(9600);                  //初始化串口,波特率9600,后面窝们细讲~
}

void loop() {
  digitalValue = analogRead(sensorPin);// 读取sensorPin脚上的电压
  Serial.print("digital value = ");    //向串口输出字符串"digital value = "
  Serial.println(digitalValue);        //通过串口输出ADC得到的原始数字(以十进制),并换行
  delay(1000);                         //延时1000ms(1s)
}

然后窝们把开发板通过USB端口连接到电脑,打开Arduino IDE自带的串口监视器,设置波特率9600,按一下开发板的复位键,可以收到ADC读数的原始数值,转动电位器旋柄改变电压,可以看到读数的变化。


KP7T6x.png

至此你应该理解了ADC并知道如何去使用它了~快去做一些有意思的小作品吧!

这里的串口是一种通信协议,它可以将数据发送到上位机(电脑或蓝牙终端等)供我们调试观察系统的工作状态,并且还可以用串口绘图器将输入的数据绘制成曲线图,我们调试的过程中少不了它的帮助,是不是hin强大?

窝们下节就来港港串口等通信协议吧~

敬请期待! (出炉啦!

电子入门教程[04]—喂?zaima?

结尾碎碎念

高速ADC和DAC一直是尖端科技攻关必备的器件。比如导弹的导航系统,高端示波器的采样前端,在电子测量领域所有的高端仪器几乎都离不开高速的ADC/DAC器件。据我们所知我国目前这方面仍然被某些国家卡着脖子。(当然我们也不知道具体情况怎么样)

  • Floydfish 于2019.10.16

发表回复

这篇文章有 2 个评论

  1. link

    What’s Going down i’m new to this, I stumbled upon this I’ve found It positively useful and it has helped me out loads.

    I hope to contribute & assist different customers
    like its aided me. Great job.

  2. 沧海笑

    [探头]催更!催更!(证明泥不是鸽子的时侯到了)