第 6 章 输入电路:信号怎么进来
本章核心问题:传感器、按键、麦克风……这些外部信号,怎么安全、准确地送进 MCU?
如果把 MCU 比作一个大脑,那”输入电路”就是它的五官。眼睛看光线、耳朵听声音、皮肤感受温度——这些信号在变成数字之前,都要经过一段精心设计的”入口电路”。本章将带你逐一拆解每种输入场景,手把手教你把信号”请”进芯片。
6.1 按键与开关#
6.1.1 最简单的输入:一个按键#
按键是嵌入式系统中最古老、最朴素的人机交互方式。你按一下,MCU 就知道”有人按了”。听起来简单,但如果不注意细节,一个按键就能让你调试一整天。
基本电路:上拉电阻方案
这是你在 90% 的电路图中都会看到的按键接法:
VCC (3.3V)
│
┌┴┐
│ │ R1 = 10kΩ (上拉电阻)
└┬┘
│
├───────── GPIO(MCU 输入引脚)
│
┌┴┐
│ │ SW1(轻触按键)
└┬┘
│
GNDplaintext工作原理:
- 按键松开时:GPIO 通过 10kΩ 电阻被”拉”到 VCC(3.3V),读到高电平。
- 按键按下时:GPIO 直接连到 GND,读到低电平。
💡 为什么需要上拉电阻? 如果去掉 R1,按键松开时 GPIO 引脚处于”悬空”状态(既不是高也不是低),极易受到噪声干扰,MCU 可能读到乱七八糟的值。上拉电阻的作用就是:给悬空的引脚一个确定的默认电平。
下拉电阻方案(反过来):
GPIO ──┬── SW1 ── VCC
│
┌┴┐
│ │ R1 = 10kΩ (下拉电阻)
└┬┘
│
GNDplaintext此时:松开 = 低电平,按下 = 高电平。逻辑是反的,但完全可用。
实际选择上拉还是下拉?
| 考虑因素 | 上拉电阻(按键接地) | 下拉电阻(按键接 VCC) |
|---|---|---|
| 默认电平 | 高(逻辑 1) | 低(逻辑 0) |
| 抗干扰能力 | 较强(高电平噪声容限大) | 一般 |
| MCU 内部上拉 | 很多 MCU 内置上拉电阻,可省外部电阻 | 很少有内置下拉 |
| 常用程度 | ⭐⭐⭐⭐⭐ 最常用 | ⭐⭐ 偶尔使用 |
🔧 实用技巧:STM32、ESP32 等 MCU 内部有可配置的上拉/下拉电阻(通常 20kΩ~50kΩ),简单应用中可以省掉外部电阻,直接用内部上拉,简化电路。但如果走线较长、环境噪声大,还是建议加外部 10kΩ 上拉。
6.1.2 按键的”天敌”:抖动#
什么是按键抖动?
机械按键的内部是金属弹片。当你按下按键的瞬间,弹片不会”啪”的一下就稳定接触,而是会像弹簧一样来回弹跳几次,大约在 5ms~20ms 内才能稳定。这个过程在示波器上看起来是这样的:
理想情况(你以为的):
┌──────────────────
─────┘
↑ 按下
实际情况(真实的):
┌─┐ ┌┐┌────────────
─────┘ └─┘└┘
↑ 弹跳!MCU 以为你按了 3 次plaintext对于 MCU 来说(处理速度是微秒级的),这 10ms 的弹跳就像你在一秒内疯狂按了十几次按键!后果就是:按一次,触发多次。
6.1.3 硬件消抖:RC 低通滤波#
最经典的硬件消抖方案就是在按键旁边加一个电容:
VCC (3.3V)
│
┌┴┐
│ │ R1 = 10kΩ
└┬┘
│
├──┬────── GPIO
│ │
┌┴┐│
C1 │ ││ SW1(按键)
100nF └┬┘│
│ │
├─┘
│
GNDplaintext原理:利用电容”电压不能突变”的特性。按键弹跳产生的快速脉冲,会被电容”吸收”——电容通过 R1 缓慢充放电,把尖锐的脉冲”抹平”成一条平滑的曲线。
参数选择:
RC 时间常数 τ = R × C:
- R = 10kΩ,C = 100nF → τ = 1ms
- 一般要求 τ ≥ 抖动时间的 3~5 倍
- 抖动典型值 5
20ms,所以 τ 取 10100ms 较合适
| 消抖强度 | R 值 | C 值 | τ 值 | 适用场景 |
|---|---|---|---|---|
| 轻度 | 10kΩ | 100nF | 1ms | 快速按键,软件配合消抖 |
| 中度 | 10kΩ | 1μF | 10ms | 一般场景,推荐 |
| 重度 | 100kΩ | 1μF | 100ms | 恶劣环境,按键质量差 |
⚠️ 注意:RC 值太大,按键反应会变”迟钝”——按下去后要等很久才响应,快速连续按会丢失。所以不要一味加大。
6.1.4 软件消抖#
在实际项目中,软件消抖往往比硬件消抖更常用(因为省钱、省元件):
// 最简单的软件消抖(伪代码)
if (GPIO_Read(KEY_PIN) == LOW) { // 检测到低电平
Delay_ms(20); // 等 20ms,让弹跳过去
if (GPIO_Read(KEY_PIN) == LOW) { // 再次确认还是低电平
// 确认按键真的按下了!
Key_Pressed = true;
}
}c核心思路:检测到低电平后,等 10~20ms 再读一次。如果还是低电平,说明不是抖动,是真的按下了。
💡 工程实践:很多成熟产品同时使用硬件 RC 滤波(粗消抖)+ 软件延时(精消抖),双保险。
6.1.5 矩阵键盘(简述)#
当按键数量多(比如 4×4 = 16 个按键)时,如果每个按键占一个 GPIO,需要 16 个引脚,太浪费了。
矩阵键盘的思路:把按键排成行和列的交叉矩阵。4 行 × 4 列只需要 8 个 GPIO 就能检测 16 个按键。
COL1 COL2 COL3 COL4
│ │ │ │
ROW1 ── [K1] ─[K2] ─[K3] ─[K4]
│ │ │ │
ROW2 ── [K5] ─[K6] ─[K7] ─[K8]
│ │ │ │
ROW3 ── [K9] ─[K10]─[K11]─[K12]
│ │ │ │
ROW4 ── [K13]─[K14]─[K15]─[K16]plaintext扫描原理:
- 将 ROW1 拉低,其他行拉高
- 读取 COL1~COL4,哪个列是低电平,说明对应按键被按下
- 再拉低 ROW2,读列……逐行扫描
📌 矩阵键盘在遥控器、计算器、工业键盘中非常常见,但日常小项目中用得不多,了解原理即可。
6.2 ADC 详解#
6.2.1 ADC 是什么?#
ADC(Analog-to-Digital Converter,模数转换器)是 MCU 感知模拟世界的”翻译官”。真实世界的信号——温度、光照、声音、压力——都是连续变化的模拟量,而 MCU 只认识 0 和 1。ADC 的工作就是把连续的电压值翻译成离散的数字。
传感器 ──→ [模拟电压 0~3.3V] ──→ ADC ──→ [数字 0~4095] ──→ MCU 处理plaintext大部分 MCU(STM32、ESP32、Arduino 等)内部都集成了 ADC,不需要外部芯片。
6.2.2 分辨率:1 LSB 对应多少电压?#
ADC 的分辨率用 位数(bit) 表示。位数越高,能分辨的电压越精细。
| ADC 位数 | 量化级数 | 3.3V 参考电压下 1 LSB |
|---|---|---|
| 8 bit | 256 级 | 3.3V / 256 ≈ 12.9 mV |
| 10 bit | 1024 级 | 3.3V / 1024 ≈ 3.2 mV |
| 12 bit | 4096 级 | 3.3V / 4096 ≈ 0.8 mV |
| 16 bit | 65536 级 | 3.3V / 65536 ≈ 0.05 mV |
| 24 bit | 16777216 级 | 3.3V / 16777216 ≈ 0.2 μV |
计算公式:
其中
举例:STM32F103 内置 12 位 ADC,参考电压 3.3V:
- 如果 ADC 读数为 2048,对应的实际电压 = 2048 × (3.3 / 4096) = 1.65V
- 如果你想分辨 1mV 的电压变化,12 位 ADC(0.8mV/LSB)刚好够用
💡 直觉理解:ADC 就像一把刻度尺。12 位 ADC 把 0~3.3V 的范围刻成了 4096 个小格。每格 0.8mV。你量的东西比一格还小?那就看不出来了——这就是精度的天花板。
6.2.3 采样率与奈奎斯特定理#
采样率:ADC 每秒钟能采集多少次,单位是 SPS(Samples Per Second)或 kSPS、MSPS。
奈奎斯特-香农采样定理(Nyquist-Shannon Sampling Theorem):
要无失真地还原一个模拟信号,采样频率必须大于信号最高频率的 2 倍。
为什么?
想象你在拍一个摆动的钟摆。如果你每秒拍 1 张照片(采样率低),而钟摆每秒摆动 2 次(信号频率高),你拍到的照片可能看起来钟摆在慢慢动甚至反方向动——这就是混叠(Aliasing)。
真实信号:~~~~~(高频正弦波)
采样点: · · · · (采样太慢)
采样后看到:~(变成了低频假信号!)plaintext工程实例:
- 音频信号最高 20kHz → 采样率至少 40kHz → CD 音质用 44.1kHz
- 温度信号变化很慢(<1Hz) → 采样 10 次/秒 就够了
- 心电图信号最高约 100Hz → 采样率至少 200Hz,实际用 500Hz~1kHz
6.2.4 SAR ADC vs Sigma-Delta ADC#
MCU 内部集成的 ADC 大多是 SAR(逐次逼近型),而外部高精度 ADC 芯片很多是 Sigma-Delta(Σ-Δ)型。它们的区别是什么?
SAR ADC —— “二分查找法”#
原理类比:猜数字游戏。
假设 ADC 是 12 位,参考电压 3.3V。输入电压是 1.8V。SAR 的转换过程:
- 先试中间值 2048(对应 1.65V):1.8V > 1.65V → 第 1 位 = 1
- 再试 2048+1024 = 3072(对应 2.475V):1.8V < 2.475V → 第 2 位 = 0
- 再试 2048+512 = 2560(对应 2.063V):1.8V < 2.063V → 第 3 位 = 0
- 再试 2048+256 = 2304(对应 1.856V):1.8V < 1.856V → 第 4 位 = 0
- ……继续逐位逼近,12 步完成。
特点:
- ✅ 速度快(1 次转换 = 12 个时钟周期),适合中高速采样(100kSPS ~ 10MSPS)
- ✅ 功耗低,延迟小
- ✅ MCU 内部集成方便
- ❌ 精度一般(通常 12~16 位)
Sigma-Delta ADC —— “以时间换精度”#
原理类比:称重时,你不用一个精确的大秤,而是用一个小勺子一勺一勺加水,数加了多少勺。
Σ-Δ ADC 的核心思想:
- 过采样:以远高于奈奎斯特频率的速率采样(比如 64 倍、128 倍、256 倍)
- 噪声整形:通过特殊的反馈环路,把量化噪声”推”到高频段
- 数字滤波:用数字低通滤波器把高频噪声滤掉,留下干净的低频信号
特点:
- ✅ 精度极高(24 位甚至 32 位)
- ✅ 非常适合缓慢变化的高精度信号(温度、称重、心电)
- ✅ 内置数字滤波,抗混叠要求低
- ❌ 速度慢(通常 < 1kSPS)
- ❌ 延迟大(需要多次采样后才有结果)
对比总结#
| 特性 | SAR ADC | Sigma-Delta ADC |
|---|---|---|
| 典型分辨率 | 12~16 bit | 16~32 bit |
| 采样率 | 100kSPS ~ 10MSPS | 10SPS ~ 100kSPS |
| 延迟 | 低(单次转换) | 高(需多次过采样) |
| 功耗 | 中 | 可低可高 |
| 适用场景 | 电机控制、快速传感器 | 温度、称重、音频、心电 |
| 典型芯片 | STM32 内置 | ADS1256、HX711、ADS1115 |
6.2.5 ADC 输入范围与保护#
致命错误:输入电压超过参考电压!
MCU 的 ADC 输入引脚通常有一个允许电压范围(一般是 0V ~ Vref)。如果输入电压超过这个范围:
- 轻则:ADC 读数饱和(永远是最大值 4095),数据不准
- 重则:内部 ESD 二极管导通,大电流灌入芯片,永久损坏 ADC 甚至 MCU
保护电路设计:
R_lim (100Ω~1kΩ) 到 ADC 引脚
传感器输出 ────/\/\/\─────┬────/\/\/\──────── GPIO_ADC
│
┌─────┴─────┐
│ │
┌─────┴───┐ ┌─────┴───┐
│ TVS/ │ │ 滤波 │
│ 钳位 │ │ 电容 │
│ 二极管 │ │ 100nF │
└─────┬───┘ └─────┬───┘
│ │
GND GNDplaintext三重保护:
- 限流电阻 R_lim(100Ω~1kΩ):限制流入 ADC 引脚的最大电流
- 钳位二极管(TVS 管或肖特基二极管):把电压钳在 0V~VCC 之间
- 当输入 > VCC + 0.3V → 上管导通,把电压拉到 VCC
- 当输入 < -0.3V → 下管导通,把电压拉到 GND
- 滤波电容 C_filter(10nF~100nF):滤除高频噪声,兼做抗混叠
⚠️ 实际案例:很多人用 STM32 的 ADC 测电池电压(4.2V),但 STM32 的 ADC 最大输入只有 3.3V。直接接上去,轻则读数永远是 4095,重则烧坏引脚。必须先分压!
6.2.6 参考电压:内部 vs 外部基准#
ADC 的”尺子”有多长,取决于参考电压
内部参考:
- 大多数 MCU 默认使用 VCC(3.3V)作为参考电压
- 优点:简单,不需要外部电路
- 缺点:VCC 本身不稳定(尤其 USB 供电时可能有 ±5% 的波动),ADC 读数会跟着飘
外部基准:
- 使用专用的基准电压芯片(如 REF3033 输出精确的 3.300V、LM4040 输出 2.048V)
- 优点:精度极高(±0.1%),温漂小(10ppm/°C),读数稳定
- 缺点:多一个芯片,多一块钱
什么时候需要外部基准?
- 需要精确的绝对电压测量(如万用表、医疗设备)
- 传感器信号很小(mV 级),需要参考电压很稳定
- 产品需要过校准/认证
💡 省钱技巧:如果只是测温度、光照这种”大概值”,内部参考完全够用。如果是做电子秤、血氧仪,必须上外部基准。
6.3 模拟传感器接口#
6.3.1 分压电路:最常见的传感器接法#
很多模拟传感器本质上就是一个可变电阻:
- NTC 热敏电阻:温度↑ → 电阻↓
- 光敏电阻(LDR):光照↑ → 电阻↓
- 湿敏电阻:湿度↑ → 电阻↓
MCU 的 ADC 只能测电压,不能直接测电阻。所以需要把电阻变化转成电压变化——最简单的办法就是分压电路。
NTC 热敏电阻测温电路#
VCC (3.3V)
│
┌┴┐
│ │ R1 = 10kΩ(精密电阻,1%)
└┬┘
│
├──────── GPIO_ADC
│
┌┴┐
│ │ NTC(10kΩ @ 25°C,B=3950)
└┬┘
│
GNDplaintext工作原理:
- NTC 和 R1 组成分压器
- 分压点电压:
- 温度变化 → NTC 阻值变化 →
变化 → ADC 读数变化
计算示例:
- 25°C 时,NTC = 10kΩ →
- 50°C 时,NTC ≈ 3.6kΩ →
- 0°C 时,NTC ≈ 27.3kΩ →
从 ADC 读数反推温度:
// 1. 读 ADC 值,换算电压
float voltage = adc_value * 3.3 / 4096.0;
// 2. 从电压反推 NTC 电阻
float R_ntc = R1 * voltage / (VCC - voltage);
// 3. 用 B 值公式算温度(Steinhart-Hart 简化版)
// 1/T = 1/T0 + (1/B) × ln(R_ntc / R0)
float T0 = 298.15; // 25°C = 298.15K
float B = 3950;
float R0 = 10000; // 25°C 时的阻值
float temperature_K = 1.0 / (1.0/T0 + (1.0/B) * log(R_ntc / R0));
float temperature_C = temperature_K - 273.15;c💡 R1 怎么选? 一般取与 NTC 在目标温度范围中点的阻值相同。比如测温范围 0~50°C,中点 25°C 时 NTC = 10kΩ,那 R1 就选 10kΩ。这样在中间温度时灵敏度最高。
光敏电阻电路#
完全一样的分压结构,只是把 NTC 换成光敏电阻:
VCC (3.3V)
│
┌┴┐
│ │ R1 = 10kΩ
└┬┘
│
├──────── GPIO_ADC
│
┌┴┐
│ │ LDR(光敏电阻)
└┬┘ 暗 ≈ 1MΩ, 亮 ≈ 1kΩ
│
GNDplaintext- 光照强 → LDR 电阻小 →
低 - 光照弱 → LDR 电阻大 →
高
6.3.2 RC 低通滤波(抗混叠)#
传感器信号通常夹杂着各种高频噪声(电源纹波、数字信号串扰、空间电磁干扰)。如果不滤波就直接送进 ADC,这些噪声会被 ADC 一起采样,导致读数跳来跳去。
抗混叠滤波器就是一个放在 ADC 前面的低通滤波器,只让低频的有用信号通过,把高频噪声挡在外面。
R_filter
100Ω~1kΩ
传感器 ────────────/\/\/\──────┬──── GPIO_ADC
│
┌─┴─┐
│ │ C_filter
│ │ 100nF ~ 1μF
└─┬─┘
│
GNDplaintext截止频率:
设计举例:
- 测温度(信号变化极慢,< 1Hz):R = 1kΩ, C = 1μF →
≈ 160Hz(绰绰有余) - 测音频(信号最高 20kHz):R = 100Ω, C = 1nF →
≈ 1.6MHz
⚠️ 注意:R 不能太大!因为 ADC 采样时会在输入端产生一个瞬态电流(采样电容充电),如果 R 太大,这个电流会在 R 上产生压降,导致采样不准。一般 R_filter ≤ 1kΩ。
6.3.3 接 ADC 前的 Buffer(电压跟随器)#
什么时候需要加 Buffer?
当传感器输出阻抗很高(比如分压电阻用了 100kΩ 以上),或者信号源距离 ADC 很远时,ADC 的采样电容充电需要很长时间。如果信号源”推不动”ADC,采样值就会偏低或不稳定。
解决方案:在传感器和 ADC 之间加一个电压跟随器(运放 Buffer)。
传感器 ──→ [高阻抗输出] ──→ 运放 Buffer ──→ [低阻抗输出] ──→ ADC
(增益=1)plaintext电压跟随器的输入阻抗极高(几乎不从传感器取电流),输出阻抗极低(能轻松驱动 ADC)。就像在传感器和 ADC 之间放了一个”中继放大器”。
📌 详细电路请参考第 3 章(运放)的 3.3 节”电压跟随器”。
6.3.4 惠斯通电桥:微小电阻变化的”放大镜”#
为什么要用电桥?
有些传感器(应变片、压力传感器)的电阻变化非常小——比如一个 350Ω 的应变片,受力后可能只变了 0.1Ω。用简单的分压电路根本测不出来!
惠斯通电桥(Wheatstone Bridge)就是为这种情况量身定做的电路:
VCC (激励电压,如 5V)
│
┌─────┼─────┐
│ │ │
┌┴┐ ┌┴┐ │
R1 │ │ │ │R2 │
└┬┘ └┬┘ │
│ │ │
├─V+ ├─V- │
│ │ │
┌┴┐ ┌┴┐ │
R3 │ │ │ │R4 │
└┬┘ └┬┘ │
│ │ │
└─────┼─────┘
│
GNDplaintext平衡条件:当
工作原理:当 R4 是一个应变片,受力后阻值变化 ΔR:
- 电桥失去平衡
,产生一个与 ΔR 成正比的微小差模电压 - 这个电压通常在 mV 级别(比如 2mV/V 灵敏度 × 5V 激励 = 10mV 满量程)
信号调理:
电桥输出的 mV 级差分信号,需要:
- 仪表放大器放大(如 INA128、AD620,增益 100~1000 倍)
- 低通滤波去噪
- 送入 ADC
仪表放大器
惠斯通电桥 ──→ [差分信号 ±10mV] ──→ [增益 100x] ──→ [0~1V] ──→ ADCplaintext典型应用:电子秤
电子秤的核心就是一组应变片组成的惠斯通电桥 + 高精度 ADC:
称重传感器(4 个应变片组成全桥)
│
↓ E+ / E- / S+ / S-(4 根线)
│
HX711(24 位 Σ-Δ ADC,内置 PGA 增益 128x)
│
↓ DOUT / SCK(简单的 2 线接口)
│
MCU(STM32 / Arduino / ESP32)plaintext💡 HX711 是电子秤领域最经典的芯片——它把仪表放大器 + 24 位 ADC + 数字滤波全部集成在一个小芯片里,只需要 2 个 GPIO 就能读到精确的重量数据。淘宝上几块钱一片。
6.4 数字传感器接口#
6.4.1 I²C 传感器:最常用的数字传感器#
与模拟传感器不同,数字传感器内部已经集成了 ADC 和信号处理电路,直接通过数字接口(I²C、SPI 等)输出数字数据。你不需要操心 ADC 分辨率、滤波等问题——传感器自己处理好了。
常见的 I²C 数字传感器:
| 传感器类型 | 典型芯片 | 功能 |
|---|---|---|
| 温湿度 | SHT30、DHT20、AHT20 | 测环境温湿度 |
| 加速度/陀螺仪 | MPU6050、BMI270 | 测姿态、运动 |
| 气压 | BMP280、BMP390 | 测气压、海拔 |
| 环境光 | BH1750、VEML7700 | 测光照强度 |
| 磁力计 | HMC5883L、QMC5883L | 电子罗盘 |
I²C 接口基本电路:
VCC (3.3V)
│ │
┌┴┐ ┌┴┐
Rp1 │ │ │ │ Rp2 (上拉电阻)
└┬┘ └┬┘
│ │
SCL ───────────┼────┼─────────── SCL(传感器)
│ │
SDA ───────────┼────┼─────────── SDA(传感器)
│ │
MCU │ │ 传感器
│ │
GND GNDplaintext6.4.2 上拉电阻的选择#
I²C 总线使用开漏(Open-Drain)输出——设备只能把线拉低,不能主动拉高。所以必须通过上拉电阻来提供高电平。
上拉电阻不能随便选!选大了选小了都不行:
| 电阻太大 | 电阻太小 |
|---|---|
| 上升沿太慢(RC 充电慢) | 拉低时电流太大 |
| 方波变成三角波 | 超过 GPIO 的灌电流能力 |
| 通信速率上不去 | 低电平可能不够低 |
| 高速模式无法工作 | 浪费功耗、发热 |
计算方法:
最小值(保证低电平不超标):
= 0.4V(I²C 规范要求的最大低电平) = 3mA(I²C 规范要求的最大灌电流)
例如 VCC = 3.3V:
最大值(保证上升沿时间满足要求):
= 上升时间要求(标准模式 1000ns,快速模式 300ns) = 总线电容(所有设备引脚电容 + 走线寄生电容之和,一般 10~100pF)
例如快速模式(
经验推荐值:
| 总线速率 | VCC = 3.3V 推荐 Rp | VCC = 5V 推荐 Rp |
|---|---|---|
| 标准模式(100kHz) | 4.7kΩ | 4.7kΩ |
| 快速模式(400kHz) | 2.2kΩ ~ 3.3kΩ | 2.2kΩ ~ 3.3kΩ |
| 高速模式(1MHz+) | 1kΩ ~ 2.2kΩ | 1kΩ ~ 2.2kΩ |
💡 新手建议:板子不长、设备不多时,4.7kΩ 基本万能。如果跑 400kHz 发现波形不好,降到 2.2kΩ 试试。
6.4.3 I²C 地址冲突问题#
每个 I²C 设备都有一个 7 位地址(比如 BMP280 是 0x76 或 0x77)。如果两个设备地址相同,挂在同一条总线上就会冲突——MCU 不知道该和谁说话。
解决方案:
- 地址引脚:很多芯片有 A0/A1 地址选择引脚,通过接 GND 或 VCC 来改变地址
- 比如 INA219 有 A0、A1 两个引脚,可以配置 16 个地址(0x40~0x4F)
- I²C 多路复用器:如 TCA9548A,可以把一条 I²C 总线分成 8 条,每条独立寻址
- 换芯片:选择地址不同的替代型号
6.5 电流检测#
6.5.1 为什么要检测电流?#
电流检测在很多场景中是刚需:
- 电池管理:充放电电流监测,估算剩余电量
- 电机控制:实时电流反馈,做过流保护
- 电源管理:监测各路负载的功耗
- USB 充电:检测充电电流是否正常
6.5.2 基本原理:采样电阻 + 测量电压#
电流检测最朴素的方法:在电流路径中串一个小阻值的精密电阻(叫”采样电阻”或”分流电阻”,Shunt Resistor),然后测这个电阻两端的电压。
采样电阻怎么选?
| 考虑因素 | 说明 |
|---|---|
| 阻值 | 通常 1mΩ~1Ω。阻值太小→电压信号太弱;阻值太大→压降和功耗太大 |
| 功率 | |
| 精度 | 至少 1%,高精度场景用 0.1% |
| 封装 | 大电流用 2512 甚至更大的封装 |
举例:检测 0~2A 的电流,用 50mΩ 采样电阻:
- 满量程压降 = 2A × 50mΩ = 100mV
- 最大功耗 = 2² × 0.05 = 0.2W(选 0.5W 封装足够)
6.5.3 高侧采样 vs 低侧采样#
采样电阻放在电路的哪个位置,是一个关键选择:
低侧采样(采样电阻在负载和 GND 之间)#
VCC ──────→ [负载] ──→ [R_shunt] ──→ GND
│
测量电压 → ADCplaintext优点:
- 电路简单,采样电阻一端接地,另一端电压很低(mV 级)
- 对运放要求低,普通运放甚至直接进 MCU ADC 就能用
缺点:
- ⚠️ 负载的”地”不再是真正的 GND,而是会随着电流变化而浮动
- 如果负载对地敏感(比如电机驱动、通信模块),低侧采样会引入地线噪声
- 无法检测负载对地短路(如果负载直接短路到 GND,电流不经过采样电阻)
高侧采样(采样电阻在 VCC 和负载之间)#
VCC ──→ [R_shunt] ──→ [负载] ──→ GND
│
测量电压 → 差分放大 → ADCplaintext优点:
- 负载的地是稳定的真实 GND,不受采样影响
- 可以检测负载对地短路故障
- 抗地线噪声能力强
缺点:
- 采样电阻两端都”悬”在高电位上,需要差分放大器或专用高侧电流检测芯片
- 运放/芯片需要承受高共模电压
对比总结#
| 特性 | 低侧采样 | 高侧采样 |
|---|---|---|
| 电路复杂度 | ⭐ 简单 | ⭐⭐⭐ 较复杂 |
| 对运放要求 | 低 | 高(需耐高压共模) |
| 负载地稳定性 | ❌ 不稳定 | ✅ 稳定 |
| 地短路检测 | ❌ 不能 | ✅ 能 |
| 适用场景 | 消费电子、简单应用 | 电机驱动、电源管理、BMS |
💡 工程建议:除非成本极其敏感,优先选高侧采样。低侧采样引入的地线扰动在很多场景中是个隐患。
6.5.4 专用电流检测芯片:INA219#
如果你不想自己搭差分放大电路,INA219 是最常用的”傻瓜式”电流检测方案:
核心参数:
- 电压测量范围:0~26V
- 电流测量:双向,通过 I²C 直接读出数字值
- 内置 12 位 ADC + PGA(可编程增益放大器)
- 分辨率:可配置到 mA 级
- I²C 接口,2 根线搞定
典型电路:
VCC(被测)──→ [R_shunt 0.1Ω] ──→ [负载] ──→ GND
│ │
IN+ IN-
│ │
┌─┴────────┴─┐
│ INA219 │
│ │
│ SDA ───────┼──→ MCU SDA
│ SCL ───────┼──→ MCU SCL
│ VS ── 3.3V │
│ GND ── GND │
└─────────────┘plaintextINA219 即使自身用 3.3V 供电,也能测量高达 26V 的共模电压上的电流——这就是高侧采样的威力。MCU 通过 I²C 直接读取寄存器,就能得到精确的电流值(mA)、母线电压(V)和功率(mW),非常方便。
6.6 音频输入#
6.6.1 麦克风类型概览#
在嵌入式项目中,最常用的麦克风有两种:
| 特性 | 驻极体麦克风(ECM) | MEMS 麦克风 |
|---|---|---|
| 体积 | 较大(圆柱形 Ø4~10mm) | 极小(3×4mm 贴片) |
| 需要偏置电压 | ✅ 需要 2~10V | ✅ 需要(内部集成) |
| 输出类型 | 模拟(需要外部 FET) | 模拟或数字(PDM/I²S) |
| 一致性 | 差(个体差异大) | 好(硅工艺,批量一致) |
| 耐温性 | 差(不能过回流焊) | 好(可 SMT 贴装) |
| 成本 | 低 | 低~中 |
| 典型型号 | 通用 ECM 模块 | SPW2430、INMP401、ICS-43434 |
6.6.2 驻极体麦克风(ECM)电路#
驻极体麦克风内部有一个 JFET(结型场效应管),需要外部提供偏置电压才能工作:
VCC (2~5V,典型 3.3V)
│
┌┴┐
│ │ R_bias = 2.2kΩ~10kΩ(偏置电阻)
└┬┘
│
├─────── C_couple ──────→ 到前置放大器输入
│ 1μF~10μF
┌┴┐
│ │ ECM(驻极体麦克风)
└┬┘
│
GNDplaintext各元件的作用:
- R_bias(偏置电阻):给麦克风内部的 JFET 提供直流工作点。阻值影响灵敏度和功耗:
- 2.2kΩ → 灵敏度高,功耗大
- 10kΩ → 灵敏度略低,功耗小
- C_couple(耦合电容):隔离直流,只让交流音频信号通过。麦克风输出有直流偏置(约 VCC/2),耦合电容把这个直流挡掉,只输出以 0V 为中心的交流音频信号。
💡 为什么需要耦合电容? 因为后续放大器和 ADC 需要以某个合适的偏置点为中心处理信号。如果不隔直,麦克风的直流偏置会占据 ADC 的动态范围,降低信号的有效幅度。
6.6.3 MEMS 麦克风电路#
MEMS 麦克风内部集成了 MEMS 传感器 + 前置放大器,使用更简单:
模拟输出型 MEMS 麦克风(如 SPW2430):
VCC (1.8~3.3V)
│
┌┴┐
│ │ 100nF(去耦电容,必须紧贴芯片)
└┬┘
│
┌─────┴─────┐
│ MEMS MIC │
│ │
│ VDD ─ VCC │
│ GND ─ GND │
│ OUT ───────┼─── C_couple ──→ 到前置放大器
└────────────┘ 1μF~10μFplaintext数字输出型 MEMS 麦克风(如 INMP441,I²S 接口):
┌─────────────┐
│ MEMS MIC │
│ (I²S 输出) │
│ │
│ VDD ─ VCC │
│ GND ─ GND │
│ SCK ─────────┼──→ MCU I²S_SCK
│ WS ─────────┼──→ MCU I²S_WS(字选择)
│ SD ─────────┼──→ MCU I²S_SD(数据)
│ L/R ─ GND │ (左/右声道选择)
└─────────────┘plaintext数字输出的 MEMS 麦克风内部已经集成了 ADC,直接输出数字音频数据,省去了模拟放大和 ADC 采样的麻烦。
6.6.4 前置放大电路#
无论 ECM 还是模拟 MEMS 麦克风,输出的音频信号都非常微弱(通常只有 几 mV 到几十 mV),远不足以直接驱动 ADC。需要一个前置放大器把信号放大到 ADC 能处理的范围(比如 0~3.3V)。
这正是第 3 章”运放”中交流放大电路的典型应用:
R1 = 10kΩ
┌───/\/\/\─── VCC/2(偏置点)
│
│ R2 = 10kΩ
├───/\/\/\─── GND
│
│ Rf = 100kΩ(反馈电阻,决定增益)
│ ┌─/\/\/\─┐
│ │ │
C_couple ──┬───┤- │ 运放 ├───┬── C_out ──→ ADC
10μF │ │ │(LMV321)│ │ 1μF
│ └──┤+ │ │
│ │ │ │
│ └─────────┘ │
│ │
└─── R3 = 10kΩ ──────┘
(偏置到 VCC/2)plaintext关键设计要点:
-
偏置到 VCC/2:单电源供电时,运放的输出只能在 0V~VCC 之间。音频信号是交流的(有正有负),所以需要把信号的”中心点”偏置到 VCC/2(如 1.65V),这样信号可以在 1.65V 上下摆动。
-
增益设置:
- 增益 = 1 + Rf/R3 = 1 + 100k/10k = 11 倍
- 如果麦克风输出 20mVpp,放大后 ≈ 220mVpp
- 增益可以更高(50~100 倍),但要注意运放的带宽限制
-
耦合电容:输入和输出的耦合电容隔离直流,只传递交流音频信号
-
高通截止频率(由耦合电容和偏置电阻决定):
例如 R_bias = 5kΩ(R1//R2),C_couple = 10μF:
(远低于人耳能听到的 20Hz,完全 OK)
📌 这个电路与第 3 章 3.6 节”交流放大电路”完全对应。运放选型建议使用低噪声、轨到轨运放,如 OPA344、LMV321、AD8605。
本章小结#
| 输入类型 | 核心电路 | 关键注意事项 |
|---|---|---|
| 按键 | 上拉电阻 + RC 消抖 | 消抖(硬件/软件)不能省 |
| ADC 通用 | 分压 + RC 滤波 + 钳位保护 | 输入不能超 Vref,注意抗混叠 |
| NTC/光敏 | 分压电路 | 固定电阻选中间值,注意精度 |
| 电桥传感器 | 惠斯通电桥 + 仪表放大 | 信号微弱,需高增益 + 高精度 ADC |
| I²C 传感器 | 上拉电阻 + 地址配置 | 上拉电阻按速率和电容计算 |
| 电流检测 | 采样电阻 + 差分/专用芯片 | 高侧优于低侧,注意共模电压 |
| 音频输入 | 偏置 + 耦合 + 前置放大 | 偏置到 VCC/2,增益匹配 ADC 范围 |
一句话总结:信号进 MCU 之前,要做好三件事——电平适配(别超量程)、噪声过滤(RC 滤波)、安全保护(钳位/限流)。把这三关守住,你的输入电路就稳了。
参考资料与推荐阅读#
- TI 高精度实验室 —— ADC 系列教程(TI 官网免费视频)
- NXP I²C 总线规范手册 —— I²C 上拉电阻计算的权威来源
- HX711 数据手册 —— 电子秤 ADC 芯片的经典参考
- INA219 数据手册(TI) —— 高侧电流检测的标杆方案
- TDK/InvenSense 应用笔记 —— MEMS 麦克风电路设计指南
- NTC 热敏电阻 B 值计算 —— Steinhart-Hart 方程详解
搜索到的参考图片资源(供学习参考,非直接使用):
| 主题 | 来源 URL | 说明 |
|---|---|---|
| 按键抖动波形 | https://www.cnblogs.com/WIRO/p/19710757 | RC 硬件消抖电路详解,含抖动波形图 |
| 按键消抖电路设计 | https://m.blog.csdn.net/weixin_75048312/article/details/157808334 | 自锁按键 + RC 去抖电路原理图 |
| 按键电路综合设计 | https://m.blog.csdn.net/m0_69034122/article/details/159172145 | 上拉 + RC + TVS 完整保护电路 |
| SAR vs Sigma-Delta ADC | https://m.blog.csdn.net/m0_49540263/article/details/149710031 | 两种 ADC 架构原理对比 |
| ADC 全面指南 | https://www.monolithicpower.cn/cn/learning/resources/comprehensive-guide-to-analog-to-digital-converters | MPS 出品的 ADC 入门指南 |
| 惠斯通电桥 + 称重传感器 | https://m.blog.csdn.net/j7k8l/article/details/153552045 | Arduino + 应变片电子秤实战 |
| HX711 电子秤方案 | https://developer.aliyun.com/article/1741027 | STM32 + HX711 高精度电子秤设计 |
| I²C 上拉电阻计算 | https://m.blog.csdn.net/ChengduLemid/article/details/150265801 | 上拉电阻科学计算方法 |
| I²C 上拉电阻详解 | https://m.elecfans.com/article/2192207.html | 含计算公式和推荐值表 |
| INA219 电流检测 | https://m.blog.csdn.net/Si15166622538/article/details/160447815 | INA219 实战指南 |
| 高侧 vs 低侧采样 | https://m.elecfans.com/article/7492171.html | 直流电流采样电路全解析 |
| NTC 温度检测电路 | https://m.blog.csdn.net/weixin_75048312/article/details/157808218 | NTC 分压式 + 滤波电路详解 |
| MEMS vs ECM 麦克风 | https://lp-cn1-wechat-production.merklechina.com/post/digikey/technical_article/726/ | DigiKey 出品,两种麦克风对比 |
| 驻极体麦克风电路 | https://m.blog.csdn.net/weixin_42005993/article/details/102533065 | ECM 偏置电阻和噪声处理 |
| ADC 抗混叠滤波器 | https://m.blog.csdn.net/weixin_31620365/article/details/160964285 | AAF 设计原理与工程实践 |
| ADC 输入保护电路 | https://www.elecfans.com/zt/145593/ | ADC 输入保护方案汇总 |