e-works数字化企业网  »  文章频道  »  产品创新数字化(PLM)  »  EDA

基于STM32的OLED音乐频谱显示器的设计

2020/11/3    来源:《电子设计工程》    作者:高锋  叶成彬  陈贤钰      
关键字:STM32  傅里叶变换  OLED  DSP库函数  
本文介绍了利用STM32CubeMx快速编程软件和移植STM32 DSP库函数,设计一种STM32F103C8T6为核心的OLED音乐频谱显示器。该显示器通过音频信号采集电路来获取外部音频模拟信号,STM32F103C8T6内部ADC转换器将音频模拟信号转为数字信号,调用DSP库中的傅里叶(FFT)函数对音频数字信号进行频谱换算,OLED特效显示算法运算。经过实践设计与测试,OLED音乐频谱显示器运行稳定,能够实现多种显示特效,程序代码具有较高的可移植性和易用性。
       随着STM32生态系统快速建设和直观、高效的STM32CubeMx编程软件不断地推广,STM32所有系列的底层驱动库函数及应用库函数日趋完善、开源其移植性强,强大的技术支持大大缩短了研发人员的程序开发时间,降低开发难度[1],从而得到高校学生、电子设计类研发人员热捧。
 
       本设计通过STM32CubeMx编程软件快速生成I/O口工作模式、ADC转换、SPI(同步串行通信)、定时器、中断等功能配置及初始化函数,移植DSP库,编写OLED特效显示算法,搭建音频信号采集电路,设计主控板电路,实现多种特效显示的OLED音乐频谱显示器。模块化的硬件电路以及可移植性较强的软件设计,不仅降低高校学生上手难度,还激发了学生在STM32平台进行开发应用的热情、培养学生的综合设计、程序调试能力[2]。
 
    1 系统结构设计
 
       本设计的OLED音乐频谱显示器硬件设计主要以STM32F103C8T6为核心处理器、μA741芯片组建音频信号采集电路、0.96寸OLED屏幕实现特效显示、独立式按键切换显示特效等功能模块组成。系统整体结构如图1所示。

系统整体结构

图1 系统整体结构

    2 硬件设计
 
       2.1 STM32F1单片机最小系统设计
 
       本设计使用的主控制芯片为STM32F103C8T6单片机,主要实现AD数模转功能,DMA数据传输功能,定时器定时触发功能,控制OLED屏幕显示功能,读取按键状态功能。本系统采用的STM32F103C8T6微控制器,它是STM32F103系列芯片之一,在CORTEX-M内核的基础上扩张了高性能的外设。在产品开发时还可以应用ST公司专门为芯片设计的开发软件STM32CUBEMX进行产品研发,使得整个产品的研发周期大大的缩短并使整个程序移植性强,方便易懂。系统整体结构如图1所示。
 
       LQFP48封装形式的STM32F103C8T6单片机工作主频最高可达72MHz,内置64k字节Flash和20k字节RAM,包含4个定时器、2个12位的ADC、3个异步通信串行口USART、2个同步通信串行口SPI、2个I2C接口、37个I/O口等[3]。本设计中使用STM32F103C8T6单片机PA0(ADC1_IN0)引脚采集音频信号模块模拟信号,I2C1_SCL(PB6)、I2C1_SDA(PB7)组合的I2C接口与OLED显示器进行通信,PA4、PA5、PA6引脚分别连接3个独立按键。STM32单片机最小系统电路设计如图2所示。

 STM32单片机最小系统电路设计

 图2 STM32单片机最小系统电路设计

       2.2音频信号采集模块电路设计
 
       μA741是一款具有短路保护、失调电压调零能力、无闪锁现象的高性能、内补偿运算放大器。采用μA741搭建音频信号采集电路如图3所示,驻极体电容式麦克风M1为外部音频收集器,其收集到的音频信号经过集成运放μA741反相放大50倍(Av=-R6/R10=-50),提高系统的灵敏度。此电路选用单电源5V进行供电,由于单片机的模数(A/D)转换功能无法
采集负值,则将放大后的音频信号加上VCC/2的直流偏置电压[4-6]。

音频信号采集电路

图3 音频信号采集电路 

       2.3 OLED显示器电路设计
 

       本设计采用市面上最流行也最普通的0.96寸OLED显示屏,无需背光,显示单元能自发光,分辨率为128*64,可视角度大,支持众多的芯片,采用SPI或IIC通讯协议,最多只要4个IO口就能驱动[7-8]。
 
       OLED显示器主要用于显示随音乐律动的柱状频谱特效,显示不同的切换效果,其与STM32F103C8T6单片机通过I2C进行通信,具体电路设计如图4所示。

OLED电路设计

图4 OLED电路设计

 
       2.4 按键控制模块
 
       按键控制模块电路设计如图5所示,主要用于系统复位、OLED显示特效工作模式切换、特效样式切换功能。

按键控制模块电路设计

图5 按键控制模块电路设计

    3软件设计
 
        3.1 主程序设计
 
       主程序总体设计思路:系统上电后单片机内部进行复位,接着对系统时钟进行配置,对定时器TIM3、ADC1、ADC_DMA、SPI1等进行初始化,然后程序进入死循环的按键扫描函数。主程序设计流程如图6所示。

主程序设计流程

图6 主程序设计流程

       3.2 音频信号ADC采样思路及FFT运算程序设计
 
       根据奈奎斯特采样,一般采集样本频率信号应为被采集样本信号其最高频率的2倍。本设计需要采集的是范围为20Hz~20kHz音频样本信号,因此理论上采样频率最高可取40kHz[9]。配置STM32F103C8T6单片机ADC转换输入时钟最高12MHz,采样时间设置1.5周期,则ADC总转换时间=1.5周期+12.5周期=14周期(即14/12MHz=1.167μs),满足40kHz(25μs)采样频率。
 
       对音频模拟信号进行256次采样及转换,需分别对ADC和ADC_DMA进行初始化即可,函数原型如下:
 
       MX_ADC1_Init();//ADC初始化
       HAL_ADC_Start_DMA(&hadc1,adc_buf,NPT);
 
       其中hadc1表示单片机ADC1,adc_buf表示ADC值存放的数组,NPT宏定义为十进制数256。
 
       完成音频模拟信号采样之后,需对256个信号值进行快速傅里叶(FFT)运算,即调用DSP官方库的cr4_fft_256_stm32()函数,如下所示:
 
       cr4_fft_256_stm32(buff_out_array,buff_in_array,NPT);
 
       其中buff_out_array数组表示FFT运算后输出数据存放的数组,buff_out_array表示要进行FFT运算的数据存放的数组,NPT定义的值为256。引用该函数之后,在buff_out_array数组中就存储了快速傅里叶(FFT)运算结果的数据,该数组中每个元素的数据格式为:高16位存储数据的虚部,低16位存储数据的实部[10-12]。
 
      得到以上处理的结果数据,则需计算各次谐波的幅值,数组buff_out_array存放各次谐波幅值。具体实现代码如下:

具体实现代码

 具体实现代码

       音频信号采集、FFT运算及OLED显示效果程序设计思路:程序系统每次进入ADC_DMA数据传输中断回滚函数后,即可关闭ADC_DMA数据传输通道,然后将ADC转换的数据进行傅里叶(FFT)运算、计算各次谐波幅值,按照用户设定特效模式将各次谐波赋值代入相应算法进行特效运算,最后OLED显示音乐频谱效果,使能ADC_DMA数据传输通道。程序设计流程如图7所示。

音频信号采集、FFT运算及显示特效程序设计流程

图7 音频信号采集、FFT运算及显示特效程序设计流程

       3.3 OLED显示逻辑及显示算法流程
 
       为实现OLED显示柱状频谱特效需嵌入轻量级GUI(图形用户界面)[13-14],该GUI具有占用MCU资源少,可剪裁的,高速度等特点[15],极大方便了非专业用户的使用,用户不需要掌握大量的命令,而是通过调用API函数实现相对应的功能,使用户的开发速度大大提高。OLED音乐频谱柱状显示特效如图8所示。

 OLED音乐频谱显示器

图8 OLED音乐频谱显示器

       OLED显示特效算法逻辑:进入显示函数里,清除屏幕数据一次,将经FFT运算出的各次谐波幅值数组lBufOutArray取出,并进行屏幕显示限幅换算,即特效显示符合0.96寸的OLED分辨率,将换算结果代入调用GUI的API函数即可得到柱状特效显示操作,最后驱动OLED实时显示音乐频谱特效。柱状显示特效程序代码如下所示:

 

 柱状显示特效程序代码
柱状显示特效程序代码

    4 结束语
 
       文中所设计OLED音乐频谱显示器样机以STM32F103C8T6单片机为控制核心,应用OLED显示器,音频信号采集模块等硬件设备,通过移植DSP官方库进行二次开发,实现了随音频信号变化的音乐频谱[16]显示效果。样机硬件设计方案简单、程序移植性强、成本低廉、开发难度小,可作为STM32单片机学习爱好者入门级作品设计[17]。

       参考文献:
       [1]许鹏程,李小波.MATLAB与STM32CubeMx联合的嵌入式开发方法[J].单片机与嵌入式系统应用,2016,16(10):14-16.
       [2]邓鑫,朱磊,潘杨,等.STM32CubeMX的全速USB通信及测速模块设计[J].单片机与嵌入式系统应用,2018,18(9):35-38.
       [3]王梓烨,刘欲哲,周传宝.基于STM32的教学用开发板设计[J].电子世界,2018(1):70,72.
       [4]吴永德,罗萍.基于增强型8051单片机的音乐频谱显示器的设计[J].电子世界,2014(13):156.
       [5]胡玉松.运算放大器的工作原理及应用[J].科技风,2018(15):230.
       [6]张学文,司佑全.差分比例运算电路增益调整与控制分析[J].湖北师范大学学报(自然科学版),2019,39(2):77-81.
       [7]焦石,王琛,胡泽原,王印玺.基于STM32的OLED显示屏驱动设计[J].电子世界,2018(12):127-128.
       [8]陈海峰,陈盛闯.基于单片机的OLED显示系统设计与实现[J].电子设计工程,2015,23(20):137-140.
       [9]侯志伟,包理群.基于STM32的多重ADC采样技术研究与应用[J].工业仪表与自动化装置,2019(3):28-32.
       [10]张益,曹达,钱耶兵,等.采用FFT转换原理的高精度频率测量变送器的设计[J].电子世界,2019(12):138-139.
       [11]徐巧玉,刘锦霞,王军委,等.一种全相位FFT法的高精度相位测量仪设计[J].河南科技大学学报(自然科学版),2019,40(5):25-30.
       [12]张舰航,张丽彪,戚龙基.基于STM32的信号时域和频域分析仪的设计和实现[J].电子技术与软件工程,2015(9):136.
       [13]胡平平,王晶杰.uC/GUI实现OLED显示的移植与优化研究[J].计算机应用与软件,2016,33(10):256-259,287.
       [14]杨洁雨,周泽满,徐海贤.μC/GUI在STM32F103上的移植[J].工业控制计算机,2017,30(3):35-36,39.
       [15]陈皓,吴健学.一种嵌入式GUI的实现方案[J].电子设计工程,2017,25(1):64-66,70.
       [16]乔宏飞,陈洋,李刚.基于STC12A32S2音乐频谱播放器[J].电子制作,2018(1):17-19.
       [17]段丽娜.基于ARM的音频频谱显示器的设计[J].自动化技术与应用,2014,33(9):77-79,83.
责任编辑:杨培
本文来源于互联网,e-works本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供,并已尽力标明作者与出处,如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐