雷竞技注册
项目

EFM8声音合成器:驱动扬声器

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

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

介绍

第2部分《如何制作基于efm8的声音合成器》系列。

推荐的水平

中间

所需的硬件/软件

描述 数量 Digi-Key p / n
电路试验板 1 377 - 2094
Receptacle-to-plug跳线 4 1471 - 1231
5v AC/DC壁挂式电源 1 1470 - 2771
0.1µF电容器 4 399 - 4266
五阶开关电容低通滤波器 1 LTC1063CN8 # PBF-ND
通用运放 2 LT1638CN8 # PBF-ND
模拟电源缓冲 1 LT1010CN8 # PBF-ND
2µF电容器 2 490 - 8835
10 kΩ电阻 2 10 kqbk-nd
100Ω电阻 1 100年qbk-nd
8 Ω, 1瓦特扬声器 1 GF0771-ND

项目概述

在上一篇文章中,我们通过一个方波通过一个五阶开关电容低通滤波器成功地产生了正弦波。我们还可以通过调整方波的频率以及决定滤波器截止频率的时钟信号的频率来改变正弦波的频率。我们现在的目标是使用正弦波来驱动扬声器,但在此之前,我们需要解决滤波器输出管脚处信号的三个不良品质:

  1. 它包含被称为“时钟馈通”的高频噪声。
  2. 它有一个非零的直流偏移。
  3. 它不能驱动扬声器,因为LTC1063不能提供足够的输出电流。

在本文中,我们将重点通过一些简单的信号调理电路来纠正这三个缺陷,然后我们将修改固件,使扬声器播放一系列与C大调音阶相对应的声音。

这是这个项目的整个示意图:

在下面的章节中,示意图的相关部分将以放大的形式再现。

时钟直通的

与标准无源或有源滤波器相比,开关电容滤波器具有显著的优势,但总要有所取舍。开关盖技术的一个突出缺点是时钟馈通。在LTC1063中,数字时钟信号直接控制模拟信号的滤波电路。因此,发现我们的正弦波在芯片中获得了一些高频噪声就不足为奇了。这里是LTC1063输出一个523.25 Hz的信号(对应的音符C5):

仔细观察就会发现时钟馈通噪声:

游标确认噪音是由时钟引起的,因为时钟频率是523.25赫兹×125 = 65.4千赫(回想一下上一篇文章clock-signal-to-sound-signal比例为125:1)。你可以看到发生的噪声类似于“阶梯状”模式在数模转换器的模拟信号或模拟-数字转换器生成的二进制数。这提醒我们,开关帽滤波器实际上是在采样输入信号,就像ADC一样,我们使用“时钟馈通”来表示在任何采样数据系统的输出中都存在的阶梯时钟噪声。对于IC制造商来说,设计时钟截止比高的开关电容滤波器是有利的,因为这样就可以用一个简单的一阶RC低通滤波器有效地抑制时钟馈通噪声:

R1和C3.提供20分贝/十进滚转,截止频率为1/(2πRC) = 796 Hz。这意味着上面显示的时钟频率将衰减近40分贝,这是幅度减少了100倍。所有其他时钟频率将衰减得更厉害,因为注意C5是这个项目使用的音阶中最低的音符,从C5(523.25 Hz),以C结束6(1046.5赫兹)。以下是在运放组件引脚3处测量的示波器轨迹,显示了滤波器的有效性:

你可能会想,如果我们使用的音频频率高达1046.5赫兹,为什么截止频率设置为796赫兹。这是一个好问题,这篇文章最后的视频清楚地显示了音阶中的高音符被这个低通滤波器衰减了。你也可能注意到,虽然,高音符听起来并不比低音符低。实际上,它们听起来更大一点。这是因为我们的说话者和我们的听觉都喜欢更高的频率。人耳从C开始表现出逐渐增加的响应性5(约500hz)至C6(约1khz),扬声器的频率响应在这一频带也整体呈现上升趋势:

所以,将截止频率放置在频率范围的中间,实际上有助于平衡音阶中音符的感知响度。

直流偏置

我们发送到扬声器的正弦波的平均值应该是零,换句话说,纯交流没有直流成分。音频信号中的直流偏置会使扬声器的音圈产生偏差,从而降低动态范围,还会导致失真。在我们的电路中,我们只需插入一个直流阻塞电容器(C6所述第1运放的输出端和所述第2运放的输入端之间。

在电路的这一点上,我们也用R3.和R4将信号振幅减半;我们这样做是因为全幅信号需要比我们的缓冲器能够可靠地提供更多的电流,在下一节中讨论。

功率放大器

注意C5第二个运放输出的音频信号是这样的:

峰值振幅为1.32 V。如果我们试图用这个信号驱动8 Ω扬声器,峰值电流将约为1.32 V / 8 Ω = 165 mA。然而,LT1638运放的最大输出电流在25ma范围内。这就是为什么我们需要一个功率放大器级——电压幅值很好,但我们需要能提供更多电流的东西,从而为扬声器提供有意义的功率。为此,我们使用LT1010,这是一个单位增益的缓冲器,可以将现有的运放电路的输出电流容量增加到约150ma:

如原理图所示,LT1010被设计为包含在运放的反馈回路中。扬声器的正端连接LT1010的输出引脚,负端连接电路的接地节点。下面是驱动扬声器的信号:

为什么峰值振幅只有800 mV而不是1.32 V?因为这里显示的电压本质上是由LT1010的输出阻抗和扬声器的8 Ω线圈阻抗组成的电阻分压器的输出。LT1010的输出阻抗指定在5到10之间Ω;在这种情况下,它似乎是大约5 Ω,因为V演讲者= 800 mV≈1.32 V × (8 Ω / (8 Ω + 5 Ω))。

LT1010的峰值振幅为800 mV,必须提供800 mV / 8 Ω = 100 mA,这是舒适的在其最大额定电流。现在你知道为什么我们把第二个运放的输入电压降低了一半了:一个1.6 V的峰值幅值应用到扬声器上需要200 mA。LT1010可能能够承受这一点,因为我们是在适度的温度下工作,因为我们的正弦电流不是一直保持在200毫安,但世界已经够紧张的了——为什么仅仅为了一个演示项目就给LT1010施加压力呢?

固件

该项目的固件在端口I/O、外设和中断方面是相同的。新代码与我们正在产生的新声音频率有关:

#定义SOUND_C5_INCREMENT 1958 # define FILTCLK_C5_INCREMENT 16 # define SOUND_D5_INCREMENT 1744 # define FILTCLK_D5_INCREMENT 14 # define SOUND_E5_INCREMENT 1554 # define FILTCLK_E5_INCREMENT 12 # define SOUND_F5_INCREMENT 1467 # define FILTCLK_F5_INCREMENT 12 # define SOUND_G5_INCREMENT 1307 # define FILTCLK_G5_INCREMENT 10 # define SOUND_A5_INCREMENT#define FILTCLK_C6_INCREMENT 9 #define FILTCLK_C6_INCREMENT 8 #define FILTCLK_C6_INCREMENT 9 #define FILTCLK_C6_INCREMENT 9 #define FILTCLK_C6_INCREMENT 9 #define FILTCLK_C6_INCREMENT 8

现在我们对C的所有音符(不包括升调和降调)都有了声音信号和时钟信号增量5C6。主while循环通过循环适当的增量值来重复播放C大调音阶,每个音符保持一秒钟:

while(1) {Current_SoundSignal_Increment = SOUND_C5_INCREMENT;Current_FilterClock_Increment = FILTCLK_C5_INCREMENT;//延迟1秒SFRPAGE = TIMER3_PAGE;TMR3 = 0;而(TMR3 < 10000);Current_SoundSignal_Increment = SOUND_D5_INCREMENT;Current_FilterClock_Increment = FILTCLK_D5_INCREMENT;//延迟1秒SFRPAGE = TIMER3_PAGE;TMR3 = 0;而(TMR3 < 10000); Current_SoundSignal_Increment = SOUND_E5_INCREMENT; Current_FilterClock_Increment = FILTCLK_E5_INCREMENT; //delay 1 second SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3<10000); Current_SoundSignal_Increment = SOUND_F5_INCREMENT; Current_FilterClock_Increment = FILTCLK_F5_INCREMENT; //delay 1 second SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3<10000); Current_SoundSignal_Increment = SOUND_G5_INCREMENT; Current_FilterClock_Increment = FILTCLK_G5_INCREMENT; //delay 1 second SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3<10000); Current_SoundSignal_Increment = SOUND_A5_INCREMENT; Current_FilterClock_Increment = FILTCLK_A5_INCREMENT; //delay 1 second SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3<10000); Current_SoundSignal_Increment = SOUND_B5_INCREMENT; Current_FilterClock_Increment = FILTCLK_B5_INCREMENT; //delay 1 second SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3<10000); Current_SoundSignal_Increment = SOUND_C6_INCREMENT; Current_FilterClock_Increment = FILTCLK_C6_INCREMENT; //delay 1 second SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3<10000); }

SoundSynthesizer_Part2.zip

在下一篇文章中,我们将扩展固件,将USB连接和额外的定时功能结合起来,这样我们就可以方便地合成旋律。

视频

关于为什么振幅随着频率的增加而减小的解释,请参考“时钟馈通”部分。你听到的静电是由于录音过程;从扬声器发出的声音是干净和愉快的,特别是低音。

系列的下一篇文章:EFM8声音合成器:通过USB播放旋律

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