知识门户

返回

第 7 章 输出电路:信号怎么出去

views | comments

本章核心问题: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.475V
plaintext

💡 类比:想象你在淋浴——如果你开水龙头 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 的应用极其广泛,几乎贯穿了整本”输出电路”:

  1. LED 调光(7.2 节详述)
  2. 电机调速(7.4 节详述)
  3. PWM 模拟 DAC(7.8 节详述)
  4. 开关电源控制(第 4 章 DC-DC)
  5. 舵机角度控制

7.1.4 PWM + RC 低通 → 模拟电压(简易 DAC)#

这是 PWM 最”黑客”的用法之一——把数字方波变成真正的模拟直流电压!

MCU PWM ──── R (1kΩ~10kΩ) ────┬──── V_out(模拟电压)

                             ┌─┴─┐
                             │   │ C (1μF~10μF)
                             └─┬─┘

                              GND
plaintext

原理: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 ──── GND
plaintext

限流电阻计算

其中:

  • = GPIO 输出高电平电压(通常 3.3V 或 5V)
  • = LED 正向压降(见下表)
  • = LED 工作电流(通常 5~20mA)

常见 LED 正向压降

LED 颜色典型 波长范围
红外1.2~1.5V850~940nm
红色1.8~2.2V620~630nm
黄色/橙色2.0~2.2V585~605nm
绿色2.0~3.5V520~530nm
蓝色2.8~3.5V460~470nm
白色2.8~3.5V全光谱

计算示例:驱动一个红色 LED( = 2.0V, = 10mA),GPIO = 3.3V:

⚠️ GPIO 驱动能力有限! 大多数 MCU 单个 GPIO 最大灌/拉电流为 20~25mA。如果要驱动大功率 LED(>20mA),必须用三极管或 MOS 管来”放大”驱动能力。

7.2.2 MOS 管驱动(大电流 LED)#

当 LED 电流超过 GPIO 能力时(比如 1W 大功率 LED,电流 350mA),必须用 MOS 管做开关:

工作原理

  • 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_sense
plaintext

7.3 蜂鸣器驱动#

7.3.1 有源蜂鸣器 vs 无源蜂鸣器#

蜂鸣器是嵌入式系统中最常用的发声元件。但很多人搞不清”有源”和”无源”的区别:

特性有源蜂鸣器无源蜂鸣器
内部结构内置振荡电路只有压电/电磁振动片
驱动方式加直流电压就响必须输入方波(2~5kHz)
声音固定频率(通常是”滴——“)频率由输入方波决定
能否播音乐❌ 不能(只有一种音调)✅ 能(改变频率=改变音调)
控制复杂度⭐ 极简(GPIO 高低电平)⭐⭐ 需定时器产生方波
价格略贵(内部多了电路)便宜
外观区分通常较高(9mm),有+号标记通常较矮(8mm),无+号

⚠️ 最常见的错误:把有源蜂鸣器当无源用(给方波不响),或把无源蜂鸣器当有源用(给直流电压只”咔”一声就不响了)。先搞清楚你手里的是哪种!

7.3.2 NPN 三极管驱动电路#

MCU 的 GPIO 驱动能力有限(通常 ≤ 25mA),而蜂鸣器工作电流往往在 30~80mA,所以需要用三极管或 MOS 管来驱动:

有源蜂鸣器驱动(NPN 低侧驱动)

各元件作用

  • R1(基极限流电阻):限制 GPIO 输出的基极电流。。三极管放大倍数 β ≈ 100200,可驱动 260520mA 的负载电流,绰绰有余。
  • R2(下拉电阻):保证 GPIO 悬空/复位时三极管可靠截止,蜂鸣器不叫。
  • D1(续流二极管)这是最重要的保护元件!

7.3.3 续流二极管:感性负载必须加#

为什么蜂鸣器需要续流二极管?

蜂鸣器内部有一个电磁线圈,本质是一个电感。电感的特性是电流不能突变。当三极管突然截止(断开)时:

  1. 线圈中的电流突然被切断
  2. 根据楞次定律,电感会产生一个反向高压尖峰(可达几十伏甚至上百伏!)
  3. 这个高压直接加在三极管的 C-E 极之间
  4. 结果:三极管被击穿损坏,或者产生强电磁干扰影响其他电路

续流二极管的作用

正常工作时: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
           GND
plaintext

MOS 管的优点:导通电阻极低(几十 mΩ),几乎没有导通损耗;栅极驱动只需电压,不消耗稳态电流。

无源蜂鸣器的驱动电路与有源完全一样,区别只在于软件——你需要用 PWM(定时器)输出 2kHz~5kHz 的方波,改变频率就能改变音调,从而实现播放简单旋律。

// 无源蜂鸣器播放"滴"声(伪代码)
PWM_SetFrequency(2700);   // 设置 PWM 频率 2700Hz
PWM_SetDutyCycle(50);     // 50% 占空比,声音最大
Delay_ms(200);            // 响 200ms
PWM_SetDutyCycle(0);      // 静音
Delay_ms(100);            // 停 100ms
c

7.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           GND
plaintext

四种控制状态

Q1Q2Q3Q4电机状态电流方向
ONONOFFOFF正转VCC → Q1 → 电机 → Q2 → GND
OFFOFFONON反转VCC → Q3 → 电机 → Q4 → GND
ONOFFONOFF刹车电机两端都接 VCC,快速停止
OFFOFFOFFOFF滑行电机自由旋转,慢慢停下

⚠️ 绝对禁止: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 典型连接

7.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°)细分为多个微步:

细分模式每圈步数步距角
全步2001.8°
半步4000.9°
1/4 步8000.45°
1/8 步16000.225°
1/16 步32000.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 RPM
plaintext

7.4.4 续流二极管 / TVS 保护#

电机是典型的感性负载,开关瞬间会产生高压尖峰。集成驱动芯片(如 DRV8833、A4988)内部已经集成了续流二极管,外部不需要再加。

但如果你用分立 MOS 管搭 H 桥,就必须在每个 MOS 管旁边加续流二极管(或用 TVS 管钳位):

         VCC

    D1 ──┤── D3
    ↑    │    ↑
    │    ├─Motor─┤
    ↓    │    ↓
    D2 ──┤── D4

         GND
plaintext

四个二极管组成”桥式续流”网络,无论电流方向如何,都能为断电瞬间的感应电动势提供释放路径。


7.5 继电器驱动#

7.5.1 继电器是什么?#

继电器是一种用电信号控制机械开关的元件。它让你能用 MCU 的 3.3V / 5mA 信号去控制 220V / 10A 的大功率设备(灯、加热器、水泵等),实现”以小控大”。

MCU GPIO ──→ [驱动电路] ──→ [继电器线圈] ──→ [触点开关] ──→ 大功率负载
   3.3V                        5V/12V           220V/10A
plaintext

7.5.2 NPN 三极管驱动#

工作原理

  • GPIO 高电平 → NPN 饱和导通 → 线圈通电 → 触点吸合 → 负载接通
  • GPIO 低电平 → NPN 截止 → 线圈断电 → 触点弹开 → 负载断开

续流二极管 D1 的作用:与蜂鸣器完全一样——继电器线圈是电感,断电时会产生高压尖峰,D1 提供续流通路保护三极管。

7.5.3 MOS 管驱动#

对于线圈电流较大(>100mA)的继电器,用 N-MOS 替代 NPN 更合适:

              VCC

              RELAY

              ┌┴┐ D1
              └┬┘

              Drain
           ┌───┴───┐
  GPIO ─Rg─│ N-MOS │  (如 AO3400)
           │       │
           └───┬───┘
               │ Source
              GND
plaintext

7.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 段数码管                   │
                    └─────────────────────────────────────┘
plaintext

74HC595 的核心能力:把串行输入(一位一位送数据)变成并行输出(同时控制 8 个引脚),只需要 3 个 GPIO 就能控制 8 个 LED。

而且多片 74HC595 可以级联——第一片的 Q7’(串行输出)接到第二片的 DS,仍然只用 3 个 GPIO 就能控制 16、24、32……个 LED。

工作时序

  1. 在 DS 引脚放入 1 位数据
  2. SH_CP 上升沿 → 数据移入移位寄存器
  3. 重复 8 次,送完 8 位数据
  4. ST_CP 上升沿 → 移位寄存器的数据一次性锁存到输出引脚

💡 为什么需要锁存? 如果直接输出,在移位过程中 LED 会闪烁(因为数据在逐位移入)。锁存机制让你可以”偷偷”把数据准备好,然后一次性更新显示,避免闪烁。

7.6.3 点阵 OLED(SSD1306)#

OLED 显示屏是嵌入式项目中最受欢迎的显示方案——自发光、高对比度、超薄、低功耗。

最经典的 OLED 模块:0.96 英寸、128×64 像素、驱动芯片 SSD1306

两种接口版本

接口引脚数速度接线
I²C4 针(VCC/GND/SCL/SDA)慢(~400kbps)最简单
SPI7 针(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Ω)
plaintext

SSD1306 内部结构

  • 内置 GDDRAM(显存):128×64 bit
  • MCU 只需往显存写数据,SSD1306 自动刷新屏幕
  • 支持多种寻址模式(页模式、水平模式、垂直模式)

💡 实际经验:如果项目只是显示文字、数字、简单图标,I²C 版本完全够用(刷新速度约 10~30fps)。如果需要流畅动画,建议用 SPI 版本(刷新速度可达 60fps+)。

7.6.4 TFT LCD(SPI / 8080 并口)#

如果需要彩色显示(图片、GUI 界面),就需要 TFT LCD。

常见 TFT LCD 驱动芯片

芯片分辨率颜色接口典型尺寸
ST7735128×16065K 色SPI1.8”
ST7789240×240 / 240×32065K 色SPI1.3”~2.0”
ILI9341240×32065K 色SPI / 8080 并口2.4”~2.8”
ILI9488320×48065K 色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    │
                         └─────────────┘
plaintext

MAX98357 的核心优势

特性参数
输入接口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Ω 喇叭:(与标称的 3.2W 吻合)

⚠️ 实际注意:不要把 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 位数, 是参考电压。

分辨率与输出范围

DAC 位数级数3.3V 参考下 1 LSB
8 bit25612.9 mV
10 bit10243.2 mV
12 bit40960.8 mV
16 bit655360.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)
                      └─┬─┘

                       GND
plaintext
优势劣势
零成本纹波大(几十 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);
c

DAC8568(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 节。


本章小结#

输出类型核心电路关键注意事项
PWMMCU 定时器输出方波频率要匹配负载特性
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
DACMCP4725(I²C)/ PWM 模拟精密场景用真 DAC,加输出 Buffer

一句话总结:输出电路的核心就是——MCU 的小信号(3.3V/20mA)通过各种”放大器”(三极管、MOS 管、驱动芯片、功放)去控制大功率负载(12V/几安培),同时做好保护(续流二极管、光耦隔离)。理解了这个”以小控大”的本质,所有输出电路就都通了。


参考资料与推荐阅读#

  1. DRV8833 数据手册(TI)—— 双 H 桥电机驱动经典方案
  2. A4988 数据手册(Allegro)—— 步进电机微步驱动标杆
  3. MAX98357A/B 数据手册(Maxim/ADI)—— I²S D 类数字功放
  4. MCP4725 数据手册(Microchip)—— I²C 12 位 DAC
  5. SSD1306 数据手册(Solomon Systech)—— OLED 显示驱动
  6. 74HC595 数据手册(NXP/TI)—— 串入并出移位寄存器
  7. PWM 调光原理与 LED 色温关系 —— LED 调光技术深度分析

搜索到的参考图片资源(供学习参考,非直接使用):

主题来源 URL说明
PWM 原理与占空比https://www.cnblogs.com/znlgis/p/19850147PWM 脉宽调制技术详解,含波形图
PWM 原理与应用https://www.elecfans.com/zt/161613/电子发烧友 PWM 专题,含计算公式
PWM 核心原理https://m.21ic.com/a/1006869.html21IC PWM 技术基本原理与核心特性
MOS 管 PWM 调光https://www.elecfans.com/zt/1893315/MOS 管实现 PWM 调制的完整方案
LED 恒流驱动https://download.csdn.net/blog/column/9691137/133133454FP6755 恒流驱动方案详解
PWM 调光原理http://www.kiaic.com/article/detail/5872.htmlMOS 管 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/1166227218813157378A4988 驱动步进电机教学
步进电机细分驱动https://baike.sogou.com/m/fullLemma?fid=167355899步进电机细分驱动技术百科
继电器光耦隔离https://baijiahao.baidu.com/s?id=1834566473241964453三种继电器电路:NPN 达灵顿、晶体管、光耦
光耦继电器 NPNhttps://m.elecfans.com/article/3283730.html光耦继电器 NPN 接法详解
续流二极管原理https://bkso.baidu.com/item/续流二极管/6064621百度百科续流二极管
SSD1306 OLEDhttps://www.elecfans.com/zt/26215/SSD1306 OLED 驱动芯片详解
SSD1306 SPI 驱动https://wenku.csdn.net/doc/8be7g8bn6qESP32 + SSD1306 SPI 驱动实现
74HC595 原理https://www.elecfans.com/zt/7961/74HC595 工作原理真值表
74HC595 驱动数码管https://www.52pojie.cn/thread-2004516-1-1.html双 74HC595 驱动 8 位数码管
MCP4725 DAChttps://handsome-man.blog.csdn.net/article/details/157738372MCP4725 I²C DAC 模块原理图
MAX98357 I²S 功放https://www.elecfans.com/zt/19447/MAX98357 中文资料
MAX98357 + ESP32https://www.cnblogs.com/FBsharl/p/18336848ESP32 + MAX98357 播放 MP3
DAC 原理https://www.eepw.com.cn/zhuanlan/202607/397313.html数模转换器转换过程分析
Comment seems to stuck. Try to refresh?✨