09_基于FPGA驱动蜂鸣器唱歌
09_基于FPGA驱动蜂鸣器唱歌
实验原理
结构原理
1.压电式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。
多谐振荡器由晶体管或集成电路构成。当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
2.电磁式蜂鸣器 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
有源蜂鸣器和无源蜂鸣器
教你区分有源蜂鸣器和无源蜂鸣器
现在市场上出售的一种小型蜂鸣器因其体积小(直径只有llmm)、重量轻、价格低、结构牢靠,而广泛地应用在各种需要发声的电器设备、电子制作和单片机等电路中。
从外观上看,两种蜂鸣器好像一样,但仔细看,两者的高度略有区别,有源蜂鸣器高度为9mm,而无源蜂鸣器的高度为8mm。如将两种蜂鸣器的引脚郡朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。
迸一步判断有源蜂鸣器和无源蜂鸣器,还可以用万用表电阻档Rxl档测试:用黑表笔接蜂鸣器 "+"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。
有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。
实验设计原理
乐曲演奏的原理是:由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率持续的时间。频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率对应关系如下表所示。
所有不同频率的信号都是从同一基准频率分频而来的。由于音节频率多为非整数,而分频系数又不能为小数,故必须计算得到的分频系数进行四舍五入取整,并且其基准频率和分频系数应综合加以选择,从而保证音乐不会走调。开发板的晶振为50MHZ,故在50M HZ时钟下,中音1(对应的频率值为523.3Hz)的分频系数为50000000/(2*523.3)=47774,这样只需对系统时钟进行47774次分频即可得到所要的中音1。可利用同样方法求出其他音符对应的分频系数,这样利用程序可以很轻松得到相应的乐声。
根据蜂鸣器的发声原理,程序中设置了一个状态机,同时产生一个时钟作为音长的控制,时钟周期为250ms,每250ms改变一个状态(即一个节拍),组成乐曲的每个频率值(音调)相对于状态机的每一个状态。只要让状态机的状态按顺序转换,就可以自动播放音乐了!
硬件原理图
实验代码
/********************************版权声明************************************** ** 大西瓜团队 ** **----------------------------文件信息-------------------------- ** 文件名称: song.v ** 创建日期: ** 功能描述: ** 硬件平台:大西瓜第三代开发板,http://daxiguafpga.taobao.com ** 版权声明:本代码属个人知识产权,本代码仅供交流学习. **---------------------------修改文件的相关信息---------------- ** 修改人: ** 修改日期: ** 修改内容: *******************************************************************************/ //音高与频率的对应关系 //---------------------------------------------------------------------- //| | 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 song(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_3 = 16'd75850, //低音3 L_5 = 16'd63776, //低音5 L_6 = 16'd56818, //低音6 L_7 = 16'd50618, //低音7 M_1 = 16'd47774, //中音1 M_2 = 16'd42568, //中音2 M_3 = 16'd37919, //中音3 M_5 = 16'd31888, //中音5 M_6 = 16'd28409, //中音6 H_1 = 16'd23912; //高音1 parameter TIME = 12000000; //控制每一个音的长短(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) //一个节拍250mS count1 = count1 + 1'b1; else begin count1 = 24'd0; if(state == 8'd66) state = 8'd0; else state = state + 1'b1; case(state) 8'd0,8'd1,8'd2,8'd3: count_end = L_3;//低音"3",持续4个节拍 8'd4,8'd5,8'd6: count_end = L_5;//低音"5",持续3个节拍 8'd7: count_end = L_6;//低音"6",持续1个节拍 8'd8,8'd9,8'd10: count_end = M_1;//中音"1",持续3个节拍 8'd11: count_end = M_2;//中音"2",持续1个节拍 8'd12: count_end = L_6;//低音"6",持续1个节拍 8'd13: count_end = M_1;//中音"1",持续1个节拍 8'd14,8'd15: count_end = L_5;//低音"5",持续2个节拍 8'd16: count_end = M_1;//中音"1",持续1个节拍 8'd17,8'd18: count_end = L_5;//低音"5",持续2个节拍 8'd19,8'd20,8'd21: count_end = M_5;//中音"5",持续3个节拍 8'd22: count_end = H_1;//高音"1",持续1个节拍 8'd23: count_end = M_6;//中音"6",持续1个节拍 8'd24: count_end = M_5;//中音"5",持续1个节拍 8'd25: count_end = M_3;//中音"3",持续1个节拍 8'd26: count_end = M_5;//中音"5",持续1个节拍 8'd27,8'd28,8'd29,8'd30,8'd31, 8'd32,8'd33,8'd34,8'd35,8'd36,8'd37:count_end = M_2;//中音"2",持续11个节拍 8'd38: count_end = M_3;//中音"3",持续1个节拍 8'd39,8'd40: count_end = L_7;//低音"7",持续2个节拍 8'd41,8'd42: count_end = L_6;//低音"6",持续2个节拍 8'd43,8'd44,8'd45: count_end = L_5;//低音"5",持续3个节拍 8'd46: count_end = L_6;//低音"6",持续1个节拍 8'd47,8'd48: count_end = M_1;//中音"1",持续2个节拍 8'd49,8'd50: count_end = M_2;//中音"2",持续2个节拍 8'd51,8'd52: count_end = L_3;//低音"3",持续2个节拍 8'd53,8'd54,8'd55: count_end = M_1;//中音"1",持续3个节拍 8'd56,8'd57: count_end = L_5;//低音"5",持续2个节拍 8'd58: count_end = M_1;//中音"1",持续1个节拍 8'd59,8'd60,8'd61,8'd62,8'd63, 8'd64,8'd65,8'd66: count_end = L_5;//低音"5",持续8个节拍
endcase end end endmodule |
实验操作
实验效果
大西瓜FPGA-->https://daxiguafpga.taobao.com
配套开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-24211932856.3.489d7241aCjspB&id=633897209972
博客资料、代码、图片、文字等属大西瓜FPGA所有,切勿用于商业! 若引用资料、代码、图片、文字等等请注明出处,谢谢!
每日推送不同科技解读,原创深耕解读当下科技,敬请关注微信公众号"科乎"。