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

原理图:

别看模块提供的焊盘很多,实际应用时,最简单的接法,只需要5个:Vin,GND,BCK,DIN,LRCK。
依旧使用ARduino测试。使用的Arduino的理由是有支持库,节省许多开发时间。测试用的开发板选择合宙的ESP32C3,

与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的输出:

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