第 7 章 输出电路:信号怎么出去
本章核心问题:LED 怎么调光?电机怎么调速?蜂鸣器怎么响?屏幕怎么亮?
如果说第 6 章是 MCU 的”五官”,那本章就是它的”手脚和嘴巴”。MCU 通过 GPIO 输出电平、PWM 波形、通信信号,去驱动 LED 发光、电机转动、喇叭发声、屏幕显示——把数字世界的决策变成物理世界的行动。本章将逐一拆解每种输出场景的电路设计与工程细节。
7.1 PWM(脉宽调制)#
7.1.1 什么是 PWM?#
PWM(Pulse Width Modulation,脉宽调制)是一种用数字信号模拟连续模拟量的技术。它的核心思想极其简洁:
通过改变方波信号”高电平持续时间”占整个周期的比例,来等效控制输出的平均电压或功率。
PWM 信号本质上仍然是数字信号——只有 HIGH(比如 3.3V)和 LOW(0V)两种状态。但它通过高速切换,让负载”感觉到”了一个介于 0V 和 3.3V 之间的”平均电压”。
两个核心参数:
| 参数 | 定义 | 单位 |
|---|---|---|
| 频率(Frequency) | 每秒完成多少个”高-低”循环 | Hz |
| 占空比(Duty Cycle) | 一个周期内高电平时间占总周期的百分比 | % |
公式:
直观理解:
占空比 25%: 占空比 50%: 占空比 75%:
┌──┐ ┌────┐ ┌──────┐
──┘ └──────── ──┘ └──────── ──┘ └────
平均 = 0.25×3.3V 平均 = 0.5×3.3V 平均 = 0.75×3.3V
= 0.825V = 1.65V = 2.475Vplaintext💡 类比:想象你在淋浴——如果你开水龙头 1 秒、关 3 秒、开 1 秒、关 3 秒……循环往复,你感受到的”平均水量”就只有满开的 25%。这就是 PWM 的本质——快速开关,用时间比例控制平均效果。
7.1.2 PWM 的频率怎么选?#
PWM 频率的选择直接决定了效果好不好,选错了会有各种问题:
| 应用场景 | 推荐频率 | 原因 |
|---|---|---|
| LED 调光 | 1kHz ~ 20kHz | 低于 100Hz 人眼会看到闪烁;太高开关损耗大 |
| 电机调速 | 10kHz ~ 20kHz | 低于 10kHz 电机可能发出可听见的”嗡嗡”声 |
| 舵机控制 | 50Hz(周期 20ms) | 舵机标准协议,脉冲宽度 0.5~2.5ms 对应角度 |
| PWM 模拟 DAC | ≥ 20kHz | 频率越高,RC 滤波后的纹波越小 |
| 开关电源控制 | 100kHz ~ 2MHz | 频率高 → 电感/电容可以更小 |
7.1.3 PWM 的用途#
PWM 的应用极其广泛,几乎贯穿了整本”输出电路”:
- LED 调光(7.2 节详述)
- 电机调速(7.4 节详述)
- PWM 模拟 DAC(7.8 节详述)
- 开关电源控制(第 4 章 DC-DC)
- 舵机角度控制
7.1.4 PWM + RC 低通 → 模拟电压(简易 DAC)#
这是 PWM 最”黑客”的用法之一——把数字方波变成真正的模拟直流电压!
MCU PWM ──── R (1kΩ~10kΩ) ────┬──── V_out(模拟电压)
│
┌─┴─┐
│ │ C (1μF~10μF)
└─┬─┘
│
GNDplaintext原理:RC 低通滤波器把 PWM 方波中的高频分量滤掉,只留下直流分量(即平均值)。
- 截止频率
,应远小于 PWM 频率
设计举例:PWM 频率 = 20kHz,R = 4.7kΩ,C = 1μF
,滤波效果很好
优缺点:
- ✅ 零成本(不需要 DAC 芯片),任何有 PWM 的 MCU 都能用
- ❌ 纹波不为零(总有残余波动),精度取决于 VCC 稳定性
- ❌ 响应速度慢(RC 时间常数大 → 电压变化慢)
- ❌ 输出阻抗高(不能直接驱动低阻抗负载,需加 Buffer)
📌 关于 DAC 的更多方案,详见 7.8 节。
7.2 LED 驱动#
7.2.1 GPIO 直接驱动(小电流 LED)#
最简单的方式:MCU 的 GPIO 引脚通过限流电阻直接驱动 LED。
GPIO ──── R_lim ──── LED ──── GNDplaintext限流电阻计算:
其中:
= GPIO 输出高电平电压(通常 3.3V 或 5V) = LED 正向压降(见下表) = LED 工作电流(通常 5~20mA)
常见 LED 正向压降:
| LED 颜色 | 典型 | 波长范围 |
|---|---|---|
| 红外 | 1.2~1.5V | 850~940nm |
| 红色 | 1.8~2.2V | 620~630nm |
| 黄色/橙色 | 2.0~2.2V | 585~605nm |
| 绿色 | 2.0~3.5V | 520~530nm |
| 蓝色 | 2.8~3.5V | 460~470nm |
| 白色 | 2.8~3.5V | 全光谱 |
计算示例:驱动一个红色 LED(
⚠️ GPIO 驱动能力有限! 大多数 MCU 单个 GPIO 最大灌/拉电流为 20~25mA。如果要驱动大功率 LED(>20mA),必须用三极管或 MOS 管来”放大”驱动能力。
7.2.2 MOS 管驱动(大电流 LED)#
当 LED 电流超过 GPIO 能力时(比如 1W 大功率 LED,电流 350mA),必须用 MOS 管做开关:
VCC (12V / 5V)
│
┌┴┐
LED │ │ (大功率 LED)
└┬┘
│
├──────── Drain
│
┌──┴──┐
│N-MOS│ (如 AO3400、SI2302)
│ │
└──┬──┘
│
PWM ──Rg── Gate Source
│ │
└──R_pd──┘ │
10kΩ │
GND GNDplaintext工作原理:
- PWM 高电平 → N-MOS 导通 → LED 亮
- PWM 低电平 → N-MOS 截止 → LED 灭
- 通过改变 PWM 占空比 → 改变 LED 的平均亮度
关键元件说明:
- Rg(栅极电阻):通常 10Ω~100Ω,限制栅极充电电流,防止 PWM 频率高时栅极电容充放电过快产生振铃/EMI
- R_pd(下拉电阻):10kΩ,保证 MCU 复位/悬空时 MOS 管不会误导通
💡 为什么用 N-MOS 做低侧驱动? N-MOS 的导通电阻
比同价位的 P-MOS 小得多(导通损耗低),且 Gate 驱动简单(用 GPIO 高电平就能驱动)。所以 N-MOS 低侧驱动是最常用的功率开关方案。
7.2.3 PWM 调光 vs 模拟调光#
调节 LED 亮度有两种方式:
模拟调光(改变电流大小)#
通过改变流过 LED 的电流大小来调节亮度(比如改变限流电阻的阻值,或用可调恒流源)。
- ❌ LED 的亮度与电流不是线性关系(低电流时人眼感知非线性)
- ❌ 改变电流会改变 LED 的色温(颜色会偏移)
- ❌ 调光范围有限
PWM 调光(改变亮灭时间比)#
LED 始终以额定电流工作,只是通过 PWM 控制”亮的时间占比”。
- ✅ 色温不偏移(电流始终是额定值)
- ✅ 亮度与占空比近似线性
- ✅ 调光范围宽(0%~100%)
- ✅ 效率高(MOS 管要么完全导通要么完全截止,损耗极小)
💡 工程共识:LED 调光首选 PWM 调光。只有在对 EMI 极其敏感、不能有开关噪声的场景才考虑模拟调光。
7.2.4 恒流驱动(LED 串、背光)#
当多个 LED 串联使用(如 LED 灯带、LCD 背光)时,用恒流驱动是最佳方案:
为什么需要恒流?
LED 的 V-I 曲线非常陡峭——电压微小的变化(比如温度变化导致)会导致电流剧烈变化。如果用恒压驱动,LED 电流很容易跑偏,导致:
- 亮度不均匀
- 过热烧毁(热失控)
恒流驱动方案:用专用恒流芯片(如 PT4115、LM3414)或运放+MOS 管搭建恒流源,保证流过 LED 的电流恒定。
VCC ──→ [LED串] ──→ [恒流驱动电路] ──→ GND
│
设定电流
I = Vref / R_senseplaintext7.3 蜂鸣器驱动#
7.3.1 有源蜂鸣器 vs 无源蜂鸣器#
蜂鸣器是嵌入式系统中最常用的发声元件。但很多人搞不清”有源”和”无源”的区别:
| 特性 | 有源蜂鸣器 | 无源蜂鸣器 |
|---|---|---|
| 内部结构 | 内置振荡电路 | 只有压电/电磁振动片 |
| 驱动方式 | 加直流电压就响 | 必须输入方波(2~5kHz) |
| 声音 | 固定频率(通常是”滴——“) | 频率由输入方波决定 |
| 能否播音乐 | ❌ 不能(只有一种音调) | ✅ 能(改变频率=改变音调) |
| 控制复杂度 | ⭐ 极简(GPIO 高低电平) | ⭐⭐ 需定时器产生方波 |
| 价格 | 略贵(内部多了电路) | 便宜 |
| 外观区分 | 通常较高(9mm),有+号标记 | 通常较矮(8mm),无+号 |
⚠️ 最常见的错误:把有源蜂鸣器当无源用(给方波不响),或把无源蜂鸣器当有源用(给直流电压只”咔”一声就不响了)。先搞清楚你手里的是哪种!
7.3.2 NPN 三极管驱动电路#
MCU 的 GPIO 驱动能力有限(通常 ≤ 25mA),而蜂鸣器工作电流往往在 30~80mA,所以需要用三极管或 MOS 管来驱动:
有源蜂鸣器驱动(NPN 低侧驱动):
VCC (5V / 3.3V)
│
┌┴┐
│ │ D1(续流二极管 1N4148)
└┬┘ ←阴极──┐
│ │
├──── BUZZER(有源蜂鸣器)
│ │
│ ┌────┘
│ │
┌┴─────┘
│ Collector
┌─┴─┐
│NPN│ (如 S8050、2N2222)
│ │
└─┬─┘
│ Emitter
│
GPIO ─R1── Base (基极限流电阻 1kΩ)
│
R2 = 10kΩ
│
GNDplaintext各元件作用:
- R1(基极限流电阻):限制 GPIO 输出的基极电流。
。三极管放大倍数 β ≈ 100 200,可驱动 260520mA 的负载电流,绰绰有余。 - R2(下拉电阻):保证 GPIO 悬空/复位时三极管可靠截止,蜂鸣器不叫。
- D1(续流二极管):这是最重要的保护元件!
7.3.3 续流二极管:感性负载必须加#
为什么蜂鸣器需要续流二极管?
蜂鸣器内部有一个电磁线圈,本质是一个电感。电感的特性是电流不能突变。当三极管突然截止(断开)时:
- 线圈中的电流突然被切断
- 根据楞次定律,电感会产生一个反向高压尖峰(可达几十伏甚至上百伏!)
- 这个高压直接加在三极管的 C-E 极之间
- 结果:三极管被击穿损坏,或者产生强电磁干扰影响其他电路
续流二极管的作用:
正常工作时:D1 反向截止,不参与电路
┌─→ 电流路径:VCC → 蜂鸣器 → 三极管 → GND
│
VCC ─┤─ BUZZER ──┬── Collector
│ │
└── D1 ─────┘ (D1 阴极接 VCC 侧,正常时反偏)
三极管断开瞬间:
线圈产生反向电动势 → D1 正向导通 → 电流通过 D1 续流释放
┌───────────────────┐
│ BUZZER → D1 → BUZZER │ (形成回路,能量慢慢消耗掉)
└───────────────────┘plaintext续流二极管为电感储能提供了一个安全的释放通道,把危险的几十伏尖峰电压钳位到约 0.7V(二极管正向压降),保护三极管不受损害。
⚠️ 铁律:任何感性负载(继电器、蜂鸣器、电机、电磁阀)在开关管旁边,必须加续流二极管。不加,就等着烧管子。
7.3.4 N-MOS 驱动蜂鸣器#
如果蜂鸣器电流较大,或追求更低的驱动损耗,可以用 N-MOS 替代 NPN:
VCC
│
BUZZER
│
┌┴┐ D1
└┬┘
│
├──── Drain
┌──┴──┐
PWM ─Rg─│N-MOS│ (如 AO3400)
│ │
└──┬──┘
│ Source
GNDplaintextMOS 管的优点:导通电阻极低(几十 mΩ),几乎没有导通损耗;栅极驱动只需电压,不消耗稳态电流。
无源蜂鸣器的驱动电路与有源完全一样,区别只在于软件——你需要用 PWM(定时器)输出 2kHz~5kHz 的方波,改变频率就能改变音调,从而实现播放简单旋律。
// 无源蜂鸣器播放"滴"声(伪代码)
PWM_SetFrequency(2700); // 设置 PWM 频率 2700Hz
PWM_SetDutyCycle(50); // 50% 占空比,声音最大
Delay_ms(200); // 响 200ms
PWM_SetDutyCycle(0); // 静音
Delay_ms(100); // 停 100msc7.4 电机驱动#
7.4.1 直流电机与 H 桥原理#
直流电机是最简单的电机——接上正电压就正转,接上反电压就反转。但问题来了:MCU 的 GPIO 只能输出 0V/3.3V,怎么让电机反转(需要反向电压)?GPIO 电流才 20mA,怎么驱动几百 mA 的电机?
答案是:H 桥电路。
H 桥的基本结构(因形似字母 H 而得名):
VCC VCC
│ │
┌─┴─┐ ┌─┴─┐
│ Q1│ │ Q3│ (Q1/Q3 = 高侧开关,通常 P-MOS)
└─┬─┘ └─┬─┘
│ │
├──── Motor ───┤ (电机是 H 的"横杠")
│ │
┌─┴─┐ ┌─┴─┐
│ Q2│ │ Q4│ (Q2/Q4 = 低侧开关,通常 N-MOS)
└─┬─┘ └─┬─┘
│ │
GND GNDplaintext四种控制状态:
| Q1 | Q2 | Q3 | Q4 | 电机状态 | 电流方向 |
|---|---|---|---|---|---|
| ON | ON | OFF | OFF | 正转 | VCC → Q1 → 电机 → Q2 → GND |
| OFF | OFF | ON | ON | 反转 | VCC → Q3 → 电机 → Q4 → GND |
| ON | OFF | ON | OFF | 刹车 | 电机两端都接 VCC,快速停止 |
| OFF | OFF | OFF | OFF | 滑行 | 电机自由旋转,慢慢停下 |
⚠️ 绝对禁止:Q1 和 Q2 同时导通(或 Q3 和 Q4 同时导通)= 直通短路(shoot-through)!VCC 直接短路到 GND,瞬间烧毁 MOS 管。所有 H 桥驱动芯片内部都有”死区时间”保护来防止这种情况。
PWM 调速:在正转或反转状态下,对其中一个开关管施加 PWM 信号,占空比越大 → 平均电压越高 → 电机转速越快。
7.4.2 实际中用驱动芯片#
自己搭 H 桥电路非常麻烦(4 个 MOS 管 + 栅极驱动 + 死区保护 + 续流二极管……),实际项目中几乎都用集成电机驱动芯片:
DRV8833(TI)—— 小功率双路直流电机驱动#
| 参数 | 值 |
|---|---|
| 工作电压 | 2.7V ~ 10.8V |
| 单路连续电流 | 1.5A(峰值 2A) |
| 导通电阻 | 0.31Ω(高侧+低侧合计) |
| 通道数 | 2 路独立 H 桥 |
| 控制方式 | 2 个输入引脚 / 通道(IN1/IN2),支持 PWM 调速 |
| 保护功能 | 过流、过温、欠压锁定 |
| 封装 | TSSOP-16 |
| 典型应用 | 智能小车、玩具机器人 |
DRV8833 典型连接:
VCC_MOTOR (5~9V)
│
┌─┴─┐
│ │ 100μF(电机供电去耦)
└─┬─┘
│
┌───────┴────────┐
│ DRV8833 │
│ │
│ AIN1 ←── MCU GPIO1(PWM)
│ AIN2 ←── MCU GPIO2(方向)
│ │
│ AOUT1 ──┬── 电机A ──┬── AOUT2
│ │ │
│ │
│ BIN1 ←── MCU GPIO3
│ BIN2 ←── MCU GPIO4
│ │
│ BOUT1 ──┬── 电机B ──┬── BOUT2
│ │ │
└────────────────┘
│
GNDplaintext7.4.3 步进电机(简述)#
步进电机是精确位置控制的利器——每收到一个脉冲信号就转一个固定角度,不需要编码器等位置反馈就能实现精确定位。
基本原理:
常见步进电机步距角 = 1.8°(即 200 步/圈)。内部有两个线圈(A 相和 B 相),通过按特定顺序给线圈通电,驱动转子一步步旋转:
步进序列(全步驱动):
步骤1: A+, B+ → 转子位置 0°
步骤2: A-, B+ → 转子位置 90°
步骤3: A-, B- → 转子位置 180°
步骤4: A+, B- → 转子位置 270°
→ 回到步骤1,循环往复plaintext细分驱动(微步):
为了让步进电机运行更平滑、更安静、精度更高,现代驱动芯片采用细分技术——把一个全步(1.8°)细分为多个微步:
| 细分模式 | 每圈步数 | 步距角 |
|---|---|---|
| 全步 | 200 | 1.8° |
| 半步 | 400 | 0.9° |
| 1/4 步 | 800 | 0.45° |
| 1/8 步 | 1600 | 0.225° |
| 1/16 步 | 3200 | 0.1125° |
A4988 —— 最经典的步进电机驱动模块#
| 参数 | 值 |
|---|---|
| 工作电压 | 8V ~ 35V |
| 最大输出电流 | ±2A(带散热片) |
| 细分模式 | 全、半、1/4、1/8、1/16 |
| 控制接口 | STEP(脉冲)+ DIR(方向) |
| 内置功能 | 过流保护、过温保护、欠压锁定 |
| 典型应用 | 3D 打印机、CNC 雕刻机 |
A4988 控制极其简单:
- STEP 引脚:每给一个脉冲,电机走一步
- DIR 引脚:高电平正转,低电平反转
- MS1/MS2/MS3:配置细分模式
转速 = 脉冲频率 × 步距角 / 360°
例如:1.8° 全步模式,脉冲频率 1000Hz
→ 转速 = 1000 × 1.8 / 360 = 5 转/秒 = 300 RPMplaintext7.4.4 续流二极管 / TVS 保护#
电机是典型的感性负载,开关瞬间会产生高压尖峰。集成驱动芯片(如 DRV8833、A4988)内部已经集成了续流二极管,外部不需要再加。
但如果你用分立 MOS 管搭 H 桥,就必须在每个 MOS 管旁边加续流二极管(或用 TVS 管钳位):
VCC
│
D1 ──┤── D3
↑ │ ↑
│ ├─Motor─┤
↓ │ ↓
D2 ──┤── D4
│
GNDplaintext四个二极管组成”桥式续流”网络,无论电流方向如何,都能为断电瞬间的感应电动势提供释放路径。
7.5 继电器驱动#
7.5.1 继电器是什么?#
继电器是一种用电信号控制机械开关的元件。它让你能用 MCU 的 3.3V / 5mA 信号去控制 220V / 10A 的大功率设备(灯、加热器、水泵等),实现”以小控大”。
MCU GPIO ──→ [驱动电路] ──→ [继电器线圈] ──→ [触点开关] ──→ 大功率负载
3.3V 5V/12V 220V/10Aplaintext7.5.2 NPN 三极管驱动#
VCC (5V / 12V)
│
┌┴┐
D1 │ │ (续流二极管 1N4148)
└┬┘
│
├── RELAY(继电器线圈)
│
┌┴┐
│ │ Collector
┌─┴─┐
│NPN│ (如 S8050)
│ │
└─┬─┘
│ Emitter
│
GPIO ─R1── Base
│
R2 = 10kΩ
│
GNDplaintext工作原理:
- GPIO 高电平 → NPN 饱和导通 → 线圈通电 → 触点吸合 → 负载接通
- GPIO 低电平 → NPN 截止 → 线圈断电 → 触点弹开 → 负载断开
续流二极管 D1 的作用:与蜂鸣器完全一样——继电器线圈是电感,断电时会产生高压尖峰,D1 提供续流通路保护三极管。
7.5.3 MOS 管驱动#
对于线圈电流较大(>100mA)的继电器,用 N-MOS 替代 NPN 更合适:
VCC
│
RELAY
│
┌┴┐ D1
└┬┘
│
Drain
┌───┴───┐
GPIO ─Rg─│ N-MOS │ (如 AO3400)
│ │
└───┬───┘
│ Source
GNDplaintext7.5.4 光耦隔离(强电/弱电隔离)#
当继电器控制的是 220V 交流电时,为了安全,应该在 MCU 和继电器之间加一层电气隔离——使用光耦合器(Optocoupler)。
光耦继电器的原理:
MCU 侧(弱电) 继电器侧(强电)
┌──────────────┐ ┌──────────────────┐
│ │ │ │
│ GPIO ──R──┐ │ 光 │ ┌──→ [光敏三极管]│──→ [NPN/MOS] ──→ [继电器线圈]
│ │ │ 耦 │ │ │
│ [LED]│ ═══════ │ │ │
│ │ │ │ └────────────────┘
│ GND│ │ GND_RELAY
└──────────────┘ └──────────────────┘
GND_MCU GND_RELAY(两个 GND 不连!)plaintext核心思想:MCU 驱动光耦内部的 LED 发光 → 光耦另一侧的光敏三极管接收到光 → 导通 → 驱动继电器。两侧只有光的联系,没有电气连接,即使继电器侧出了 220V 故障,也不会烧到 MCU。
常见光耦芯片:PC817、EL357、TLP281
💡 什么时候必须用光耦隔离?
- 控制 220V 交流负载
- 医疗设备(人体安全)
- 工业环境(强电磁干扰)
- 任何”弱电(MCU)控强电”的场景
7.6 显示接口#
7.6.1 段码 LCD(HT1621)#
段码 LCD 是最简单的显示方案——只能显示固定的数字和符号(像计算器、电子秤那种),不能显示任意图形。
驱动方式:
- GPIO 直驱:适合极简单的显示(几个数字),但占用大量 GPIO
- 专用驱动芯片 HT1621:通过 3 线接口(CS、WR、DATA)驱动整块 LCD,大大节省 GPIO
7.6.2 数码管(7 段 LED 显示)#
数码管由 7 段 LED(加一个小数点共 8 段)组成,能显示 0~9 和部分字母。
GPIO + 限流电阻直驱:
每段 LED 各串一个限流电阻,8 段需要 8 个 GPIO。适合只驱动 1 位数码管的简单场景。
74HC595 移位寄存器驱动:
当你想驱动多位数码管但 GPIO 不够用时,74HC595 是神器:
MCU 74HC595
GPIO_DATA ────────── DS(串行数据输入)
GPIO_CLK ────────── SH_CP(移位时钟)
GPIO_LATCH ───────── ST_CP(锁存时钟)
│
Q0~Q7(8 位并行输出)
│
┌┴─┐ ┌┴─┐ ┌┴─┐ ┌┴─┐ ┌┴─┐ ┌┴─┐ ┌┴─┐ ┌┴─┐
│R │ │R │ │R │ │R │ │R │ │R │ │R │ │R │ (限流电阻)
└┬─┘ └┬─┘ └┬─┘ └┬─┘ └┬─┘ └┬─┘ └┬─┘ └┬─┘
│ │ │ │ │ │ │ │
┌┴────┴────┴────┴────┴────┴────┴────┴─┐
│ 7 段数码管 │
└─────────────────────────────────────┘plaintext74HC595 的核心能力:把串行输入(一位一位送数据)变成并行输出(同时控制 8 个引脚),只需要 3 个 GPIO 就能控制 8 个 LED。
而且多片 74HC595 可以级联——第一片的 Q7’(串行输出)接到第二片的 DS,仍然只用 3 个 GPIO 就能控制 16、24、32……个 LED。
工作时序:
- 在 DS 引脚放入 1 位数据
- SH_CP 上升沿 → 数据移入移位寄存器
- 重复 8 次,送完 8 位数据
- ST_CP 上升沿 → 移位寄存器的数据一次性锁存到输出引脚
💡 为什么需要锁存? 如果直接输出,在移位过程中 LED 会闪烁(因为数据在逐位移入)。锁存机制让你可以”偷偷”把数据准备好,然后一次性更新显示,避免闪烁。
7.6.3 点阵 OLED(SSD1306)#
OLED 显示屏是嵌入式项目中最受欢迎的显示方案——自发光、高对比度、超薄、低功耗。
最经典的 OLED 模块:0.96 英寸、128×64 像素、驱动芯片 SSD1306。
两种接口版本:
| 接口 | 引脚数 | 速度 | 接线 |
|---|---|---|---|
| I²C | 4 针(VCC/GND/SCL/SDA) | 慢(~400kbps) | 最简单 |
| SPI | 7 针(VCC/GND/SCK/MOSI/CS/DC/RST) | 快(~10Mbps) | 刷新更流畅 |
I²C 版本连接:
OLED 模块 MCU
VCC ───────────── 3.3V
GND ───────────── GND
SCL ───────────── I²C SCL(加上拉电阻 4.7kΩ)
SDA ───────────── I²C SDA(加上拉电阻 4.7kΩ)plaintextSSD1306 内部结构:
- 内置 GDDRAM(显存):128×64 bit
- MCU 只需往显存写数据,SSD1306 自动刷新屏幕
- 支持多种寻址模式(页模式、水平模式、垂直模式)
💡 实际经验:如果项目只是显示文字、数字、简单图标,I²C 版本完全够用(刷新速度约 10~30fps)。如果需要流畅动画,建议用 SPI 版本(刷新速度可达 60fps+)。
7.6.4 TFT LCD(SPI / 8080 并口)#
如果需要彩色显示(图片、GUI 界面),就需要 TFT LCD。
常见 TFT LCD 驱动芯片:
| 芯片 | 分辨率 | 颜色 | 接口 | 典型尺寸 |
|---|---|---|---|---|
| ST7735 | 128×160 | 65K 色 | SPI | 1.8” |
| ST7789 | 240×240 / 240×320 | 65K 色 | SPI | 1.3”~2.0” |
| ILI9341 | 240×320 | 65K 色 | SPI / 8080 并口 | 2.4”~2.8” |
| ILI9488 | 320×480 | 65K 色 | SPI / 8080 并口 | 3.5” |
SPI 接口连接(以 ST7789 为例):
TFT LCD MCU
VCC ────────────── 3.3V / 5V
GND ────────────── GND
SCL (SCK) ──────── SPI SCK
SDA (MOSI) ──────── SPI MOSI
CS ─────────────── GPIO(片选)
DC (RS) ────────── GPIO(数据/命令选择)
RST ────────────── GPIO(复位)
BLK ────────────── GPIO 或 PWM(背光控制)plaintext⚠️ 注意:SPI 接口的 TFT LCD 只有 MOSI(写),没有 MISO(读),所以是单向通信——MCU 只能往屏幕写数据,不能读回屏幕内容。这意味着如果你要做局部刷新,需要自己在 MCU 内存中维护一块”帧缓冲区”(Framebuffer)。
7.7 音频输出#
7.7.1 音频信号链概述#
从 MCU 到喇叭,音频信号要经过一条完整的”链”:
数字音频数据 ──→ DAC ──→ 运放(信号调理)──→ 功放 ──→ 喇叭
(MCU) (数→模) (放大、滤波) (功率放大) (发声)plaintext三个关键环节:
| 环节 | 作用 | 典型芯片/方案 |
|---|---|---|
| DAC | 数字信号 → 模拟电压 | MCU 内置 DAC、MCP4725、I²S |
| 运放 | 信号放大、滤波、偏置调整 | LMV321、OPA1678 |
| 功放 | 提供足够功率驱动喇叭 | LM386、PAM8403、MAX98357 |
7.7.2 I²S 数字功放(MAX98357)#
最简洁的音频输出方案:MCU 通过 I²S 接口直接输出数字音频 → MAX98357 内置 DAC + D 类功放 → 直接驱动喇叭。
MCU MAX98357 喇叭
┌─────────┐ ┌─────────────┐ ┌─────────┐
│ │ I²S │ │ │ │
│ I2S_BCK├──────────────┤BCK │ │ │
│ I2S_WS ├──────────────┤LRC (WS) │ OUT+ ───┤ + │
│ I2S_DOUT├─────────────┤DIN │ OUT- ───┤ - │
│ │ │ │ │ │
│ GND ├─── GND ──────┤GND │ └─────────┘
└─────────┘ │VIN ── 5V │
└─────────────┘plaintextMAX98357 的核心优势:
| 特性 | 参数 |
|---|---|
| 输入接口 | I²S / PCM 数字音频 |
| 内置 DAC | ✅ 无需外部 DAC 芯片 |
| 功放类型 | D 类(效率 > 90%) |
| 输出功率 | 3.2W(5V,4Ω 负载) |
| 供电电压 | 2.5V ~ 5.5V |
| THD+N | 低至 0.013% |
| 采样率 | 8kHz ~ 96kHz |
| 增益设置 | 3/6/9/12/15 dB(通过 GAIN 引脚配置) |
💡 为什么推荐 MAX98357? 传统方案需要 DAC 芯片 + 运放 + 功放芯片,三个芯片 + 一堆被动元件。MAX98357 把这三步全集成在一个 3mm×3mm 的小芯片里,外面几乎不用加什么元件,5V 供电直接驱动小喇叭。在 ESP32 + MAX98357 的组合下,几块钱就能做出蓝牙音箱。
I²S 协议简介:
I²S(Inter-IC Sound)是专为数字音频传输设计的协议,只有 3 根线:
| 信号 | 作用 |
|---|---|
| BCK(Bit Clock) | 位时钟,每个上升沿/下降沿传输 1 bit 数据 |
| LRC(Left/Right Clock,也叫 WS) | 左右声道选择时钟,高=左声道,低=右声道 |
| DOUT(Serial Data) | 串行音频数据 |
7.7.3 喇叭阻抗匹配#
喇叭的阻抗通常为 4Ω 或 8Ω。选择功放时要注意:
- 阻抗越低:功放输出电流越大 → 功率越大 → 但功放发热也越大
- 阻抗越高:功率越小 → 但失真更小、功放更轻松
功率估算:
例如 MAX98357,5V 供电,4Ω 喇叭:
⚠️ 实际注意:不要把 4Ω 喇叭接到只支持 8Ω 的功放上——可能过流烧毁。反之,8Ω 喇叭接到支持 4Ω 的功放完全 OK(只是功率小一些)。
7.8 DAC(数模转换器)#
7.8.1 DAC 是什么?#
DAC(Digital-to-Analog Converter)是 ADC 的”反向”——把数字值转换成模拟电压。
MCU 数字值(如 2048)──→ DAC ──→ 模拟电压(如 1.65V)plaintext核心公式:
其中
分辨率与输出范围:
| DAC 位数 | 级数 | 3.3V 参考下 1 LSB |
|---|---|---|
| 8 bit | 256 | 12.9 mV |
| 10 bit | 1024 | 3.2 mV |
| 12 bit | 4096 | 0.8 mV |
| 16 bit | 65536 | 0.05 mV |
7.8.2 MCU 内置 DAC#
一些中高端 MCU(如 STM32F4/F7/H7、ESP32)内置了 DAC:
- STM32F103:❌ 无内置 DAC
- STM32F407:✅ 12 位 DAC,2 通道
- ESP32:✅ 8 位 DAC,2 通道(GPIO25、GPIO26)
内置 DAC 使用简单——往寄存器写数字值,引脚就输出对应电压。但内置 DAC 通常分辨率不高、输出阻抗较大,驱动低阻抗负载时需要加运放 Buffer。
7.8.3 PWM 模拟 DAC(低成本方案)#
如 7.1.4 节所述,PWM + RC 低通滤波器可以”凑合”当 DAC 用:
PWM ──── R (4.7kΩ) ────┬──── V_out
│
┌─┴─┐
│ │ C (1μF)
└─┬─┘
│
GNDplaintext| 优势 | 劣势 |
|---|---|
| 零成本 | 纹波大(几十 mV) |
| 任何 MCU 都能用 | 精度差(依赖 VCC 稳定性) |
| 建立时间长(RC 充放电慢) | |
| 输出阻抗高 |
💡 什么时候可以用 PWM 模拟 DAC? 控制 LED 亮度、电机速度这种对精度要求不高的场景。如果需要给传感器提供精密参考电压、做信号发生器——不行,必须上真 DAC。
7.8.4 专用 DAC 芯片#
MCP4725(Microchip)—— 最经典的 I²C DAC#
| 参数 | 值 |
|---|---|
| 分辨率 | 12 位 |
| 输出通道 | 1 路 |
| 接口 | I²C(地址可配置) |
| 参考电压 | 使用 VCC(2.7V~5.5V) |
| 输出范围 | 0V ~ VCC |
| 建立时间 | 6μs |
| 内置 EEPROM | ✅ 可保存上电默认值 |
| 封装 | SOT-23-6 |
| 价格 | ≈ 2~3 元 |
典型连接:
MCP4725 MCU
VDD ─────────── 3.3V
GND ─────────── GND
SDA ─────────── I²C SDA(+上拉 4.7kΩ)
SCL ─────────── I²C SCL(+上拉 4.7kΩ)
VOUT ────────── 模拟输出(到运放 Buffer / 负载)plaintext代码示例(伪代码):
// 输出 1.65V(假设 VCC = 3.3V)
uint16_t dac_value = 2048; // 2048 / 4096 × 3.3V = 1.65V
I2C_Write(MCP4725_ADDR, dac_value);cDAC8568(TI)—— 高精度多通道 DAC#
| 参数 | 值 |
|---|---|
| 分辨率 | 16 位 |
| 输出通道 | 8 路 |
| 接口 | SPI |
| 参考电压 | 内置 2.5V 精密基准 |
| INL | ±4 LSB(高精度) |
| 应用 | 精密仪器、多路可编程电压源 |
7.8.5 输出 Buffer#
DAC 芯片的输出阻抗通常不低(几百Ω到几 kΩ),如果直接接低阻抗负载(如喇叭、长线缆),输出电压会被”拉低”,导致精度丧失。
解决方案:在 DAC 输出端加一个电压跟随器(运放 Buffer):
DAC VOUT ──→ [运放 Buffer] ──→ 负载
(增益 = 1)
输入阻抗极高
输出阻抗极低plaintext📌 关于运放 Buffer 的详细电路,请参考第 3 章 3.3 节。
本章小结#
| 输出类型 | 核心电路 | 关键注意事项 |
|---|---|---|
| PWM | MCU 定时器输出方波 | 频率要匹配负载特性 |
| LED 驱动 | 限流电阻 / MOS 管 + PWM 调光 | 大电流必须用 MOS 管,PWM 调光优于模拟调光 |
| 蜂鸣器 | NPN/N-MOS + 续流二极管 | 区分有源/无源,续流二极管必须加 |
| 直流电机 | H 桥驱动芯片(DRV8833) | PWM 调速,注意死区保护 |
| 步进电机 | 专用驱动(A4988、TMC2208) | STEP + DIR 控制,细分提高精度 |
| 继电器 | NPN/MOS + 续流二极管 + 光耦 | 强电场景必须光耦隔离 |
| OLED 显示 | SSD1306(I²C / SPI) | I²C 简单但慢,SPI 流畅但多线 |
| TFT 显示 | ST7789 / ILI9341(SPI) | 需要帧缓冲区,背光控制 |
| 音频输出 | I²S + MAX98357 | 全数字链路,无需外部 DAC |
| DAC | MCP4725(I²C)/ PWM 模拟 | 精密场景用真 DAC,加输出 Buffer |
一句话总结:输出电路的核心就是——MCU 的小信号(3.3V/20mA)通过各种”放大器”(三极管、MOS 管、驱动芯片、功放)去控制大功率负载(12V/几安培),同时做好保护(续流二极管、光耦隔离)。理解了这个”以小控大”的本质,所有输出电路就都通了。
参考资料与推荐阅读#
- DRV8833 数据手册(TI)—— 双 H 桥电机驱动经典方案
- A4988 数据手册(Allegro)—— 步进电机微步驱动标杆
- MAX98357A/B 数据手册(Maxim/ADI)—— I²S D 类数字功放
- MCP4725 数据手册(Microchip)—— I²C 12 位 DAC
- SSD1306 数据手册(Solomon Systech)—— OLED 显示驱动
- 74HC595 数据手册(NXP/TI)—— 串入并出移位寄存器
- PWM 调光原理与 LED 色温关系 —— LED 调光技术深度分析
搜索到的参考图片资源(供学习参考,非直接使用):
| 主题 | 来源 URL | 说明 |
|---|---|---|
| PWM 原理与占空比 | https://www.cnblogs.com/znlgis/p/19850147 | PWM 脉宽调制技术详解,含波形图 |
| PWM 原理与应用 | https://www.elecfans.com/zt/161613/ | 电子发烧友 PWM 专题,含计算公式 |
| PWM 核心原理 | https://m.21ic.com/a/1006869.html | 21IC PWM 技术基本原理与核心特性 |
| MOS 管 PWM 调光 | https://www.elecfans.com/zt/1893315/ | MOS 管实现 PWM 调制的完整方案 |
| LED 恒流驱动 | https://download.csdn.net/blog/column/9691137/133133454 | FP6755 恒流驱动方案详解 |
| PWM 调光原理 | http://www.kiaic.com/article/detail/5872.html | MOS 管 PWM 调光原理图 |
| MOS 管 LED 驱动 | https://baijiahao.baidu.com/s?id=1843048562502494483 | 运放+MOS 管恒流 LED 驱动 |
| 蜂鸣器驱动电路 | https://baijiahao.baidu.com/s?id=1833179476656027530 | 五种蜂鸣器驱动电路深度解析 |
| 蜂鸣器续流二极管 | https://m.elecfans.com/article/2082206.html | 蜂鸣器驱动电路 + 续流二极管详解 |
| 有源/无源蜂鸣器 | https://juejin.cn/post/7529721219961913359 | 有源无源蜂鸣器区别及 STM32 驱动 |
| H 桥原理 | https://wapbaike.baidu.com/view/2009952.htm | 百度百科 H 桥电路原理 |
| DRV8833 资料 | https://www.elecfans.com/zt/24800/ | DRV8833 中文技术资料 |
| A4988 步进驱动 | https://m.bilibili.com/opus/1166227218813157378 | A4988 驱动步进电机教学 |
| 步进电机细分驱动 | https://baike.sogou.com/m/fullLemma?fid=167355899 | 步进电机细分驱动技术百科 |
| 继电器光耦隔离 | https://baijiahao.baidu.com/s?id=1834566473241964453 | 三种继电器电路:NPN 达灵顿、晶体管、光耦 |
| 光耦继电器 NPN | https://m.elecfans.com/article/3283730.html | 光耦继电器 NPN 接法详解 |
| 续流二极管原理 | https://bkso.baidu.com/item/续流二极管/6064621 | 百度百科续流二极管 |
| SSD1306 OLED | https://www.elecfans.com/zt/26215/ | SSD1306 OLED 驱动芯片详解 |
| SSD1306 SPI 驱动 | https://wenku.csdn.net/doc/8be7g8bn6q | ESP32 + SSD1306 SPI 驱动实现 |
| 74HC595 原理 | https://www.elecfans.com/zt/7961/ | 74HC595 工作原理真值表 |
| 74HC595 驱动数码管 | https://www.52pojie.cn/thread-2004516-1-1.html | 双 74HC595 驱动 8 位数码管 |
| MCP4725 DAC | https://handsome-man.blog.csdn.net/article/details/157738372 | MCP4725 I²C DAC 模块原理图 |
| MAX98357 I²S 功放 | https://www.elecfans.com/zt/19447/ | MAX98357 中文资料 |
| MAX98357 + ESP32 | https://www.cnblogs.com/FBsharl/p/18336848 | ESP32 + MAX98357 播放 MP3 |
| DAC 原理 | https://www.eepw.com.cn/zhuanlan/202607/397313.html | 数模转换器转换过程分析 |