您的当前位置:首页正文

2021年蜂鸣器实验报告

2022-08-06 来源:个人技术集锦
实 验 报 告

试验名称: 姓 名: 学 号: 指导老师: 试验时间: [6 [蜂鸣器音乐发生器试验]月15日] 信息与通信工程学院

1 试验要求

用所学知识和编程技巧, 编写一段程序, 实现用蜂鸣器演奏一首歌曲。按下(sw2)

按键, 蜂鸣器唱出一首歌, 歌曲能够自己选择, 关键是经过不一样频率来实现不一样音调。

2 试验原理

2.1蜂鸣器类型

蜂鸣器关键分为压电式蜂鸣器和电磁式蜂鸣器两种类型。1、 压电式蜂鸣器关键由多谐振荡、 压电蜂鸣片、 阻抗匹配器及共鸣箱、 外壳等组成。多谐振荡器由晶体管或集成电路组成。当接通电源后(1.5~15V直流工作电压), 多谐振荡器起振,输出1.5~2.5kHZ音频信号, 阻抗匹配器推进压电蜂鸣片发声。2、 电磁式蜂鸣器由振荡器、 电磁线圈、 磁铁、 振动膜片及外壳等组成。接通电源后, 振荡器产生音频信号电流经过电磁线圈, 使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁相互作用下, 周期性地振动发声。

试验箱上蜂鸣器驱动原理: 经过FPGA143管脚驱动蜂鸣器发声, 不一样频率使蜂鸣器发出不一样音调。

2.2音乐歌曲元素

一首歌曲由音调和节拍两个关键元素组成。对于蜂鸣器来说, 频率高低决定了音调高低。全部不一样频率信号都是从同一个基准频率分频得来。因为音阶频率多为非整数, 而分频系数又不能为小数, 故必需 将计算得到分频数四舍五入取整。若基准频率过低, 则因为分频比太小, 四舍五入取证后误差较大。若基准频率过高, 即使误差变小, 但分频数将变大。实际设计在尽可能减小频率误差前提下去适宜基准频率。

给蜂鸣器输入对应频率, 能够使其发出表中所表示低音、 中音、 高音do~xi声音。将其根据音乐演奏规律组合, 便能够得到所需要乐曲。

2.3任务原理

2.3.1音调控制

频率高低决定了音调高低。音乐十二平均率要求; 每两个8度音之间频率相差1倍。在两个8度音之间, 又可分为12个半音, 每两个半音频率比为

122。另外, 音名A频率为440Hz,

音名B到C直接、 E到F之间为半音, 其它为全音。由此能够计算出简谱中从低音1至高音1之间每个音名对应频率如表1中所表示。 音名 低音1 低音2 低音3 低音4 低音5 低音6 低音7 频率/Hz 261.6 293.7 329.6 349.2 392 440 493.9 音名 中音1 中音2 中音3 中音4 中音5 中音6 中音7 频率/Hz 523.3 587.3 659.3 698.5 784 880 987.8 音名 高音1 高音2 高音3 高音4 高音5 高音6 高音7 频率/Hz 1046.5 1174.7 1318.5 1396.9 1568 1760 1975.5 表1 简谱中音名与频率关系 全部不一样频率信号都是从同一个基准频率分频到, 因为音阶频率多为非整数, 而分频系数又不能为小数, 故必需将计算得到分频数四舍五入取整。实际设计中, 在尽可能减小频率误差前提下取适合基准频率, 本试验中取6MHz为基准频率。

本题需要演奏是两只老虎乐曲, 该乐曲各音阶频率及对应分频比如表2所表示, 为了减小输出偶次谐波分量, 最终输出到蜂鸣器波形应为对称方波, 所以在抵达蜂鸣器之前,

有一个二分频分频器。 音名 低音3 低音5 低音6 低音7 中音1 分频比 9102 7653 6818 6073 5736 预置数 7281 8730 9565 10310 10647 音名 中音2 中音3 中音5 中音6 高音1 分频比 5111 4552 3827 3409 2867 预置数 11272 11831 12556 12974 13516 表2 各音阶频率对应分频比及预置数 另外, 对于乐曲中休止符, 只要将分频系数设为0, 即初始值为2141=16383即可, 此时蜂鸣器不会发声。 2.3.2 音长控制

音符连续时间必需依据乐曲速度及每个音符节拍数来确定。本试验中最短音符为4分音符, 假如将全音符连续时间设为1s话, 则只需要再提供一个4Hz时钟频率即可产生4分音符时长。

如图1所表示是乐曲演奏电路原理框, 其中, 乐谱产生电路用来控制音乐音调和音长。控制音调经过设置计数器来实现, 预置不一样数值能够使计数器产生不一样频率信号, 从而产生不一样音调。控制音长是经过控制计数器预置数停留时间来实现, 预置数停留时间越长, 则该音符演奏时间越长。每个音符演奏时间都是0.25s整数倍, 对于节拍长音符, 在记谱时可连续统计数次即可。

2.4 试验步骤图

图1 乐曲演奏电路原理框图

3 FPGA所用管脚分配

4试验结果: 在编辑框内输入好程序以后, 对程序进行编译, 检验错误, 无误后将其下

载到试验箱后, 即可实现演奏两只老虎歌曲, 可用按键sw2对其进行控制, 当按键按下后, 停止演奏, 不然一直循环演奏。

5试验心得

经过这次试验, 第一、 我学到了一个有时序功效器件怎样用verilog语言实现其功效。在阅读程序、 修改程序过程中我愈加熟悉了verilog语言, 掌握了基础编写程序技巧和能力。第二、 我认识到了实际用软件实现对应功效, 原理起源于数字电路基础知识, 但又区分与书本上内容。而学习了verilog语言, 我意识到, 不能从原有思维方法出发进行分析和编程, 必需建立整体概念, 从输入输出整体功效出发用程序建立模块。并经过模块和模块嵌套或者连接实现对应功效。第三、 经过修改程序联络, 我体会到了怎样结合实际模块时序功效用程序实现对器件控制。

为了在课堂上完成这次试验, 课下真需要下一番功夫。首先, 自己认真提前学习语言编程, 又在课上听老师讲解关键。课下自己编写了部分简单小程序, 以熟悉语言, 不过在课上分析整体程序还是有一定困难, 在老师讲解下, 才慢慢了解。在了解基础上修改程序很简单, 不过想要自己独立编写这么一个程序, 我想, 还需要很长时间实践才能得以实现。所以, 还有很多需要努力地方。

经过这次试验, 学到了很多东西, 体会到了自己实现一个程序功效小小喜悦, 也认识到了自己只是FPGA道路上新手, 还有很多未知知识需要学习。真正学习历程需要在课下多下功夫, 期望经过这学期学习自己能熟练掌握部分编程技术, 培养良好思维模式。

6 参考文件

[1] 王金明. 《数字系统设计与Verilog HDL》第3版、 第2版, 电子工业出版社, 、 . TP271/W24.

[2] 夏宇闻. 《Verilog数字系统设计教程》, 北京航空航天大学出版社, 第1、 2版, . TP312VH/X31.

[3] 蒋璇, 臧春华. 《数字系统设计与PLD应用技术》, 电子工业出版社, TP271/J63. [4] 张前, 王次炤, 《音乐美学基础》, 人民音乐出版社,1992.05, J601/Z22

附录1: 两只老虎曲谱图

附录2: 程序清单

//音高与频率对应关系

//---------------------------------------------------------------------- //| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | //|低音 |261.6Hz |293.7Hz |329.6Hz |349.2Hz | 392Hz | 440Hz |493.9Hz | //|中音 |523.3Hz |587.3Hz |659.3Hz |698.5Hz | 784Hz | 880Hz |987.8Hz | //|高音 |1045.5Hz|1174.7Hz|1318.5Hz|1396.9Hz| 1568Hz | 1760Hz |1975.5Hz| //---------------------------------------------------------------------- module liangzhi(clk,beep); //模块名称song input clk; //系统时钟50MHz output beep; //蜂鸣器输出端 reg beep_r; //寄存器 reg[7:0] state; //乐谱状态机 reg[15:0]count,count_end; reg[23:0]count1;

//乐谱参数:D=F/2K (D:参数,F:时钟频率,K:音高频率) parameter L_5 = 16'd63776, //低音5 M_1 = 16'd47774, //中音1 M_2 = 16'd42568, //中音2 M_3 = 16'd37919, //中音3 M_4 = 16'd35791, //中音4 M_5 = 16'd31888,

M_6 = 16'd28409; //中音5

parameter TIME = 1000; //控制每一个音长短(250ms)

assign beep = beep_r; //输出音乐

always@(posedge clk) begin

count <= count + 1'b1; //计数器加1 if(count == count_end)

begin

count <= 16'h0; beep_r <= !beep_r; end end

always @(posedge clk) begin

if(count1 < TIME) count1 = count1 + 1'b1; else begin

count1 = 24'd0;

if(state == 8'd35) //64 state = 8'd0; else

state = state + 1'b1; case(state)

8'd0: count_end = M_1;//拍

8'd1: count_end = M_2;//拍

8'd2: count_end = M_3;//拍

8'd3: count_end = M_1;//拍

8'd4: count_end = M_1; 8'd5: count_end = M_2; 8'd6: 8'd7: 8'd8: count_end = M_3; 8'd9: 8'd10,8'd11: count_end = M_5;

8'd12: count_end = M_3; 8'd13: count_end = M_4; 8'd14,8'd15: 8'd16: count_end = M_5; 8'd17: count_end = M_6; 8'd18: count_end = M_5; 8'd19: count_end = M_4; 8'd20: count_end = M_3; 8'd21: count_end = M_1; 8'd22: 8'd23: //计数器清零 //输出取反 //一个节拍250mS 个节拍后循环 中音\"1\连续1个节中音\"2\连续1个节中音\"3\连续1个节中音\"1\连续2个节 count_end = M_3; count_end = M_1; count_end = M_4; count_end = M_5; count_end = M_5; count_end = M_6;

8'd24: count_end = M_5; 8'd25: count_end = M_4; 8'd26: count_end = M_3; 8'd27: count_end = M_1; 8'd28: count_end = M_2; 8'd29: count_end = L_5; 8'd30,8'd31: count_end = M_1; 8'd32: count_end = M_2; 8'd33: count_end = L_5;

8'd34,8'd35: endcase end end

endmodule

count_end = M_1;

因篇幅问题不能全部显示,请点此查看更多更全内容