毕业设计| STM32F103全彩FFT音乐频谱+LED年历闹钟显示

嵌入式Linux

共 2459字,需浏览 5分钟

 ·

2021-12-09 23:05

大家好,我是写代码的篮球球痴,今天在后台看到有人想找毕业设计的点子。

然后我今天刚好看到一个不错的点子,给大家分享




看今天分享的毕设是来自点-凡自制的FTF音乐频谱制作,先来看展示效果:

——视频出处:B站点-凡



工作原理


上面演示的音乐频谱工作原理:



通过电脑,手机等外部设备3.5mm耳机孔,输出音频信号,然后经过继电器模块的音源选择后,继电器模块的输出分为两路:一路给有源音响播放音乐;一路经过音频信号调理电路,输入到STM32单片机的引脚进行采样和AD转换后,由程序进行FFT变换,并将FFT变换结果的幅值谱显示在LED全彩显示屏上。


语音播放模块用于播放闹钟语音报时及闹铃音乐。默认情况下继电器模块选择外界设备的音源,当闹钟时间到时,继电器动作切换为语音模块音源。



硬件构成


1)STM32F103核心板 

2)全彩LED显示屏单元板 P4  64*32  (16扫,75接口)满足此条件的LED屏都行,大家可以上某宝买

3)DS3231模块

4)双路继电器模块

5)DY-SV5W语音模块

6)按键模块(自制)

7)音频调理电路(自制)

8)若干个3.5mm音频母座,一条3.5mm公对公音频线

9)16P的牛角座及其16P的灰排线

10)能够提供3A左右的5V直流电源一个,可以是开关电源或电源适配器


另外,由于LED显示屏的内部芯片是5V逻辑电平为了确保单片机与LED显示屏通信正常建议增加两块八路3.3V转5V的电平转换模块,确保电平匹配通信正常。



IO接口连接


IO口的连接看程序中的宏定义即可,这里说一下LED显示屏75接口的定义:



由于LED显示屏是64*32的,75接口的ABCD是行选信号输入,因此最多只能选择16行,而LED显示屏是32行的,因此这里分为两个16行的上下半屏同时进行动态扫描,因此RGB数据也分为上下半屏,DR1表示上半屏的红色数据串行输入,DR2表示下半屏的红色数据串行输入,其他的类似。CLK是移位脉冲,LED屏一共有64列,因此每显示一行都需要移入64次的数据,并且上下半屏的RGB数据需要同时移入,因为每次行选中的是上下半屏各一行。LAT是用于锁存数据,这样数据移位时,不会改变锁存器的输出。OE是使能输入,当OE低电平时打开整个屏幕的显示,OE高电平时关闭整个屏幕的显示。利用OE就可以很方便的通过PWM控制整体亮度,以及消除鬼影。



自制模块


下图是按键模块的原理图:



图中IO连接只是一个示例,大家可以自己定义。


接下来就是焊接。


按键模块实物 


电脑或手机耳机孔输出的音频信号是交流小信号,信号的振幅较小,而STM32单片机AD转换能够转换的信号是0V~3.3V的直流信号,因此音频信号需要经过音频信号调理电路抬升电平并且进行一定程度的放大,才能输入到STM32单片机的引脚进行采样和AD转换。

音频调理电路

因此利用可以作为运放使用的耳放TDA1308,使它工作在单电源供电3.3V模式下的反相比例放大,通过R1和R2分压向同相输入端提供直流偏置电压,将音频信号的电平抬升1.65V,这样输出的音频信号就是在1.65V电平基准上做摆幅的直流信号了。这里只取左右声道的其中一个声道进行采样,并且根据傅里叶变换的原理,信号反相并不影响其幅值谱,只对相位谱有影响,而我们显示的音乐频谱是幅值谱,所以不影响显示的正确性。当然也可以将电路做成反相加法电路,将左右声道合成为一路输出。


黄色框选中的即音频信号调理模块 


接下来是各模块的焊接,最终的电路板整体:



程序源码


项目程序源码及语音模块资料,可以在“嵌入式Linux公众号”回复:音乐频谱,获取。

main.c代码:


/*********哔哩哔哩   点-凡*********/
#include "Include.h"/** * @brief 主函数 * @param 无 * @retval 无 */int main(void){ LED_GPIO_Config(); Key_GPIO_Config(); Alarm_Clock_GPIO_Config(); EXTI_BUSY_Config(); I2C_DS3231_Init(); I2C_WaitDs3231StandbyState(); ADCx_Init(); DMAx_Init(); FFT_Init(); Calendar_init(); BASIC_TIM_Init(); GENERAL_TIM3_Init(); GENERAL_TIM4_Init(); while(1) { Task_10ms(&Task_run); Task_30ms(&Task_run); Task_40ms(&Task_run); Task_100ms(&Task_run); Task_1s(&Task_run);     }}/*******END OF FILE*******/


有关FFT算法部分的程序,建议参考:第四章快速傅立叶变换(FFT) - 百度文库 (baidu.com)


本项目是点-凡的原创文章,感兴趣的同学可以到csdn或B站搜索点-凡原文链接:

https://blog.csdn.net/u011504434/article/details/119296746





推荐阅读:

专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~


浏览 63
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报