ESP32-S3 MP3(NS4168)

本篇文章使用 ESP32-S3 搭配 NS4168 音频放大器芯片来 DIY 一个 MP3 播放器。

NS4168 最大的特点是内置了数模转换器(DAC),可以直接接收来自 ESP32-S3 的数字音频信号(I2S 格式)并进行放大,无需外接其他解码芯片。它的工作电压范围是 3V 到 5.5V,可以提供最高 2.5W 的输出功率,直接驱动一个小喇叭就足够了。

点击 牛瘪汤 主页可以了解更多。


提示: NS4168 仅仅支持单喇叭。如果想要接入耳机或喇叭,就需要更新 codec 芯片。


1. 产看 NS4168 原理图

原理图是基于 NS4168 芯片的音频放大电路。NS4168 是一款集成了 I2S 数字音频接口的单声道 D 类(Class-D)音频功率放大器。
ns4168

1.1 NS4168 供电电路分析 (Power Supply)

供电部分主要涉及芯片的能量来源以及电压稳定性处理:

  • VDD (Pin 6): 芯片的主供电引脚。图中通过网络标签 SYS 接入系统电源。
  • 去耦/滤波电容:SYS 电源与地(GND)之间并联了两个电容:
    • C65 (10uF): 较大的电解或陶瓷电容,主要用于滤除低频噪声,并在瞬态大电流(如低音爆发)时提供能量缓冲。
    • C66 (100uF): 这里的标注可能存在位号/容值反转或特定设计考量(通常大电容在前,小电容滤高频)。这两个电容共同作用,确保 VDD 的电压稳定,防止音频开关噪声通过电源线干扰其他电路。
  • GND & EP (Pin 7 & Pin 9): * Pin 7 (GND): 信号地。
    • Pin 9 (EP): 底部散热焊盘(Exposed Pad),通常连接到大面积的地平面(GND),既起到电气接地作用,也是芯片 D 类放大散热的关键。

1.2 I2S 数据接口分析 (I2S Interface)

NS4168 直接接收数字信号,无需外部 DAC,其 I2S 接口定义如下:

  • LRCLK (Pin 2 - Left/Right Clock): 帧时钟(也称信号选择 WCLK)。用于切换左右声道。虽然 NS4168 是单声道放大器,但它仍需要根据此信号提取特定声道的数字音频数据。
  • BCLK (Pin 3 - Bit Clock): 位时钟(也称串行时钟 SCLK)。每一个时钟周期对应数字音频信号的一位数据。
  • SDATA (Pin 4 - Serial Data): 串行音频数据输入。包含原始的数字音频 PCM 信号。
  • 工作机制: 芯片内部集成了数字解调和 DAC 功能,直接将输入的 I2S 数字流转换为高频 PWM 信号,驱动功率级输出。

1.3 控制与输出信号 (Control & Output)

  • CTRL (Pin 1 - Control/Mute): * 该引脚通过 R55 (10kΩ) 电阻上拉至 3V3

    • NS4168_CTRL 标签通常连接到 MCU 的 GPIO。
    • 原理: 该引脚用于控制芯片的状态(如工作、待机或静音)。根据 R55 的接法,默认状态下芯片处于高电平(可能是开启状态,具体取决于手册),MCU 可以通过拉低该引脚实现快速静音,防止开机“砰”声(Pop noise)。
  • 输出信号 (VOP / VON):

    • VOP (Pin 8 - Voice Out Positive)VON (Pin 5 - Voice Out Negative) 构成了 BTL (Bridge-Tied Load) 输出。
    • 差分输出结构可以直接驱动扬声器,无需大体积的隔直电容,且能提供更大的输出功率。
    • 信号连接至 SPK (HC-1.25-2PWT) 接口,驱动外部喇叭。

2. 编写 NS4168 播放音频

由于使用 ESP32 配合 LVGL 9.5 开发 MP3 播放器,针对 NS4168(I2S 功放)和 SD 卡(SPI 或 SDMMC 模式)的典型实现方式是使用 ESP32-audioI2S 库。这个库非常成熟,支持硬件解码和 I2S 驱动。

2.1 原理解析:从 SD 到 NS4168

  1. 数据读取 (File I/O): ESP32 通过 SPI 或 SDMMC 协议从 SD 卡(FAT32 文件系统)读取 MP3 二进制流。
  2. 软件解码 (Codec): ESP32 的双核 CPU 之一(通常是 Core 1)负责运行 Helix 或 MAD 解码算法,将压缩的 MP3 数据还原为 PCM (脉冲编码调制) 信号。
  3. DMA 传输: 解码后的 PCM 数据通过 DMA (直接存储器访问) 通道发送到 I2S 控制器,这样可以保证播放流畅而不占用 CPU 等待时间。
  4. 数字功放 (NS4168): NS4168 接收到符合 I2S 时序的比特流,内部进行数字处理并驱动 BTL 输出给扬声器。

2.2 放音示例 (MP3)

接下来是实现 ESP32S3 MP3的核心代码逻辑和配置说明:

2.2.1 硬件引脚定义

根据之前原理图,我们需要在代码中映射正确的 I2S 和 SD 卡引脚。

#include "Arduino.h"
#include "Audio.h"
#include "SPI.h"
#include "SD.h"
#include "FS.h"

// ---- NS4168 I2S 引脚配置 ----
#define I2S_DOUT      25  // 对应 NS4168_SD
#define I2S_BCLK      26  // 对应 NS4168_SCLK
#define I2S_LRCK      27  // 对应 NS4168_LRCK

// ---- SD卡 SPI 引脚配置 (请根据实际 PCB 修改) ----
#define SD_CS         5
#define SPI_MOSI      23
#define SPI_MISO      19
#define SPI_SCK       18

Audio audio; 

2.2.2 MP3 功能核心代码

void setup() {
    Serial.begin(115200);

    // 1. 初始化 SD 卡
    pinMode(SD_CS, OUTPUT);
    digitalWrite(SD_CS, HIGH);
    SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
    
    if (!SD.begin(SD_CS)) {
        Serial.println("SD 卡挂载失败!");
        return;
    }

    // 2. 配置 NS4168 音频输出
    audio.setPinout(I2S_BCLK, I2S_LRCK, I2S_DOUT);
    audio.setVolume(12); // 设置音量 (0~21)

    // 3. 从 SD 卡读取文件
    // 假设文件名为 music.mp3
    audio.connecttoFS(SD, "/music.mp3"); 
}

void loop() {
    // 必须在 loop 中持续调用,用于填充 I2S 缓冲区
    audio.loop(); 

    // 可以在此处添加 LVGL 的事件处理逻辑
}

// ---- 可选:音频状态回调 ----
void audio_info(const char *info){
    Serial.print("音频信息: "); Serial.println(info);
}

关键注意事项

  • NS4168_CTRL 引脚: 别忘了在 setup() 中将连接到 NS4168 引脚 1 的 GPIO 设置为高电平(如果是上拉使能),否则功放可能处于静音或关断状态。
  • 内存平衡: 如果你同时运行 LVGL 9.5,建议将音频解码任务固定在与 LVGL 不同的核心上,防止 UI 刷新时导致音频卡顿。
  • 库安装: 在 Arduino IDE 的库管理器中搜索并安装 ESP32-audioI2S (由 Wolle 开发)。

结语

文章都看到完了,就不点个关注吗,老铁!
欢迎关注博主–牛瘪汤

更多推荐