1. 项目缘起:当单片机“听见”音乐
几年前,我第一次在别人的作品展上看到一个用单片机做的音乐频谱,屏幕上跳动的光柱随着音乐节奏起伏,当时就觉得特别酷。作为一个喜欢折腾硬件的工程师,我立刻就想,能不能自己也做一个?但查了一圈资料,发现很多方案要么用了专门的音频处理芯片,成本不低;要么就是代码复杂,对新手不太友好。后来我琢磨,手头最常见的STM32F103C8T6(也就是大家常说的“蓝桥杯”最小系统板)性能其实不差,它内置的ADC和DMA功能,完全有可能直接处理音频信号。于是,我就决定挑战一下,只用最基础的STM32标准库,配合一块几块钱的OLED屏和声音传感器,打造一个属于自己的实时音乐频谱显示系统。
这个项目的核心目标很明确:让单片机实时“听到”声音,并把它分解成不同频率的成分,然后用最直观的图形在屏幕上展示出来。听起来有点像是给单片机装上了一双“频率分析”的耳朵。整个过程涉及硬件定时采样、ADC数据采集、DMA无阻塞搬运、FFT快速傅里叶变换计算,以及最终的图形绘制,是一条完整的、环环相扣的数据处理流水线。我踩过不少坑,比如采样率没设对导致频谱全是乱码,DMA配置错了数据根本搬不过来,FFT结果算出来莫名其妙等等。但最终调通的那一刻,看到屏幕上随着音乐律动的光柱,那种成就感真是没得说。下面,我就把自己从零搭建这个系统的完整过程、关键原理和那些容易踩的“坑”详细分享出来,就算你之前没怎么接触过DMA或FFT,跟着做也能把它复现出来。
2. 硬件搭建:三件套的简单组合
做硬件项目,第一步总是先把东西连起来。这个系统需要的硬件非常简单,总成本可能不到50块钱,特别适合学生党或者爱好者入门学习。
2.1 核心部件清单与连接
你需要准备以下三样东西:
- 主控芯片:STM32F103C8T6最小系统板。这是STM32家族中最经典的型号,资源丰富,资料海量,价格还便宜。
- 显示模块:0.96寸OLED显示屏,IIC接口,四针脚(VCC, GND, SCL, SDA)。这种屏功耗低、显示清晰,而且驱动简单。
- 拾音模块:基于LM386的声音传感器模块。它本质上是一个小放大器,能把麦克风收到的微弱声音信号放大,输出一个模拟电压信号(AOUT引脚)。
接线就像搭积木一样简单,照着下面的表格来,绝对错不了:
| STM32F103C8T6引脚 | 连接目标 | 说明 |
|---|---|---|
| 3.3V | OLED VCC, 声音传感器 VCC | 供电引脚,都接3.3V |
| GND | OLED GND, 声音传感器 GND | 共地,非常重要! |
| PB8 | OLED SCL | IIC时钟线 |
| PB9 | OLED SDA | IIC数据线 |
| PA0 | 声音传感器 AOUT | 音频模拟信号输入,这是ADC采集的关键 |
| 5V或Type-C口 | 系统供电 | 强烈建议用USB口供电,比3.3V引脚更稳定,显示效果更好 |
这里有个我实测下来的经验:供电一定要稳。最初我用开发板的3.3V引脚同时给OLED和声音传感器供电,发现频谱的低频部分总是有规律的抖动,不是音乐本身的节奏。后来改用USB口的5V供电(板载LDO会转成3.3V),这个问题就大大改善了。因为声音传感器和OLED在工作时电流会有波动,如果电源内阻大,就会相互干扰,影响ADC采集的基准电压。
2.2 声音传感器模块详解
我们用的这个LM386模块,你得了解它怎么工作,才能知道我们采集的到底是什么。
- AOUT引脚:这是我们需要的。它输出的是一个随着声音大小实时变化的模拟电压。声音越大,电压摆动的幅度就越大。注意,它输出的是交流信号,会围绕一个中心电压(通常是VCC/2,即1.65V)上下波动。我们的ADC就是要捕捉这个波动的波形。
- DOUT引脚:不用接,悬空就行。它是一个数字输出,当声音超过模块上蓝色电位器设定的阈值时,会从高电平变成低电平,常用来做简单的声控开关,但对我们分析频谱没用。
- 两个电位器:模块上有两个可调的蓝色电阻。一个是调节放大倍数(标着“A”),顺时针拧灵敏度增高;另一个是调节数字输出的触发阈值(标着“D”)。我们做频谱,需要的是原始的、不失


189

被折叠的 条评论
为什么被折叠?



