跳到主要内容

4.4 音频输入模块

(1)介绍与准备

ESP32开发平台板载的音频输出为驻极体麦克风和3.5MM耳机插座。驻极体麦克风有一个正极和接地引脚(连接到麦克风金属外壳)。音频信号是一种幅度可变的信号,而声音的“音量”或“响度”与信号的峰值、幅度有关。更高振幅的音频信号产生更高音量的声音,较低振幅的音频信号产生较低音量的声音。

因驻极体麦克风输出的信号非常微弱,因此需要将麦克风信号连接到前置放大器放大输出,然后再将其连接到ESP32的IO引脚上进行读取。制造前置放大器的一种方法是使用一个或多个“运算放大器”。运算放大器的简图下图所示:

alt text

图4.4.1 运算放大器简图

运算放大器的一个重要方面是“增益”的概念。增益是放大器执行的放大级别。它是输出电压与输入电压之比,如下列公式表示。

gain=VoutVingain = \frac{V_{out}}{V_{in}}

增益(在公式上为gain)为 1 将导致输入信号不放大,增益为 10 将导致输入信号放大十倍。增益通常设置在 1 到大约 100 倍之间。

回到我们的ESP32开发平台,麦克风输入还是耳机输入的运算放大器都采用的是LMV358。麦克风接的ESP32的IO引脚为IO10,3.5MM耳机插座的左右声道分别接ESP32的IO8和IO15。

alt text

图4.4.2 原理图

alt text

图4.4.3

alt text

图4.4.4

(2)实验代码

const int microphonePin = 10;

void setup() {
Serial.begin(9600);
}

void loop() {
int mn = 1024;
int mx = 0;

for (int i = 0; i < 10000; ++i) {
int val = analogRead(microphonePin);
mn = min(mn, val);
mx = max(mx, val);
}

int delta = mx - mn;//作差,求出峰峰值

Serial.print("Min=");
Serial.print(mn);
Serial.print(" Max=");
Serial.print(mx);
Serial.print(" Delta=");
Serial.println(delta);
}

(2)实验讲解

表1.4 音频输入模块函数讲解
函数说明
Serial.begin()设置电脑与Arduino进行串口通讯时的数据传输速率
analogRead()从模拟输入引脚读取数值
min()计算两个数字的最小值。
max()计算两个数字的最大值。

(4)实验现象

编译上传代码后,打开串口监视器,选择波特率为9600,可以看到打印音频信号的最值和峰值。

alt text

图4.4.5 打印出的最值和峰值