STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)

前言:之前,笔者设计并制作了一个简单的FFT音乐频谱,并且分享了制作过程。本文是在原来的基础上做了一些修改。

效果演示:https://www.bilibili.com/video/av47915539/

成品:

音乐频谱 时间显示

制作过程

一、材料准备

配方略微修改,当然味道更佳!

1.STM32F103C8T6核心板一块

2.OLED25664(8080并口驱动)

3.音频采集电路(后文提供原理图)

二、硬件连接

因为市面上的并口驱动的OLED屏幕很少,所以有两个选择,一个是想笔者一样字节飞线改一个,或者按照笔者提供的原理图自己画一个PCB。

三、资料下载

资料显示方式做了一些修改,帧率要比效果演示中的高一些,更加流畅。

https://download.csdn.net/download/mc_li/11079869

/**********************************************************分割线**********************************************************/

详细制作

资料链接:

一、信号采集

信号采集和调理

这是之前的原理图,贴出来主要想说说这个原理图的问题。

输出端的电容C2,把运放输出的直流偏置个隔断了,导致信号的负半周期,又回到了0点以下,当然这里因为使用的是单电源,所以负半周期的信号,直接就没了,单片机采集不到负电压信号的,之前简单制作忽略了,这里特地说明一下,使用时应去掉C2,直接采集,如果考虑到放置输出接地损坏运放,也可以把C2换成电阻,做输出限流保护,这里因为设计了新的方案就不多说原来的图了。

下面是重新设计的原理图

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第1张图片 信号采集和调理

信号来源:有两个,一个为麦克风(U7),另一个为3.5mm音频座,通过SW_2来切换两个信号来源送入运放端。

直流偏置:由R21和R22分压得到1.65V经过C41滤波后,通过R25耦合到运放正向输入端,提供较为稳定的直流偏置电压。

增益控制:1+((R24+R17)/R16)得到输入信号V_in的增益,直流偏置电压不会增益。其中C30起了关键作用,第一它阻断了放大电路的直流电流,使得正输入端干净的 2.5V 顺利传递到运放的输出端;第二它耦合通过了交变信号,使其完成了放大。

信号滤波:后级是R19、R20、C31、C34构成的二阶压控式低通滤波器,截止频率在5KHz左右。得到的信号AD_IN送入单片机采集。

二、单片机硬件配置

使用STM32CUBEMX快速配置,小手一抖,代码到手。

大致流程,使用定时器去触发ADC转换,这样使得采集的间隔一致,然后固定采集256个点,使用DMA传输,采集完后触发中断,再统一处理数据。

由于篇幅限制这里的定时器和ADC的配置和上一期的分享一模一样,这里就不再赘述,不了解的小伙伴可以去看看上一期的分享哦。这次我们加入了万年历功能,使用到了内部的RTC,所以需要配置一下RTC;

第一步:使能RTC

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第2张图片 使能RTC

第二步:配置RTC的时钟来源(外部低速时钟32.768KHz)

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第3张图片 RTC时钟来源配置

        OK RTC就配置完成了!

三、FFT处理

FFT还是使用的官方的DSP库,不清楚的请回头看上一期分享。

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第4张图片 FFT处理

这里结合大家的建议,我把各个模块做了整合,把每个功能做了区分。还有在中断处理方面的问题,我们在使用单片机中断的时候,一定要注意,尽量不要在中断里面做太多事情。一般情况下建议,在中断里面对标志位处理,在后台系统中根据标志位再去处理繁琐的任务。就是中断不宜久留,呆的时间能短则短,上一次的分享做了个反面教材,不建议大家这么玩。

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第5张图片 功能模块化​​​

 

四、量化显示

显示部分硬件有所改动,从原来的OLED12864更改为25664,驱动方式从SPI变为了8080。软件方面,我写了三个显示效果,后面看大家自己的创意自己添加了。

初衷是想换个大点的屏幕,于是我买了块OLED25664,是SPI驱动方式,没多想强行移植上去,发现刷新率感人。这刷新率低有两个原因,第一个,我是等到DMA传输完成,做了FFT变化等一系列事情后再显示的,这个限制了刷新率。另一个原因就是SPI,这种串行的驱动方式,数据量一大了来确实力不从心,干不过并行的8080方式。我分别对两种方式的速度做了测试,一整屏的填充时间测量。

SPI方式填充一整屏测试结果:

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第6张图片 SPI方式

SPI方式填充一整屏的点,所用时间为60349us,换算为帧率大概为1/0.06s = 16fps。这个帧率怕是要眨眼补帧了!

8080方式填充一整屏测试结果:

8080方式

      8080方式填充一整屏的点,所用时间为19704us,换算为帧率1/0.019 = 52fps。这个帧率可以达到丝滑流畅了吧。

附上一张背面图,一时飞线一时爽,一直飞线....,因为买的屏幕是SPI方式的,没办法只有飞线改成8080口的了。

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第7张图片 背面飞线

 

好在飞完了能用!

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第8张图片 测试

STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)_第9张图片

 

好了,到此基于STM32F103的FFT音乐频谱就分享完成!能力有限,问题的地方,还请指点!欢迎转载,请注明出处,谢谢大家。

// 2019/8/7

感谢支持,这里是两个版本的源码和资料,提供给大家学习使用!

链接:https://pan.baidu.com/s/1fP08HS4ZzPXqJA-OjOVSzA 
提取码:t0y4 

OLED12864版本:https://blog.csdn.net/mc_li/article/details/81364766#commentsedit

你可能感兴趣的:(STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货))