这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 合宙ESP32C3驱动PCM5102

共1条 1/1 1 跳转至

合宙ESP32C3驱动PCM5102

专家
2025-11-01 09:26:55     打赏

之前试用过MAX98357。MAX98357是单声道的,PCM5102是双声道的。当然依旧是买来现成的模块,

图片1.png

原理图:

图片2.png

别看模块提供的焊盘很多,实际应用时,最简单的接法,只需要5个:Vin,GND,BCK,DIN,LRCK。

依旧使用ARduino测试。使用的Arduino的理由是有支持库,节省许多开发时间。测试用的开发板选择合宙的ESP32C3,

图片3.png

与PCM5102模块的连接:

PCM5102                   ESP32C3

-------------------------------------------------------

Vin                        +5V

GND                       GND

BCK                       GPIO2

DIN                       GPIO10

LRCK                      GPIO3

-------------------------------------------------------

程序:

#include <Arduino.h>
#include <I2S.h>
#define BLCK 2
#define WS 3
#define DIN 10
const int frequency = 2000;    // 频率 Hz,改变这个值,改变声波频率
const int amplitude = 3000;    // 振幅,改变这个值,音量发生变化
const int sampleRate = 48000;  // 采样率
const int bps = 16;            // 采样位数
 
const int halfWavelength = (sampleRate / frequency);  // 半波采样点数目
int32_t sample = amplitude; // 当前振幅值
int count = 0;
 
 
void setup() {
    Serial.begin(115200);
    while (!Serial) ;
    
    // int setAllPins(int bclk, int LRC/WS, int DIN, int DOUT, int mck = -1);
    // 设置功能引脚
    I2S.setAllPins(BLCK, WS, DIN,-1,-1);
    if(!I2S.begin(I2S_PHILIPS_MODE, sampleRate,bps))     {
        Serial.println("Failed to initialize I2S!");
        while(1);
    }
    Serial.println("I2S config finish");
}
 
void loop() {
    if (count % halfWavelength == 0 ) {
      // 每半波长计数倍数反转一次样本,产生完整的波
      sample = -1 * sample;
    }
      I2S.write(sample);
      I2S.write(sample);
    // 为下一个样本递增计数
    count++;
}

示波器采集到的LOUT和ROUT的输出:

图片4.png

插上耳塞,可以听到声音。改变程序中的频率和音量,耳塞中的声音也会发生相应的变化。





关键词: 大懒猫的试用笔记     PCM5102     合宙ESP32C    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]