STEP FPGA驅動(dòng)無(wú)源蜂鳴器模塊
硬件說(shuō)明
蜂鳴器的分類(lèi):
按其結構主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類(lèi)型:
按是否帶有信號源分為有源蜂鳴器和無(wú)源蜂鳴器兩種類(lèi)型:
本章節和大家一起學(xué)習無(wú)源蜂鳴器的驅動(dòng),FPGA或單片機的GPIO口驅動(dòng)能力弱,不能直接驅動(dòng)無(wú)源蜂鳴器,常用的蜂鳴器驅動(dòng)電路如下:
蜂鳴器使用NPN三極管(9013)驅動(dòng),三極管當開(kāi)關(guān)用,當基極電壓拉高時(shí),蜂鳴器通電,當基極電壓拉低時(shí),蜂鳴器斷電,FPGA控制GPIO口給三極管的基極輸出不同頻率的脈沖信號,蜂鳴器就可以發(fā)出不同的音節。
不同音節與蜂鳴器震蕩頻率的對應關(guān)系如下:
我們使用PWM的方法(關(guān)于PWM的說(shuō)明,快速入門(mén)中的脈沖發(fā)生器章節有詳細的介紹),使用計數器對系統時(shí)鐘進(jìn)行分頻,改變計數器的計數終值從而實(shí)現調節PWM信號頻率的目的,使用PWM信號控制蜂鳴器電路。
Verilog代碼
// -------------------------------------------------------------------- // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // -------------------------------------------------------------------- // Module: Beeper // // Author: Step // // Description: Beeper // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2016/04/20 |Initial ver // -------------------------------------------------------------------- module Beeper ( input clk_in, //系統時(shí)鐘 input rst_n_in, //系統復位,低有效 input tone_en, //蜂鳴器使能信號 input [4:0] tone, //蜂鳴器音節控制 output reg piano_out //蜂鳴器控制輸出) ; /* 無(wú)源蜂鳴器可以發(fā)出不同的音節,與蜂鳴器震動(dòng)的頻率(等于蜂鳴器控制信號的頻率)相關(guān), 為了讓蜂鳴器控制信號產(chǎn)生不同的頻率,我們使用計數器計數(分頻)實(shí)現,不同的音節控制對應不同的計數終值(分頻系數) 計數器根據計數終值計數并分頻,產(chǎn)生蜂鳴器控制信號 */ reg [15:0] time_end;//根據不同的音節控制,選擇對應的計數終值(分頻系數) //低音1的頻率為261.6Hz,蜂鳴器控制信號周期應為12MHz/261.6Hz = 45871.5, //因為本設計中蜂鳴器控制信號是按計數器周期翻轉的,所以幾種終值 = 45871.5/2 = 22936 //需要計數22936個(gè),計數范圍為0 ~ (22936-1),所以time_end = 22935 always@(tone) begin case(tone) 5'd1: time_end = 16'd22935; //L1, 5'd2: time_end = 16'd20428; //L2, 5'd3: time_end = 16'd18203; //L3, 5'd4: time_end = 16'd17181; //L4, 5'd5: time_end = 16'd15305; //L5, 5'd6: time_end = 16'd13635; //L6, 5'd7: time_end = 16'd12147; //L7, 5'd8: time_end = 16'd11464; //M1, 5'd9: time_end = 16'd10215; //M2, 5'd10: time_end = 16'd9100; //M3, 5'd11: time_end = 16'd8589; //M4, 5'd12: time_end = 16'd7652; //M5, 5'd13: time_end = 16'd6817; //M6, 5'd14: time_end = 16'd6073; //M7, 5'd15: time_end = 16'd5740; //H1, 5'd16: time_end = 16'd5107; //H2, 5'd17: time_end = 16'd4549; //H3, 5'd18: time_end = 16'd4294; //H4, 5'd19: time_end = 16'd3825; //H5, 5'd20: time_end = 16'd3408; //H6, 5'd21: time_end = 16'd3036; //H7, default:time_end = 16'd65535; endcaseend reg [17:0] time_cnt;//當蜂鳴器使能時(shí),計數器按照計數終值(分頻系數)計數 always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) begin time_cnt <= 1'b0; end else if(!tone_en) begin time_cnt <= 1'b0; end else if(time_cnt>=time_end) begin time_cnt <= 1'b0; end else begin time_cnt <= time_cnt + 1'b1; endend //根據計數器的周期,翻轉蜂鳴器控制信號 always@(posedge clk_in or negedge rst_n_in) begin if(!rst_n_in) begin piano_out <= 1'b0; end else if(time_cnt==time_end) begin piano_out <= ~piano_out; //蜂鳴器控制輸出翻轉,兩次翻轉為1Hz end else begin piano_out <= piano_out; end end endmodule
小結
本節主要為大家講解了蜂鳴器的不同類(lèi)型及無(wú)源蜂鳴器的驅動(dòng)原理,需要大家掌握的同時(shí)自己創(chuàng )建工程,通過(guò)整個(gè)設計流程,生成FPGA配置文件加載測試。
評論