摘 要:本设计是一个基于 STM32 单片机的简易电子琴,通过 37 键矩阵键盘按键输入,利用单片机的 DAC 输出相应音高的波形,并通过扬声器播放出来,实现了电子琴的基本功能,并且支持多个按键同时按下并判断,输出音符可以叠加,因此可以演奏和弦音,并且可以演奏完整的一首曲子。
关键词:STM32单片机,电子琴
1. 背景
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。它的应用必定导致传统的控制技术从根本上发生变革。因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经融入现代人们的生活中,成为不可替代的一部分。本文的主要内容是用STM32 单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘等模块组成了电子琴。
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机存储不同音高的波形表, 当按键按下时播放对应声音,最终可随意弹奏想要表达的音乐。
2.设计概述及原理
本设计利用矩阵键盘制作电子琴按键,利用单片机读取矩阵键盘判断有哪些按键被按下,支持多按键同时按下,最多 37 个键同时按下的情况,然后将对应的音频从数据表中读出并合成,最终通过 DAC 转换输出,再经过硬件滤波放大,最终输出给功放,实现了电子琴的基本功能。
声音有三个基本参数:响度,音高,音色。其中响度取决于声波的振幅,音高取决于声波的频率,而音色是比较复杂的,不同乐器之所以会有不同音色是因为他除了决定主音音高的基波以外还有丰富的谐波,主要以2次至9次谐波为主,其中谐波又称为泛音,2次谐波称为第一泛音, 3次谐波称为第二泛音,其他的谐波叫法类似。不同乐器的不同泛音的比例是都是不同的,但是每个谐波携带的能量是不会超过基波的。而且大多数乐器触发了一个音以后还会伴随衰减,不同乐器的衰减效果也不尽相同。要模拟合成乐器音色的计算量是巨大的,因此单片机的性能是不够的,所以本设计采用了另一种思路,将每个钢琴琴键的录音转化为数据表格,然后存入单片机中,利用定时器中断将表格中的数据写入 DAC 中,只要将定时器频率设置的和音频采样频率一致便能实现音频的播放。
和弦指的是一定音程关系的一组声音。将三个或以上的音,按照三度或非三度的叠置关系,在纵向上加以结合,就成为和弦。 和弦是音乐中重要的组成部分,和弦的存在使音乐变得丰富多彩,所表达的感情也更加丰富。和弦的产生十分简单,只需要将对应和弦的音相加即可,因此在本设计中,在单片机读取到几个键同时按下后将对应音频以及这个时刻的音高相加然后送入 DAC 中便能模拟和弦的产生。
3.硬件设计
3.1 单片机
本设计采用了 STM32F103ZET6 单片机最小系统板作为控制核心,内核为 ARM 32 位的Cortex-M3 架构, 工作在 72MHZ 频率下。拥有 64K 的 SRAM 以及 512K的 FLASH。拥有 2 个12 位 DAC 转换器。拥有 11 个定时器以及 12 个 DMA 控制器。以上参数是完成本设计不可或缺的因素。 本设计中共使用了 13 个普通 I/O 口作为矩阵键盘的输入,一个 I/O 口用作 DAC的输出,使用了一个定时器及中断用于控制 DAC 数据刷新。
3.2 矩阵键盘
由于本设计有 37 个按键,按键数量较多,如果采用独立按键设计,将要使用 37 个 I/O口,会对单片机的 I/O 口造成极大的浪费,因此采用了矩阵的设计, 5x8 的矩阵键盘一共使用了 13 个 I/O 口,大大提高了单片机利用率。

图1 矩阵键盘
本设计采用了 8x5 的矩阵键盘, 如图 1 所示, 不同于普通的矩阵键盘,本矩阵键盘每个按键都串联一个二极管,工作时,单片机给行输出信号,每一次只有一行置为高电平,其余的行为低电平,列为返回给单片机的信号。
普通的矩阵键盘没有二极管,因此在工作时一次只能判断一个按键按下。而这个设计的矩阵键盘在工作时, Y1~Y5 依次置为高电平,当一个键或多个键按下时可以通过 X1~X8 来确定那一列有按键被按下,再结合 Y1~Y5 的状态来确定哪一行有按键被按下。由于二极管具有单向导电性,所以当某一行输入高电平时,即使某一列的按键全部按下,其他行也不会被置为高电平,因此其他行的按键不会影响对这行按键的判断。
所以这种设计的矩阵键盘可以判断任意数量以及任意组合的按键同时按下的情况,因此这种设计的矩阵键盘可以用于电子琴键盘的设计。 本设计一共有 37 个按键,因此矩阵键盘中最后 3 个按键位置是空余的。
3.3 输出信号处理

图2 输出滤波及放大电路
如图2所示为输出滤波及放大电路,单片机 DAC 输出接电路输入口,经过由 R1,C1 组成的低通滤波器送入运放,经过运算放大器的放大,将信号输出给功放。
4.程序思路
程序中使用了一个定时器及中断用于 DAC 数据刷新,音频采样频率为 6400HZ,因此定时器设置为 6400HZ,保证了输出音频不会失真。
实验中发现,矩阵键盘如果刷新频率过高会导致按键的误判,而使用延时来降低刷新后发现延时所产生的计算任务会影响单片机对音频数据的处理,由于 DAC 需要高频率地更新,这导致了输出音频的严重失真。为了解决这个问题最后采用了这样的方法,将按键扫描函数插入到音频数据处理中,让数据处理的过程充当了延时作用,这样一来可以避免按键误判,二来也不会给单片机增加负担而导致输出波形失真。

图 3 按键判断流程图
按键判断的流程图如图4所示,当一个按键判断有上升沿时,开始播放对应录音,该音频由查表所得,每个 DAC 刷新周期都会将数据表中的数据送入 DAC。当一个按键按下时,若前面一个音还没有结束,那么将两个音的相应时刻的数据求和后送入 DAC 中,这样便达到了音的合成效果。

图 4 按键判断流程图
5.实物效果及总结

图 5 实物全套

图 6 单片机与滤波放大电路实物
测试可知该电子琴达到设计要求,和弦效果很好,并没有出现音不准、串音、杂音等问题,可以完整的演奏一首曲,并且音色也很接近钢琴。
参考文献
[1] 严海蓉,薛涛.嵌入式微处理器原理与应用.北京:清华大学出版社,2014
[2] 童诗白,华成英.模拟电子技术基础.第五版.高等教育出版社, 1980