1. 产品简介
MAX98357 I2S功放模块是采用美信MAX98357 芯片开发的I2S数字D类功率放大器模块。与ESP32等具有I2S接口的主控相结合,可广泛用于物联网节点、智能家居设备、蓝牙音频播放器等项目。
本产品支持3.3V~5V供电。在5V供电、4Ω喇叭的状态下,具备2.5W以上的输出功率。并且,可通过修改SD端口电阻的方式设置多种模式:放大器关闭、输出左声道、输出右声道、输出混合声道。在产品上,默认设置为混合声道,并且引出了SD接口,可通过外接不同电阻的方式切换功能。
本产品体积小巧,邮票孔设计、可直插或者贴装在项目PCB上或面包板上。输出支持PH2.0喇叭接口与邮票孔两种连接方式,灵活方便。
2. 产品特性
- MAX98357 I2S数字式D类功放,功率>2.5W
- 3.3V~5V宽电压供电
- 声道可切换
- 增益大小可调节
- 邮票孔设计,可贴片与直插安装
- PH2.0与邮票孔两种喇叭连接方式
3. 应用场景
- 蓝牙音频播放器
- 物联网节点声音播放
- 智能家居语音交互
- 机器人设备语音播放
4. 引脚排列图
引脚 | 引脚功能 | 备注 |
---|---|---|
SPK- | 喇叭负极 | 喇叭参数:4Ω/8Ω <3W |
VCC | 电源输入 | DC 3.3V-5V |
GND | 接地 | |
NC | 空脚 | |
SD | 关闭功放,调节声道 | 详见4.1.2 SD模式(SD)说明 |
GAIN | 调节放大器增益 | 默认9dB 详见4.1.1 增益控制 (GAIN)说明 |
SPK+ | 喇叭正极 | 喇叭参数:4Ω/8Ω <3W |
DIN | 数字输入信号 | |
BCLK | 位时钟输入 | Bit Clock Input |
LRC | 帧时钟 | I2S和LJ模式的左/右时钟。TDM模式的同步时钟。 |
4.1 特殊引脚功能
4.1.1 增益控制 (GAIN)
- 如果GAIN和GND之间连接100K电阻,则为15dB
- 如果GAIN直接连接到GND,则为12dB
- 如果GAIN未连接到任何设备,则为9dB (默认状态)
- 如果GAIN直接连接到 VCC,则为 6dB
- 如果GAIN和VCC之间连接了100K电阻,则为3dB
4.1.2 SD模式(SD)
-
SD接GND(电压在0.16V以下),则放大器关闭
-
SD上的电压介于0.16V和0.77V之间,R1电阻为680K,则输出为混合声道(默认)
-
SD上的电压介于0.77V和1.4V之间,R1电阻为330K,则输出为右声道
-
SD上的电压高于1.4V,R1电阻为100K,则输出为左声道
5. 规格参数
模块参数
- 主芯片型号:MAX98357A
- 工作电压:DC 3.3V~5V
- 输出功率:8Ω 1.8W / 4Ω 2.5W (12db时)
- 输出通道:单通道
- 通讯接口:I2S接口
- 工作温度范围:-40℃+80℃
- 存储温度范围:-40℃+80℃
- 产品尺寸(不含包装):18mm × 18mm
芯片音频相关参数
-
VDD = 5V, VGND = 0V, GAIN_SLOT = VDD. BCLK = 3.072MHz, LRCLK = 48kHz
-
speaker loads (ZSPK) connected between OUTP and OUTN, ZSPK = J, TA = TMIN to TMAX
-
unless otherwise noted. Typical values are at TA = +25NC.
-
采样率:8kHz~96kHz
-
总谐波失真:
0.02% (f = 1kHz, POUT = 1W, TA = +25NC, ZSPK = 4I + 33FH, TQFN)
0.013%(f = 1kHz, POUT = 0.5W, TA = +25NC, ZSPK = 8I + 68FH)
-
动态范围:105DB (A-weighted, VRMS = 2.54V, 24- or 32-bit data)
-
输出噪音:25FVRMS (A-weighted, 24- or 32-bit data (Note 4))
-
增益(相对于2.1dBV参考水平):
GAIN_SLOT = GND through 100kΩ :最小14.4dB 典型15dB 最大15.6dB
GAIN_SLOT = GND:最小11.4dB 典型12dB 最大12.6dB
GAIN_SLOT = unconnected:最小8.4dB 典型9dB 最大9.6dB
GAIN_SLOT = VDD:最小5.4dB 典型6dB 最大6.6dB
GAIN_SLOT = VDD through 100kΩ:最小2.4dB 典型3dB 最大3.6dB
-
效率:92% (ZSPK = 8I + 68FH, THD+N = 10%, f = 1kHz, gain = 12dB)
-
DAC增益误差:1%
-
频率响应:±0.2dB
-
D类开关频率 :330kHz
-
扩频带宽 :±12.5kHz
6. 产品尺寸图
7. 使用教程
7.1 蓝牙播放音乐实验
7.1.1 硬件准备
- FireBeetle 2 ESP32-E主控板 (SKU:DFR0654) ×1
- 全频腔体喇叭(4Ω2W) (SKU:FIT0824)×1
- 带蓝牙功能的手机
- 杜邦线若干
7.1.2 软件准备
- 下载Arduino IDE: 点击下载Arduino IDE
- 安装SDK:点击进入FireBeetle 2 ESP32-E主控板 WIKI页面 查找SDK安装教程
- 下载Arduino库:点击下载I2S功放模块程序库 关于如何安装库文件: 如何加载库文件
7.1.3 硬件连接
管脚连接说明:
I2S功放模块:VCC引脚---(连接)---ESP32-E主控: 3V3;
I2S功放模块:GND引脚---(连接)---ESP32-E主控:GND;
I2S功放模块:LRC引脚---(连接)---ESP32-E主控: 26/D3;
I2S功放模块:BCLK引脚---(连接)---ESP32-E主控: 25/D2;
I2S功放模块:DIN引脚---(连接)---ESP32-E主控: 14/D6;
I2S功放模块:SPK+引脚---(连接)---喇叭:正极
I2S功放模块:SPK-引脚---(连接)---喇叭:负极
7.1.4 演示代码
程序功能:打开ESP32-E的蓝牙功能,创建名称为bluetoothAmplifier的蓝牙节点,用带蓝牙功能的手机连接bluetoothAmplifier节点来播放音乐。
#include <DFRobot_MAX98357A.h>
DFRobot_MAX98357A amplifier;
void setup(void)
{
Serial.begin(115200);//串口速率设置为115200
while( !amplifier.begin(/*btName=*/"bluetoothAmplifier", /*bclk=*/GPIO_NUM_25, /*lrclk=*/GPIO_NUM_26,/*din=*/GPIO_NUM_14) ){
Serial.println("Initialize failed !");//没有检测到I2S引脚信号,则初始化失败
delay(3000);
}
Serial.println("Initialize succeed!");//检测到I2S引脚信号,则初始化成功
}
void loop(void)
{
delay(3000);
}
7.1.5 实验过程
打开Arduino IDE,开发板选择为FireBeetle2 ESP32-E,上传速率设置为921600。
将代码拷贝到Arduino IDE上,编译烧录代码到FireBeetle2 ESP32-E里。
打开手机蓝牙功能,连接上bluetoothAmplifier节点,使用音乐播放器播放音乐。
7.2 SD卡播放音乐实验
7.2.1 硬件准备
- FireBeetle 2 ESP32-E主控板 (SKU:DFR0654) ×1
- 全频腔体喇叭(4Ω2W) (SKU:FIT0824)×1
- MicroSD Module (SKU:DFR0229) ×1
- 闪迪至尊高速移动microSD (SKU:FIT0394)×1
- 川宇C289 TF卡/MicroSD卡读卡器 (SKU:FIT0548)×1
- 杜邦线若干
7.2.2 软件准备
- 下载Arduino IDE: 点击下载Arduino IDE
- 安装SDK:点击进入FireBeetle 2 ESP32-E主控板 查找SDK安装教程
- 下载Arduino库:点击下载I2S功放模块程序库 关于如何安装库文件: 如何加载库文件
7.2.3 硬件连接
管脚连接说明:
I2S功放模块:VCC引脚---(连接)---ESP32-E主控: 3V3;
I2S功放模块:GND引脚---(连接)---ESP32-E主控:GND;
I2S功放模块:LRC引脚---(连接)---ESP32-E主控: 26/D3;
I2S功放模块:BCLK引脚---(连接)---ESP32-E主控: 25/D2;
I2S功放模块:DIN引脚---(连接)---ESP32-E主控: 14/D6;
SD卡模块:5V引脚---(连接)---ESP32-E主控板:VCC;
SD卡模块:GND引脚---(连接)---ESP32-E主控板: GND;
SD卡模块:MOSI引脚---(连接)---ESP32-E主控板:23/MOSI;
SD卡模块:SS引脚---(连接)---ESP32-E主控板:4/D12;
SD卡模块:SCK引脚---(连接)---ESP32-E主控板:18/SCK;
SD卡模块:MISO引脚---(连接)---ESP32-E主控板: 19/MISO;
I2S功放模块:SPK+引脚---(连接)---喇叭:正极;
I2S功放模块:SPK-引脚---(连接)---喇叭:负极;
7.2.4 演示代码
代码意义: 接入SD卡模块之后,连接成功后,直接播放SD卡里面的音乐,按下RST按钮,从头开始播放
#include <DFRobot_MAX98357A.h>
DFRobot_MAX98357A amplifier;
String musicList[100]; // SD卡音乐菜单
void setup(void)
{
Serial.begin(115200);
while ( !amplifier.initI2S(/*_bclk=*/GPIO_NUM_25, /*_lrclk=*/GPIO_NUM_26, /*_din=*/GPIO_NUM_14) ){
Serial.println("Initialize I2S failed !");
delay(3000);
}
while (!amplifier.initSDCard(/*csPin=*/GPIO_NUM_4)){
Serial.println("Initialize SD card failed !");
delay(3000);
}
Serial.println("Initialize succeed!");
amplifier.scanSDMusic(musicList);
printMusicList();
amplifier.setVolume(5);
amplifier.closeFilter();
amplifier.openFilter(bq_type_highpass, 500);
amplifier.SDPlayerControl(SD_AMPLIFIER_PLAY);
delay(5000);
if(musicList[1].length()){
Serial.println("Changing Music...\n");
amplifier.playSDMusic(musicList[1].c_str());
}else{
Serial.println("The currently selected music file is incorrect!\n");
}
}
void loop()
{
parseSerialCommand();
delay(500);
}
void printMusicList(void)
{
uint8_t i = 0;
if(musicList[i].length()){
Serial.println("\nMusic List: ");
}else{
Serial.println("The SD card audio file scan is empty, please check whether there are audio files in the SD card that meet the format!");
}
while(musicList[i].length()){
Serial.print("\t");
Serial.print(i);
Serial.print(" - ");
Serial.println(musicList[i]);
i++;
}
}
void parseSerialCommand(void)
{
String cmd;
float value;
if(Serial.available()){
cmd = Serial.readStringUntil('-');
if(cmd.equals("hp")){
Serial.println("Setting a High-Pass filter...\n");
value =Serial.parseFloat();
amplifier.openFilter(bq_type_highpass, value);
}else if(cmd.equals("lp")){
Serial.println("Setting a Low-Pass filter...\n");
value =Serial.parseFloat();
amplifier.openFilter(bq_type_lowpass, value);
}else if(cmd.equals("closeFilter")){
Serial.println("Closing filter...\n");
amplifier.closeFilter();
}else if(cmd.equals("vol")){
Serial.println("Setting volume...\n");
value =Serial.parseFloat();
amplifier.setVolume(value);
}else if(cmd.equals("start")){
Serial.println("starting amplifier...\n");
amplifier.SDPlayerControl(SD_AMPLIFIER_PLAY);
}else if(cmd.equals("pause")){
Serial.println("Pause amplifier...\n");
amplifier.SDPlayerControl(SD_AMPLIFIER_PAUSE);
}else if(cmd.equals("stop")){
Serial.println("Stopping amplifier...\n");
amplifier.SDPlayerControl(SD_AMPLIFIER_STOP);
}else if(cmd.equals("musicList")){
Serial.println("Scanning music list...\n");
amplifier.scanSDMusic(musicList);
printMusicList();
}else if(cmd.equals("changeMusic")){
cmd = musicList[Serial.parseInt()];
if(cmd.length()){
Serial.println("Changing Music...\n");
amplifier.playSDMusic(cmd.c_str());
}else{
Serial.println("The currently selected music file is incorrect!\n");
}
}else{
Serial.println("Help : \n \
Currently available commands (format: cmd-value):\n \
Start playback: e.g. start-\n \
Pause playback: e.g. pause-\n \
Stop playback: e.g. stop-\n \
Print music list: e.g. musicList-\n \
Change songs according to the music list: e.g. changeMusic-1\n \
Set and open high-pass filter: e.g. hp-500\n \
Set and open low-pass filter: e.g. lp-15000\n \
Close filter: e.g. closeFilter-\n \
Set volume: e.g. vol-5.0\n \
For the detailed meaning, please refer to the code comments of this demo.\n");
}
while(Serial.read() >= 0);
}
}
7.2.5 实验过程
打开Arduino IDE,开发板选择为FireBeetle2 ESP32-E,上传速率设置为921600。
将代码拷贝到Arduino IDE上,编译烧录代码到FireBeetle2 ESP32-E主控,自动播放SD卡存储的音频文件。
8. API函数库
/*************************** 配置函数 ******************************/
/**
* @fn begin
* @brief Init function
* @param btName - 创建的蓝牙设备名
* @param bclk - I2S通信引脚号, 串行时钟SCK, 也叫位时钟(BCK)
* @param lrclk - I2S通信引脚号, 帧时钟WS, 即命令(声道)选择,用于切换左右声道的数据
* @param din - I2S通信引脚号, 串行数据信号SD, 用于传输二进制补码表示的音频数据
* @return true on success, false on error
*/
bool begin(const char *btName="bluetoothAmplifier",
int bclk=GPIO_NUM_25,
int lrclk=GPIO_NUM_26,
int din=GPIO_NUM_14);
/**
* @fn initI2S
* @brief Initialize I2S
* @param _bclk - I2S通信引脚号, 串行时钟SCK, 也叫位时钟(BCK)
* @param _lrclk - I2S通信引脚号, 帧时钟WS, 即命令(声道)选择,用于切换左右声道的数据
* @param _din - I2S通信引脚号, 串行数据信号SD, 用于传输二进制补码表示的音频数据
* @return true on success, false on error
*/
bool initI2S(int _bclk, int _lrclk, int _din);
/**
* @fn initBluetooth
* @brief Initialize bluetooth
* @param _btName - 创建的蓝牙设备名
* @return true on success, false on error
*/
bool initBluetooth(const char * _btName);
/**
* @fn initSDCard
* @brief Initialize SD card
* @param csPin SD卡模块的spi通信的cs引脚号
* @return true on success, false on error
*/
bool initSDCard(uint8_t csPin=GPIO_NUM_4);
/*************************** 功能函数 ******************************/
/**
* @fn scanSDMusic
* @brief 扫描SD卡里面的WAV格式的音乐文件
* @param musicList - SD卡里面扫描到的WAV格式的音乐文件, 类型是字符串数组
* @return None
* @note 音乐文件路径名字当前仅支持英文, 格式当前仅支持WAV格式的音乐文件
*/
void scanSDMusic(String * musicList);
/**
* @fn playSDMusic
* @brief 播放SD卡里面的音频文件
* @param Filename - 音乐文件名, 当前仅支持 .wav 格式的音频文件
* @note 音乐文件名需为绝对路径, 列如: /musicDir/music.wav
* @return None
* @note 音乐文件路径名字当前仅支持英文, 格式当前仅支持WAV格式的音乐文件
*/
void playSDMusic(const char *Filename);
/**
* @fn SDPlayerControl
* @brief SD卡音频播放控制接口
* @param CMD - 播放控制命令:
* @n SD_AMPLIFIER_PLAY: 开始播放音乐, 可从之前暂停播放的位置继续播放
* @n 若没有通过playSDMusic()选择播放的音乐文件, 会默认播放音乐列表第一首
* @n 若SD卡没有扫描到正确格式的音乐文件也会播放失败(音乐文件路径名字当前仅支持英文, 格式当前仅支持WAV格式的音乐文件)
* @n SD_AMPLIFIER_PAUSE: 暂停播放, 保留当前音乐文件的播放位置
* @n SD_AMPLIFIER_STOP: 停止播放, 结束当前音乐的播放
* @return None
*/
void SDPlayerControl(uint8_t CMD);
/**
* @fn getMetadata
* @brief 通过 AVRC 命令获取"诠释数据"(metadata)
* @param type - 需要获取的元数据的类型, 目前支持的参数:
* @n ESP_AVRC_MD_ATTR_TITLE ESP_AVRC_MD_ATTR_ARTIST ESP_AVRC_MD_ATTR_ALBUM
* @return 相应类型的 "元数据"
*/
String getMetadata(uint8_t type);
/**
* @fn getRemoteAddress
* @brief 获取远程蓝牙设备地址
* @note 地址将在本机与远程蓝牙设备配对连接后, 成功进行蓝牙AVRCP协议通信后获取
* @return 返回存储远程蓝牙设备地址的数组指针
* @n 当未连接远程设备, 或和远程设备进行蓝牙AVRCP协议通信不成功时, 返回None
* @n AVRCP(Audio Video Remote Control Profile)
*/
uint8_t * getRemoteAddress(void);
/**
* @fn setVolume
* @brief 设置音量
* @param vol - 设置音量, 可以设置范围 0 ~ 9
* @note 5 即为音频数据原始音量, 无增减
* @return None
*/
void setVolume(float vol);
/**
* @fn openFilter
* @brief 打开音频滤波器
* @param type - bq_type_highpass: 开启高通滤波; bq_type_lowpass: 开启低通滤波
* @param fc - 过滤波的阈值, 范围: 2~20000
* @note 列如, 设置高通滤波模式, 阈值为500, 即为过滤掉音频信号中低于500的信号; 且高通滤波和低通滤波会同时工作
* @return None
*/
void openFilter(int type, float fc);
/**
* @fn closeFilter
* @brief 关闭音频滤波器
* @return None
*/
void closeFilter(void);
/**
* @fn reverseLeftRightChannels
* @brief Reverse left and right channels, When you find that the left
* @n and right channels play opposite, you can call this interface to adjust
* @return None
*/
void reverseLeftRightChannels(void);
更多资料下载
WIKI文档修改历史
文档版本号 | 修改时间 | 修改人 | 修改内容 |
---|---|---|---|
V1.0 | 2022.5.10 | 康啸 | 第一版发布 |
产品修改历史
产品版本号 | 修改时间 | 修改人 | 产品修改内容 |
---|---|---|---|
V1.0 | 2022.5.10 | 刘礼华 | 第一版发布 |
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。