雷竞技注册
项目

EFM8音响合成器:从方波到正弦波

2015年9月04日通过罗伯特Keim

“如何制作基于efm8的声音合成器”系列的第一部分,设计一个可以播放标准音符的声音合成器。我们将使用一个低成本、小尺寸的EFM8微控制器,结合一些外部组件和一个扬声器来实现这一点。

“如何制作基于efm8的声音合成器”系列的第一部分。

推荐的水平

中间

必需的硬件/软件

描述 数量 Digi-Key p / n
电路试验板 1 377 - 2094
插座 - 插头跳线电线 4 1471 - 1231
5v AC/DC壁挂式电源 1 1470 - 2771
0.1µF电容器 2 399 - 4266
五阶开关电容低通滤波器 1 LTC1063CN8 # PBF-ND

项目概述

这个项目的目标是设计一个声音合成器,可以播放标准的音符。我们将使用一个低成本、小尺寸的EFM8微控制器,结合一些外部组件和一个扬声器来实现这一点。在这第一篇文章中,我们将重点介绍如何将EFM8产生的方波转换为适合驱动扬声器的正弦波。在这个过程中的基本组件是一个时钟可调的单片低通滤波器。在这个项目中,我们将使用Linear Technology的LTC1063五阶巴特沃斯滤波器IC,尽管有高阶频率响应部件和不同的滤波器类型(如MAX7401, Maxim集成公司的八阶贝塞尔低通滤波器)。这类集成电路是基于开关电容滤波器设计的,所以我们将从这一技术的简要概述开始。

更换电阻

开关电容器滤波器拓扑结构的本质是用开关代替电阻,开关根据特定的模式打开和关闭。

在上图的左边是一个标准RC低通滤波器,右边是等效的开关电容。正如你所看到的,电阻器已经被两个开关和一个电容(后者是同名的“开关电容”)的组合所取代。概念如下:当SW1是封闭的2时,输入电压充电C1.接下来,当西南1是开放的和SW2是封闭的,电荷从C1通过西南2到输出。这里是电荷从输入移动到输出。每个时钟周期传输的电荷量与C的电容成正比1和V之间的差和V,每秒钟传输的电荷量与C成正比1, V- v,每秒的时钟周期数,即频率。如果我们回想一下电流是单位时间内流过导体的电荷量,我们就会发现开关电容器的排列方式会产生平均目前给出如下:

由欧姆定律可知,通过一个元件的电压除以流过该元件的电流等于该元件的电阻,因此开关电容电路的等效电阻如下所示:

这是很重要的:这个等效电阻的值可以简单地通过改变驱动开关的时钟的频率来调整,因此开关电容RC滤波器的截止频率可以由数字方波的频率来控制。此外,截止频率并不取决于绝对电容值,而是取决于C的比值1到C.2,而集成电路制造过程比元件本身的值更能有效地控制元件值之间的比值。因此,开关电容滤波器拓扑是通用的,与集成电路技术高度兼容。集成电路制造商可以将多个基于开关电容的滤波器级集成到单个芯片中,从而产生高阶滤波器,其频率响应可以方便和精确地由数字方波的频率控制。

从平方到正弦

振幅为k,频率为f的方波的傅里叶变换为

换句话说,方波是具有频率增加和幅度的无限系列正弦波的总和,幅度增加3,5,7,9等。这些频率分量被称为奇数整数谐波。(您可以找到对此主题的详细讨论在这里.)这个级数的第一项和原始方波有相同的峰值振幅和频率,所以这是我们想要的项。如果我们能过滤掉所有其他的,我们就会得到一个平滑的、音频友好的正弦波,而不是一个笨重的方波。

这就是五阶低通滤波器的作用。我们应该得到频率响应中每个极点的6 dB/八度(或20 dB/十年)的滚转,因此我们的五极系统的理论滚转是30 dB/八度。LTC1063 datasheet中给出的频率响应曲线证实了这一点:

八度音程对应于频率的加倍,我们可以看到20 kHz到40 kHz的增益减少30 dB。上面给出的傅里叶系列中的第二项的频率是方波频率的三倍;因此,通过适当放置过滤器的截止频率,这种谐波应衰减40或45 dB。40 dB的衰减对应于幅度的100因素,更高的谐波将更多地衰减(至少70 dB),因此在此目的看起来LTC1063将对转动我们的方形进行精细工作浪潮到正弦波。

固件概述

EFM8需要产生两个不同频率的方波。第一个频率与驱动扬声器的正弦波相同,第二个驱动LTC1063的时钟引脚,从而控制滤波器的截止频率。LTC1063的时钟截止比是100比1;换句话说,截止频率等于时钟频率除以100。但是要注意,这并不意味着由EFM8产生的两个信号之间的频率比应该是100比1。为什么?考虑下面的图,它提供了滤波器在截止频率附近的频率响应的详细信息:

回想一下,截止频率的另一个名称是3db频率:在截止频率处,增益是- 3db,而不是0db。因此,如果EFM8的时钟信号频率恰好是声音信号频率的100倍,那么声音信号就会衰减3 dB。相反,我们希望声音信号的频率位于频率响应开始滚动的位置;这个位置由上图中的红色星号标识。这一点的频率大约是800hz;这个图的时钟频率是100khz, 100khz除以800hz等于125。因此,我们将EFM8配置为时钟信号与声音信号的比率为125:1。

外设、端口和中断

我们将使用EFM8的可编程计数器阵列(PCA)生成两个方波。这个外设由三个通道组成,它们由同一个时钟驱动,但在其他方面是独立的。每个主成分分析通道可以执行各种时序和波形生成任务;在这种情况下,我们将配置PCA通道0和1为“高速输出”模式:

注意,上面显示的“输出频率”并不相关,因为我们将通过手动更新每个通道的捕获/比较寄存器来控制频率(在页面底部下载代码)

/************************************** 输出频率定时  **************************************/ /* PCA时钟周期为488 ns。对于400hz的输出,周期是2.5 ms. 2.5 ms除以488 ns = 5123。因此,5123个PCA时钟给出了400hz输出的适当周期。然而,我们只需要将这个值的一半添加到捕获/比较寄存器,因为捕获/比较寄存器和PCA计数器之间的匹配会导致输出引脚切换,一个时钟周期需要两次切换。驱动低通滤波器的时钟的频率比声音信号的频率高125倍,这意味着周期短125倍。因此,我们将声音信号增量除以125得到滤波器时钟增量。同样的程序用于计算600hz输出的声音信号和时钟信号增量。*/ #define SOUND_400Hz_INCREMENT 2562 #define FILTCLK_400Hz_INCREMENT 20 #define SOUND_600Hz_INCREMENT 1708 #define FILTCLK_600Hz_INCREMENT 14

时间细节在代码摘录中的注释中给出。一般概念如下:16位PCA计数器总是在递增;当达到0xFFFF时,溢出并继续计数。此计数器用于所有三个PCA通道。每个通道都有自己的捕获/比较寄存器。在“高速输出”模式下,每次当PCA计数器的16位值等于存储在通道捕获/比较寄存器中的16位值时,PCA通道切换其输出引脚。通过用一个预定的值反复增加捕获/比较寄存器,我们可以精确地控制连续捕获/比较匹配之间的时间量,这就是PCA中断的作用:

现在,每当PCA计数器和通道的捕获/比较寄存器之间有匹配时,输出引脚就会切换中断将被触发。在中断服务程序中,我们通过在前一个捕获/比较值上加上预定的增量来控制输出信号的周期:

SI_INTERRUPT (PCA0_ISR, PCA0_IRQn) {if(PCA0CN0_CCF0) //该通道生成声音信号频率{PCA0CN0_CCF0 = 0;//清除中断标志PCA0Mod0_Compare_Value = PCA0Mod0_Compare_Value + Current_SoundSignal_Increment;PCA0CPL0 = LOWBYTE (PCA0Mod0_Compare_Value);//必须先写低字节PCA0CPH0 = HIGHBYTE(PCA0Mod0_Compare_Value);} if(PCA0CN0_CCF1) //该通道产生滤波器时钟频率{PCA0CN0_CCF1 = 0;//清除中断标志PCA0Mod1_Compare_Value = PCA0Mod1_Compare_Value + Current_FilterClock_Increment;PCA0CPL1 = LOWBYTE (PCA0Mod1_Compare_Value);//必须先写低字节PCA0CPH1 = HIGHBYTE(PCA0Mod1_Compare_Value);} }

注意,我们在这里使用的是无符号16位变量,因此不必手动处理变量溢出:当增量导致PCA0Mod0/1_Compare_Value当变量超过65535时,它们将自动溢出到正确的值,因为PCA计数器也是16位。

两个PCA通道输出信号分别在P0.0和P1.1上驱动:

当前固件唯一需要的其他外设是Timer3,它用于毫秒到秒级的延迟:

我们还需要启用低频振荡器,这样我们就可以使用它作为Timer3的时钟源:

电路

以下是项目这一部分的示意图:

这是面包板的实现:

这篇文章有关使用便宜的壁挂式电源在面包板上提供负电压的详细信息。

这里是这个固件的主要while循环:

while(1) {Current_SoundSignal_Increment = SOUND_400Hz_INCREMENT;Current_FilterClock_Increment = FILTCLK_400Hz_INCREMENT;//延迟3秒SFRPAGE = time3_page;TMR3 = 0;而(TMR3 < 30000);Current_SoundSignal_Increment = SOUND_600Hz_INCREMENT;Current_FilterClock_Increment = FILTCLK_600Hz_INCREMENT;//延迟3秒SFRPAGE = time3_page;TMR3 = 0;而(TMR3 < 30000); }

SoundSynthesizer_Part1.zip

在这个无限循环中,EFM8输出400hz正弦波的声音和滤波时钟信号并保持3秒,然后它切换到600hz正弦波的声音和滤波时钟信号并再次保持3秒。本文最后的视频显示了由EFM8产生的方波和LTC1063输出的正弦波。示波器的频率测量功能(在屏幕右下方的“CH1频率”下)确认生成的信号确实是400和600赫兹。

在我们使用这些正弦波信号驱动扬声器之前,需要一些额外的滤波和缓冲电路,这是我们将在下一篇文章中探索的内容。

下一篇文章:EFM8音响合成器:驱动扬声器

你自己试试这个项目吧!BOM。