|
本篇文章属于“如何制作基于EFM8的声音合成器”系列的第2部分。该系列包含以下内容: ● 第1部分:从方波到正弦波 ● 第2部分:驱动扬声器 ● 第3部分:通过USB播放旋律
所需的硬件/软件 ● SLSTK2000A EFM8评估板 ● Simplicity Studio集成开发环境
项目概况 在上一篇文章中,我们通过将方波传递到五阶开关电容低通滤波器成功地产成了正弦波。我们还能够通过调整方波的频率以及确定滤波器截止频率的时钟信号的频率来改变该正弦波的频率。我们现在的目标是使用这个正弦波来驱动扬声器,但在我们这样做之前,我们需要解决滤波器输出引脚可用信号中的三个不良因素:
1. 它包含被称为“时钟馈通”的高频噪声。 2. 它具有非零DC偏移。 3. 它无法直接驱动扬声器,因为LTC1063无法提供足够的输出电流。
在本文中,我们将重点介绍使用一些简单的信号调整电路解决这三个不足,然后我们将修改固件代码,使扬声器播放与C大调相对应的一系列声音。
以下是该项目的整个原理图:
在以下的章节中,我们将详细介绍原理图的各个相关部分。
时钟馈通 开关电容滤波器与标准无源或有源滤波器相比具有明显的优势,但始终需要权衡利弊。开关电容技术的一个突出缺点是时钟馈通。在LTC1063中,数字时钟信号直接控制滤波模拟信号的电路。因此,发现我们的正弦波离开芯片并获得一些高频噪声就不足为奇了。这是用于523.25 Hz信号的LTC1063输出(对应于音符C5):
仔细观察会发现时钟馈通噪声:
光标确认噪声是由时钟引起的,因为时钟频率为523.25 Hz×125 = 65.4 kHz(从前一篇文章中可以看出,时钟信号与声音信号之比为125比1)。您可以看到噪声类似于数字 - 模拟转换器的模拟信号中出现的“阶梯”模式或模数转换器生成的二进制数。这提醒我们,开关电容滤波器实际上是对ADC输入信号进行采样,我们使用“时钟馈通”来表示任何采样数据系统输出中存在的阶梯时钟噪声。 IC制造商有利于设计开关电容滤波器,使得时钟截止比很高,因为使用简单的一阶RC低通滤波器可以有效地抑制时钟馈通噪声:
R1和C3提供20 dB / decade的滚降,截止频率为1 /(2πRC)= 796 Hz。这意味着上面显示的时钟频率将衰减几乎40 dB,这是幅度减小100倍的因素。所有其他时钟频率将进一步衰减,因为音符C5是此项目所用音阶中的最低音符,以C5(523.25 Hz)开头,以C6(1046.5 Hz)结束。在运算放大器组件的引脚3处测量的以下示波器迹线演示了滤波器的功效:
您可能想知道为什么如果我们使用高达1046.5 Hz的音频频率,截止频率设置为796 Hz。这是一个很好的问题,本文最后的视频清楚地表明,这种低通滤波器会降低音阶中的高音。但是,您可能还会注意到,较高音符的声音听起来不如低音音符。实际上,它们听起来有点大声。这是因为我们的发言者和我们的听觉都支持更高的频率。人耳表现出从C5(约500 Hz)到C6(约1 kHz)逐渐增加的响应度,扬声器的频率响应也显示出该频段的整体增长趋势:
因此,将截止频率置于频率范围中间附近实际上有助于平衡音阶中音符的感知响度。
直流偏移 我们发送到扬声器的正弦波的平均值应为零 - 换句话说,纯AC没有直流分量。音频信号中的DC偏移使扬声器的音圈偏置,从而降低了动态范围,并且还可能导致失真。在我们的电路中,我们只需在第一个运算放大器的输出和第二个运算放大器的输入之间插入隔直电容(C6)即可消除直流偏移。
在电路的这一点上,我们还使用R3和R4将信号幅度减半;我们这样做是因为全振幅信号需要比我们的缓冲器可靠供电更多的电流,如下一节所述。
功率放大器 第二个运算放大器输出端的音符C5音频信号如下所示:
峰值幅度为1.32 V.如果我们尝试使用此信号驱动8Ω扬声器,则峰值电流约为1.32 V /8Ω= 165 mA。但是,LT1638运算放大器的最大输出电流范围为25 mA。这就是为什么我们需要一个功率放大器级 - 电压幅度很好,但我们需要能够提供更多电流的东西,从而为扬声器提供有意义的功率。为此我们使用LT1010,它是一个单位增益缓冲器,可以将现有运算放大器电路的输出电流容量增加到大约150 mA:
如原理图所示,LT1010设计为包含在运算放大器的反馈环路中。扬声器的正极端子连接到LT1010的输出引脚,负极端子连接到电路的接地节点。这是驱动扬声器的信号:
为什么峰值幅度仅为800 mV而不是1.32 V?因为此处显示的电压基本上是由LT1010的输出阻抗和扬声器的8Ω线圈阻抗组成的电阻分压器的输出。 LT1010的输出阻抗规定在5到10Ω之间;在这种情况下,它似乎约为5Ω,因为Vspeaker = 800mV≈1.32V×(8Ω/(8Ω+5Ω))。
LT1010的峰值幅度为800 mV,必须提供800 mV /8Ω= 100 mA,这在其最大额定电流范围内非常舒适。现在您了解为什么我们在第二个运算放大器的输入端将电压降低一半:施加到扬声器的1.6 V峰值幅度需要200 mA。 LT1010可能能够承受这一点,因为我们的工作温度适中,因为我们的正弦电流并不是200 mA,但是世界的压力足够大 - 为什么只为演示项目压力LT1010?
固件 该项目的固件在端口I / O,外设和中断方面是相同的。新代码与我们正在生成的新声音频率有关: - #define 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 1164
- #define FILTCLK_A5_INCREMENT 9
- #define SOUND_B5_INCREMENT 1037
- #define FILTCLK_B5_INCREMENT 8
- #define SOUND_C6_INCREMENT 979
- #define FILTCLK_C6_INCREMENT 8
复制代码
现在我们有从C5到C6的所有音符(不包括锐利和平面)的声音信号和时钟信号增量。 主循环重复播放C大调,循环显示相应的增量值,每个音符保持一秒钟: - while(1)
- {
- Current_SoundSignal_Increment = SOUND_C5_INCREMENT;
- Current_FilterClock_Increment = FILTCLK_C5_INCREMENT;
- //delay 1 second
- SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3<10000);
- Current_SoundSignal_Increment = SOUND_D5_INCREMENT;
- Current_FilterClock_Increment = FILTCLK_D5_INCREMENT;
- //delay 1 second
- SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(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);
- }
复制代码
有关振幅随频率增加而减小的原因的说明,请参阅“时钟馈通”部分。 您听到的静电是由录音过程引起的;扬声器发出的声音干净舒适,特别是低音。在下一篇文章中,我们将扩展固件以包含USB连接和附加定时功能,以便我们可以方便地合成旋律。 |