电子设计工程
Electronic Design Engineering
第28卷Vol.28第11期No.112020年6月Jun.2020
收稿日期:2019-09-07
稿件编号:201909047
作者简介:高锋(1997—),男,广东茂名人。研究方向:电气工程及其自动化。
随着STM32生态系统快速建设和直观、高效的STM32CubeMx 编程软件不断地推广,STM32所有系列的底层驱动库函数及应用库函数日趋完善、开源其移植性强,强大的技术支持大大缩短了研发人员的程序开发时间,降低开发难度[1],从而得到高校学生、电子设计类研发人员热捧。
本设计通过STM32CubeMx 编程软件快速生成I/O 口工作模式、ADC 转换、SPI (同步串行通信)、定时器、中断等功能配置及初始化函数,移植DSP 库,编写OLED 特效显示算法,搭建音频信号采集电路,设计主控板电路,实现多种特效显示的OLED 音乐频谱显示器。模块化的硬件电路以及可移植性较强的软件设计,不仅降低高校学生上手难度,还激发了学生在STM32平台进行开发应用的热情、培养学生的综合设计、程序调试能力[2]。
1系统结构设计
本设计的OLED 音乐频谱显示器硬件设计主要以STM32F103C8T6为核心处理器、μA741芯片组建音频信号采集电路、0.96寸OLED 屏幕实现特效显示、独立式按键切换显示特效等功能模块组成。系统整体结构如图1所示。
2硬件设计
2.1
STM32F1单片机最小系统设计
本设计使用的主控制芯片为STM32F103C8T6单片机,主要实现AD 数模转功能,DMA 数据传输功
基于STM32的OLED 音乐频谱显示器的设计
高锋,叶成彬,陈贤钰
(华南理工大学广州学院电工电子创新实验室,广东广州510800)
摘要:利用STM32CubeMx 快速编程软件和移植STM32DSP 库函数,设计一种以STM32F103C8T6为
核心的OLED 音乐频谱显示器。该显示器通过音频信号采集电路来获取外部音频模拟信号,STM32F103C8T6内部ADC 转换器将音频模拟信号转为数字信号,调用DSP 库中的傅里叶(FFT )函数对音频数字信号进行频谱换算,OLED 特效显示算法运算。经过实践设计与测试,OLED 音乐频
谱显示器运行稳定,能够实现多种显示特效,程序代码具有较高的可移植性和易用性。关键词:STM32F103C8T6;ADC ;傅里叶变换;OLED ;DSP 库函数中图分类号:TN79
文献标识码:A
文章编号:1674-6236(2020)11-0156-05
DOI:10.14022/j.issn1674-6236.2020.11.035
Design of OLED music spectrum display based on STM32
GAO Feng ,YE Cheng⁃bin ,CHEN Xian⁃yu (Electrical and Electronic Innovation Laboratory of Guangzhou College of South China University of
Technology ,Guangzhou 510800,China )
Abstract:Using STM32CubeMx rapid programming software and STM32DSP library functions ,an OLED music spectrum display with STM32F103C8T6as the core is designed.STM32F103C8T6internal ADC converter converts audio analog signal into digital signal ,and USES FFT function in DSP library to convert frequency spectrum of audio digital signal and calculate special effect display algorithm of OLED.Through practical design and test ,OLED music spectrum display runs stably ,can realize various display effects ,and has high portability and ease of use.
Key words:STM32F103C8T6;ADC ;Fourier transform ;OLED ;DSP library fuction -
-156
能,定时器定时触发功能,控制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
所示。
图1
系统整体结构
图2STM32单片机最小系统电路设计
2.2
音频信号采集模块电路设计
μA741是一款具有短路保护、失调电压调零能
力、无闪锁现象的高性能、内补偿运算放大器。采用μA741搭建音频信号采集电路如图3所示,驻极体
电容式麦克风M1为外部音频收集器,其收集到的音频信号经过集成运放μA741反相放大50倍(Av=-R 6/R 10=-50),提高系统的灵敏度。此电路选用单电源5V 进行供电,由于单片机的模数(A/D )转换功能无法
采集负值,则将放大后的音频信号加上VCC/2的直流偏置电压[4-6]。
2.3OLED 显示器电路设计
本设计采用市面上最流行也最普通的0.96寸
OLED 显示屏,无需背光,显示单元能自发光,分辨率为128*64,可视角度大,支持众多的芯片,采用SPI
特效设计或IIC 通讯协议,最多只要4个IO 口就能驱动[7-8]。
OLED 显示器主要用于显示随音乐律动的柱状
高锋,等基于STM32的OLED 音乐频谱显示器的设计
-
-157
《电子设计工程》2020年第11期
频谱特效,显示不同的切换效果,其与STM32F103C8T6单片机通过I2C 进行通信,具体电路设计如图4
所示。
图4OLED 电路设计
2.4按键控制模块
按键控制模块电路设计如图5所示,主要用于
系统复位、OLED 显示特效工作模式切换、特效样式
切换功能。
图5按键控制模块电路设计
3软件设计
3.1
主程序设计
主程序总体设计思路:系统上电后单片机内部进行复位,接着对系统时钟进行配置,对定时器TIM3、ADC1、ADC_DMA 、SPI1等进行初始化,然后程序进入死循环的按键扫描函数。主程序设计流程
如图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 存放各次谐波幅值。具体实现代码如下:
void GetDCcomponent (void ){
float X ,Y ,value ;unsigned short z
图3
音频信号采集电路
图6
主程序设计流程
-
-158
signed short X1,X2;for (z=0;z<NPT/2;z++)
{
X1=(buff_out_array[z]<<16)>>16;X2=(buff_out_array[z]>>16);X =NPT *((float )X1)/32768;Y =NPT *((float )X2)/32768;value =sqrt (X *X +Y *Y )*1.0/NPT ;
if (z ==0)
buff_mag_array[z]=(unsigned long )(value *32768);
else buff_mag_array[z]=(unsigned long )
(value *65536);
}
}
音频信号采集、FFT 运算及OLED 显示效果程序设计思路:程序系统每次进入ADC_DMA 数据传输中断回滚函数后,即可关闭ADC_DMA 数据传输通道,然后将ADC 转换的数据进行傅里叶(FFT )运算、计算各次谐波幅值,按照用户设定特效模式将各次谐波赋值代入相应算法进行特效运算,最后OLED 显示音乐频谱效果,使能ADC_DMA 数据传输通道。程序设计流程如图7
所示。
图7音频信号采集、FFT 运算及显示特效程序设计流程
3.3OLED 显示逻辑及显示算法流程
为实现OLED 显示柱状频谱特效需嵌入轻量级
GUI (图形用户界面)[13-14],该GUI 具有占用MCU 资
源少,可剪裁的,高速度等特点[15],极大方便了非专
业用户的使用,用户不需要掌握大量的命令,而是通过调用API 函数实现相对应的功能,使用户的开发速度大大提高。OLED 音乐频谱柱状显示特效如图8
所示。
图8OLED 音乐频谱显示器
OLED 显示特效算法逻辑:进入显示函数里,清
除屏幕数据一次,将经FFT 运算出的各次谐波幅值数组lBufOutArray 取出,并进行屏幕显示限幅换算,即特效显示符合0.96寸的OLED 分辨率,将换算结
果代入调用GUI 的API 函数即可得到柱状特效显示操作,最后驱动OLED 实时显示音乐频谱特效。
柱状显示特效程序代码如下所示:void OLED_Pilar_Show (void ){
uint16_t z =0;uint8_t x =0;uint8_t y =0;GUI_ClearSCR ();for (z =0;z <32;z++)
{
x =(z<<2);
y =63-(buff_mag_array[x+1]/prt )-2;if (y>63)y =63;GUI_LineWith (x ,y ,x ,63,3,1);
if (downpoint[z]>y )
downpoint[z]=y ;
else {
if (downpoint[z]>63)downpoint[z]=63;
GUI_LineWith (x ,downpoint[z],x ,downpo
int[z]+3,3,1);
downpoint[z]+=2;
高锋,等
基于STM32的OLED 音乐频谱显示器的设计
-
-159
《电子设计工程》2020年第11期
}
}
GUI_Exec();//刷新屏幕
}
柱状显示(中间对称)特效程序代码如下所示:void OLED_Pilar_Sym_Show(void)
{
uint16_t z=0;
uint8_t y=0;
GUI_ClearSCR();
for(z=1;z<128;z++)
{
y=63-(buff_mag_array[z]/prt)-2;
if(y>63)y=63;
GUI_RLine(z,y,63,1);
if(downpoint[z]>y)
downpoint[z]=y;
else
{
if(downpoint[z]>63)
downpoint[z]=63;
GUI_RLine(z,downpoint[z],downpoint[z]+1,1);
downpoint[z]+=2;
}
}
GUI_Exec();//刷新屏幕
}
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.
--160