无源蜂鸣器驱动实验的verillog实现

1.蜂鸣器简介

蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳组成。压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器以及共鸣箱、外壳等组成。压电式蜂鸣器是以压电陶瓷的压电效应,来带动金属片的振动而发声;而电磁式蜂鸣器则是用电磁的原理,通电时将金属振动 膜吸下,不通电时以振动膜的弹力弹回。由于两种蜂鸣器发声原理不同,电压式结构简单耐用但音调单一、音色差,适用于报警器等设备;而电磁式由于音色好,所以多用于语音、音乐等设备。        蜂鸣器按其是否带有信号源又分为有源蜂鸣器和无源蜂鸣器。有源蜂鸣器的内部装有集成电路,不需要音频驱动电路,只需要接通直流电源就能直接发出声响。而无源蜂鸣器只有外加音频驱动信号才能发出声响。

uploading.4e448015.gif

正在上传…重新上传取消

无源蜂鸣器驱动原理

无源蜂鸣器与有缘蜂鸣器不同,因其内部不带震荡源,所以其无法向有缘蜂鸣器那样直接用直流信号驱动,这里需要使用PWM方波才能驱动其发声。

如何发出不同的声音呢?上面说到需要使用PWM方波才能驱动其发声,所以这里我们只要控制输入的PWM方波,输入不同的PWM方波发出的声音就不一样了。而不同频率和占空比的方波发出的声音是不同的,其中频率对音调有影响,占空比对音量大小有影响。所以我们只需产生不同频率和占空比的PWM方波去驱动无源蜂鸣器就能让 无源蜂鸣器发出不同的音调了。

uploading.4e448015.gif

正在上传…重新上传取消从图中可以看到,不同频率的波形其单位波形所占时间不同;不同占空比的波形其高电平在单位波形的的占用比例不同。所以我们以此为根据,就能很容易的产生不同频率以及占空比的PWM波了

2.实验目标

驱动无源蜂鸣器进行七个基本音调“哆来咪发梭拉西”的循环鸣叫,每个音阶持续鸣叫0.5s后鸣叫下一个音阶

uploading.4e448015.gif

正在上传…重新上传取消

无源蜂鸣器原理图

由原理图可知,我们只要在BEEP端输入PWM波即可驱动无源蜂鸣器进行鸣叫了

从实验目标我们知道,我们需鸣叫七个音调,而音调是受频率影响的,不同的频率产生的音调即不同,所以这里我们需产生七个不同的频率以发出七个音调,而占空比主要是对音调的音量有影响,这里占空比我们保持为50%即可。七个音调所对应的频率,如表所示

uploading.4e448015.gif

正在上传…重新上传取消

3.波形图绘制

uploading.4e448015.gif

正在上传…重新上传取消

我们需要循环产生七个不同的频率,所以这里我们使用一个计数器对不同频率进行计数,每个频率计一个值。这样我们就能根据计数值来判断我们该产生什么频率的波形了,cnt_500ms就是对0.5s周期计数,需鸣叫七个音调,所以我们需要计7个数(0~6)。而cnt就是算0.5s里有多少个20ns

Do”音调PWM波产生波形图

由实验目标可知,刚开始我们是鸣叫音调“Do”该音调的频率为262,所以这里我们需输出频率为262,占空比为50%的PWM方波。

首先是音调的频率我们该如何产生?我们先计算该频率单个方波的时间:1 / 262 ≈ 0.003816794s=3816794ns而我们单个系统时钟(50MHz的时间为:1 / 50000000 = 0.00000002s = 20ns所以我们需用:3816794 / 20 ≈ 190840个系统时钟去产生一个PWM波,该PWM波形的频率即为262。故我们需先对190840个系统时钟进行计数,这里我们声明freq_cnt信号进行计数。

uploading.4e448015.gif

正在上传…重新上传取消

freq_cnt:音调计数器。我们使用该计数器进行计数,当要鸣叫什么频率的音调我们就让计数器计到该音调所对应的音调分频计数器值即可。这里计数0~190839即为190840个系统时钟,该计数范围内即为一个262频率波形。

freq_data:音调分频计数值。该信号我们用于定义各音调频率的计数值,当我们需要鸣叫什么频率的值时,我们就让该信号的值定义为该频率的计数值。如上图所示我们此时需要输出的PWM波形频率为262,按上面所述的计算方法,计数值即为190839。

duty_data:占空比计数值。通过改变该值我们可改变PWM波的占空比。前面说到我们是产生占空比为50%的波形,即高电平时间所占信号周期的百分比为50%。信号周期为190840话,50%占空比的高电平持续时间即为信号周期的一半,即为95420。

beep:输出控制蜂鸣器信号,该信号即为我们前面说的PWM方波。当我们需要输出频率为262时,我们需要产生波形的一个方波时间为190840个系统时钟,而高电平的持续时间即为95420,,所以如上波形图所示,当音阶计数器(freq_cnt)中的值大于等于占空比计数值时,我们将beep信号输出高电平,小于时输出低电平,这样我们输出的信号即为频率为262,占空比为50%的PWM波了,我们将该信号接入到驱动蜂鸣器的I/O引脚即能驱动蜂鸣器发出“Do”的音调。

Beep的波形不应该在音调计数器范围内(就是3‘d0范围内)只有一个脉冲吗?为什么这么多脉冲?

Beep输出的是一定频率和一定占空比的方波才是发出DO音,不是输出一个脉冲就能发出Do音

以上就是“Do”音调的输出PWM波产生方式,其余音调的产生方式是一样的,我们只要改变freq_data与duty_data的值就能产生不同频率的PWM波了。

uploading.4e448015.gif

正在上传…重新上传取消

根据此表绘制整体波形图        

uploading.4e448015.gif

正在上传…重新上传取消

4.代码

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

仿真代码

uploading.4e448015.gif

正在上传…重新上传取消

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog 是一种硬件描述语言,可以用来描述和设计数字逻辑电路。在使用 Verilog 编写蜂鸣器音乐代码之前,需要了解蜂鸣器的工作原理。 蜂鸣器是一种能够产生声音的电子元件,通常由一个振膜和一个激励器组成。激励器接收到控制信号后,会使振膜振动,从而发出声音。Verilog 可以通过控制信号的高低电平来控制蜂鸣器的工作状态。 下面是一个简单的 Verilog 蜂鸣器音乐代码示例: module music( input clock, output push_btn, output buzzer ); reg [15:0] song; reg [15:0] tone; always @(posedge clock) begin if(push_btn) // 当按下按钮时 song <= 16'b0000000000000001; // 设置歌曲,此处为“咕咕咕咕…”的音乐 else song <= 16'b0000000000000000; // 按钮未按下时停止播放 if(song) // 如果有音乐需要播放 tone <= 16'b0000000000000011; // 设置音调,此处为 do else tone <= 16'b0000000000000000; // 停止音调输出 buzzer <= tone; // 将音调输出到蜂鸣器 end endmodule 在上述代码中,我们定义了一个名为 music 的模块,其中包含一个时钟输入信号 clock,一个按钮输入信号 push_btn,以及一个用于控制蜂鸣器输出的信号 buzzer。 通过 always @(posedge clock) 表示该 always 块在时钟上升沿触发时执行。当按下按钮时,我们设置一个简单的歌曲(16'b0000000000000001),如果按钮未按下,则停止播放(song 信号为 16'b0000000000000000)。 根据歌曲的播放状态,我们设置不同的音调。在上述代码中,我们将音调调整为“do”(16'b0000000000000011),如果没有歌曲需要播放,则停止音调输出。 最后,我们将音调信号 tone 输出到蜂鸣器 buzzer。 需要注意的是,这只是一个简单的示例,并未包含完整的音乐代码。实际上,要编写复杂的蜂鸣器音乐代码,需要根据具体的音乐数据和音调频率进行编写,以实现所需的音乐效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值