数字信号 vs 模拟信号
为什么读按键用 digitalRead,读光敏电阻却要用 analogRead?因为它们根本是两种不同的信号。分不清这点,你会用错函数、读出一堆莫名其妙的值——把按键接到 ADC 脚上读回来 0 或 4095 你还以为坏了,其实是拿量连续值的方式去量一个只有两态的东西。
两种信号的本质:离散 vs 连续
一句话戳穿区别:数字信号是离散的,模拟信号是连续的。
- 数字信号:只有有限的几个状态——通常就两个:高或低、1 或 0、开或关。中间没有"半开半关"这回事。按键(按下/松开)、拨码开关、PIR 人体感应(有人/没人)、干簧管(磁铁近/远),都是数字。
- 模拟信号:一个平滑连续变化的量,理论上可以取无穷多个值。光照从暗到亮、温度从冷到热、电位器旋钮从一头转到另一头——它们不是非黑即白,而是从弱到强连续过渡,中间的每一个中间值都真实存在。
打个比方:数字信号像楼梯,只能站在一级级台阶上,没有台阶之间的位置;模拟信号像斜坡,脚可以停在坡面上任何一点。
现实是模拟的,MCU 是数字的
这里有个绕不开的矛盾,理解了它,后面所有的桥接电路都有了根。
物理世界几乎全是模拟的。 你想测的温度、光、声音、力、位置,本质都是连续变化的物理量,传感器把它们转成连续变化的电压。
可单片机内部是纯数字的。 CPU、内存、总线里跑的只有 0 和 1,它压根不认识"1.6437…V"这种带无穷小数的东西。
两边对不上,就需要翻译官:
- 从模拟世界读进数字世界,靠 ADC(模数转换器)——把连续电压量化成一个整数。想弄懂那个 0–4095 是怎么来的,看 ADC 采样原理。
- 从数字世界写回模拟世界,靠 DAC(数模转换器)——把整数还原成一个真实的连续电压,用来发波形、驱动音频。看 DAC 原理。
所以 ADC 和 DAC 不是可有可无的外设,而是数字大脑和模拟世界之间必经的两道门。
数字信号凭什么这么受宠
既然现实是模拟的,为什么不干脆全用模拟?因为数字信号有三个模拟比不了的硬优势:
- 抗噪。 模拟信号叠上一点噪声,值就变了,而且这个误差会一路累积、没法还原。数字信号只认高和低两态,只要噪声没大到把高压成低、把低顶成高,接收端一判决就恢复干净了——中间蹭上的那点毛刺被彻底忽略。
- 可无损存储和复制。 一个模拟值存进电容会慢慢漏电漂移,抄一遍就失真一次。数字信号是一串确定的 0 和 1,存一万年、复制一万遍,还是那串 0 和 1,不走样。
- 可精确处理。 数字值能直接拿去做数学运算、滤波、加密、压缩,做多少遍精度都可控。这也是为什么信号一旦进了 MCU,大家都想尽快把它数字化再处理。
代价就是那道量化门:连续值被归到最近的整数档,档与档之间的细节被抹掉了——这是数字化必然付出的精度损失,ADC 原理 里讲得更细。
传感器输出:哪些是数字,哪些是模拟
买传感器前先分清它吐出来的是哪种信号,你才知道该接哪种引脚。
输出数字信号的(接普通 GPIO,用 digitalRead):
- 开关量:按键、限位开关、干簧管、水浸/雨滴模块的 DO 脚——只给你高或低。
- 带数字接口的:I2C(如 SHT30 温湿度、BMP280 气压)、SPI、UART 的传感器。它们内部自己带了 ADC,把测好的值打包成数字,通过总线一次读回来的直接就是数值,不用你再转换。这类越来越主流,省心又准。
输出模拟信号的(必须接 ADC 引脚,用 analogRead 或 IDF 的 adc_oneshot):
- 电压量:光敏电阻、电位器、麦克风模块的 AO 脚、简单的模拟温度传感器(如 LM35)——给你的是一个随物理量连续变化的电压。
注意同一个模块常常两个脚都有:**DO(数字输出)**给你一个"超没超过阈值"的开关,**AO(模拟输出)**给你连续的原始值。要判断"有没有光"接 DO 就够,要知道"具体多亮"就得接 AO 走 ADC。
同一个量,选数字还是模拟传感器
现在测同一个物理量,市面上往往数字、模拟两种传感器都有。就说测温度:既有模拟的 LM35(输出随温度变化的电压),也有数字的 DS18B20、SHT30(直接吐数字值)。怎么选?
- 模拟传感器:便宜、响应快,但它把"原始电压"一路拉到你的 ADC 脚,这段导线越长越容易被干扰,读数飘;精度还受你板子上 ADC 和参考电压质量的拖累。
- 数字传感器:内部自带 ADC,常带出厂校准和温度补偿,测好直接以数字形式走 I2C/1-Wire 传出来,长走线也不怕干扰,读回来就是标好单位的值。
趋势因此很明显:除非图便宜或要极快响应,现在越来越多人直接选数字接口传感器——省了自己配 ADC、算标定的功夫,读数还更稳更准。这也是本站传感器专题里数字接口型号占多数的原因。
怎么判断一个信号该用哪种口接
拿到一个传感器或信号,按这三步走:
- 看它输出几个态。 只有开/关两态 → 数字,接 GPIO。有连续中间值 → 模拟,接 ADC 脚。
- 看模块丝印和引脚名。 标
DO、INT、SCL/SDA(I2C)、TX/RX(UART)的是数字口;标AO、OUT(且数据手册说是电压输出)的是模拟口。 - 模拟信号还要查板子引脚图。 不是所有引脚都能读模拟,只有标了 ADC 的 GPIO 才行;ESP32 上还要避开 WiFi 一开就失灵的 ADC2 脚(细节见 ADC 原理)。另外接之前确认双方电平一致,5V 数字信号直接怼进 3.3V 的脚会烧口,这属于 逻辑电平 的事。
数字 IO 本身怎么读怎么写、上拉下拉怎么配,看 GPIO 原理。
反过来:输出也分两种
- 数字输出:
digitalWrite,给高或低,点灯、拉继电器就够了。 - 真模拟输出:靠 DAC,输出一个真实的连续电压,用来发音频、生成波形。ESP32 老款有 DAC 引脚,ESP32-S3 则没有独立 DAC。看 DAC 原理。
- "假"模拟输出:大多数 MCU 用 PWM(快速开关)来模拟中间值做调光、调速——它本质还是数字方波,靠占空比骗过灯和电机,并不是真的输出中间电压。详见 PWM 原理。
一句话口诀
两态是数字,连续是模拟;现实是模拟的、芯片是数字的,进出各靠 ADC 和 DAC 一道门。 读之前先问一句:这信号只有开/关,还是有连续中间值?前者接 GPIO 用 digitalRead,后者接 ADC 脚才读得出真正的量。
下一步
理解了信号类型,去看 ADC 采样原理 弄懂那个 0–4095 怎么来的,反过来把数字变电压看 DAC。数字 IO 的读写细节在 GPIO 原理,接线前电平对不对得上看 逻辑电平。