树莓派pico和LM358运放组成的简单音频采样系统

基于树莓派pico和LM358运放的音频采样系统

简介

闲来无事,利用网上的图片,手动焊接了一个放大电路。采用LM358运放放大咪头信号,树莓派pico采样,ssd1306显示波形及频谱,适合新手练手。
选择LM358主要基于两个原因:一是电压范围宽,3V就可以正常工作,这样可以用板载的3.3V(或5V)电源供电,不需要额外的电源。二是可以自动偏置,LM358会把信号中心抬升到基准电压。
缺点也是很明显,3.3V供电导致放大后的信号最大幅度不能到达3.3V(3.3-1.5),pico的adc采样深度为12bit,达不到标准音频采样的16bit标准。
对比以前用过的一个微雪模块,自制模块有更高的灵敏度,高频尤其明显。
作为一个练手项目,此项目涉及到了ad采样,oled显示,焊接,及简单的C/C++。

项目优势

1.用料简单。pico开发板tb价格20块,ssd1306不超过15块,采样板总成本不超过5块~
2.采样精度尚可
3.代码简单易懂,有C基础的可以自由发挥,增加更多想要的功能
4.pico的扩展能力强,方便后期与其他系统集成
5.pico有强大的mcu,可以超频。这个项目中,pico运行在266MHz,I2C频率2.4MHz,128点采样并做傅里叶计算。满速fps可以到达200多。

采样板制作

1.原理图
原理图
注明:原图来自elecfans:https://www.elecfans.com/video/202207101859484.html
原设计采用9V电源,不方便与单片机集成。改为3.3V供电后,ADC引脚还可以做为探针使用,因为整块板子电压都在3.3V以下,方便排查板子的工作状态
原设计功能是话筒放大器,输出是有退耦电容的。但是单片机采样,需要直流部分~
原设计R4阻值10k,运放4脚电压为4.5V,超出了ad采样的范围。为了配合ad采样,R4改为了3.3K,运放四脚得到0.825V(5V供电时1.25)的电压,放大后的信号幅度为0V-1.65V(5V供电时2.5V)。

实际测试的时候,发现波形严重畸变,高频污染严重。经测试确定是电源引入的干扰。
为了消除干扰,额外在电源上并联了一个100uf的电解电容,另外在ad输出前增加了一个200K电阻。经过处理后,得到了完美的波形信号。后增加的两个原件没有体现在原理图中。

焊接好的采样板实物
焊接好的实物图,有点丑,但是功能没问题

相关代码发布在:https://github.com/AndrewWang1111/LM358_PICO_ADC
视频发在B站 :https://www.bilibili.com/video/BV1CG4y1V7SR

首先,需要将麦克风接入树莓派pico的GPIO引脚上,通过pico的ADC模块读取声音信号,然后将读取到的数据传入LM324大器进行大处理。接下来,将处理后的信号传入频谱分析算法中,计算出频谱数据并通过I2C总线传输给OLED显示屏进行实时显示。 具体实现步骤如下: 1. 准备材料 - 树莓派pico - OLED I2C显示屏 - LM324大器 - 麦克风 - 杜邦线 2. 连接电路 将麦克风的VCC引脚连接到pico的3.3V引脚上,将GND引脚连接到pico的GND引脚上,将OUT引脚连接到pico的ADC引脚上。然后将LM324大器的电源引脚连接到pico的3.3V引脚上,将GND引脚连接到pico的GND引脚上,将IN+引脚连接到pico的ADC引脚上,将IN-引脚连接到pico的GND引脚上,将OUT引脚连接到pico的GPIO引脚上。 3. 编写代码 使用Micropython语言编写代码,读取声音信号并通过LM324大器进行大处理,然后使用频谱分析算法计算出频谱数据,最后将数据通过I2C总线传输给OLED显示屏进行实时显示。具体代码如下: ```python from machine import Pin, ADC, I2C import ssd1306 import utime # 定义OLED显示屏相关参数 WIDTH = 128 HEIGHT = 64 i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000) oled = ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c) # 定义LM324大器相关参数 gain = 100 # 定义频谱分析算法相关参数 N = 64 fs = 20000 f = [i * fs / N for i in range(N // 2)] y = [0 for i in range(N // 2)] # 初始化ADC模块 adc = ADC(0) while True: # 读取声音信号并进行大处理 v = adc.read_u16() / 65535 * 3.3 v = v * gain # 更新频谱数据 y.pop(0) y.append(v) # 计算频谱并显示在OLED屏幕上 oled.fill(0) for i in range(N // 2): oled.line(i * 2, HEIGHT, i * 2, HEIGHT - int(y[i] / 10)) oled.show() # 等待一段时间后再次更新频谱数据 utime.sleep_ms(10) ``` 4. 行程序 将代码上传到树莓派pico上,然后将OLED显示屏连接到pico的I2C引脚上,启动程序后,当麦克风接收到声音时,程序会实时计算出频谱数据并在OLED显示屏上显示出来。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值