簡(jiǎn)易電子琴設(shè)計(jì)
實(shí)驗(yàn)任務(wù)
實(shí)驗(yàn)?zāi)康?/span>
在基礎(chǔ)數(shù)字電路實(shí)驗(yàn)部分我們已經(jīng)掌握了FPGA設(shè)計(jì)PWM信號(hào)發(fā)生器的原理及方法,上節(jié)實(shí)驗(yàn)中又學(xué)習(xí)了矩陣鍵盤的驅(qū)動(dòng)原理及方法,本實(shí)驗(yàn)主要學(xué)習(xí)無源蜂鳴器的驅(qū)動(dòng)原理,同時(shí)熟悉PWM發(fā)生模塊及矩陣鍵盤驅(qū)動(dòng)模塊的實(shí)例化應(yīng)用。
本文引用地址:http://butianyuan.cn/article/202312/453641.htm設(shè)計(jì)框圖
根據(jù)前面的實(shí)驗(yàn)解析我們可以得知,該設(shè)計(jì)總體可以拆分成兩個(gè)功能模塊實(shí)現(xiàn),
實(shí)驗(yàn)原理
蜂鳴器介紹
蜂鳴器的分類: 按其結(jié)構(gòu)主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型:
按是否帶有信號(hào)源分為有源蜂鳴器和無源蜂鳴器兩種類型:
我們STEP BaseBoard V3.0底板上集成的蜂鳴器為無源電磁式蜂鳴器,接下來和大家一起學(xué)習(xí)無源蜂鳴器的驅(qū)動(dòng)
蜂鳴器驅(qū)動(dòng)電路
無源蜂鳴器沒有集成振蕩器,需要外部提供震蕩激勵(lì),當(dāng)震蕩頻率不同時(shí)發(fā)出不同的音調(diào),對(duì)于數(shù)字系統(tǒng)來說,方波信號(hào)產(chǎn)生方便可靠,成為外部震蕩激勵(lì)的首選,方波信號(hào)輸入諧振裝置轉(zhuǎn)換為聲音信號(hào)輸出,電磁式蜂鳴器需要的驅(qū)動(dòng)電流較高,一般單片機(jī)和FPGA管腳驅(qū)動(dòng)能力有限不能直接驅(qū)動(dòng),常用三極管增加驅(qū)動(dòng)能力,另外電磁式蜂鳴器內(nèi)部含有感應(yīng)線圈,在電路通斷瞬間會(huì)產(chǎn)生感應(yīng)電勢(shì),為保證電路長(zhǎng)期穩(wěn)定的工作,最好增加續(xù)流二極管設(shè)計(jì),STEP BaseBoard V3.0底板蜂鳴器驅(qū)動(dòng)電路如下:
注:不需要蜂鳴器工作時(shí),控制器BEEP端口輸出低電平,管腳配置下拉(pull dowm)模式
蜂鳴器使用NPN三極管(S8050)驅(qū)動(dòng),三極管當(dāng)開關(guān)用,當(dāng)基極電壓拉高時(shí),蜂鳴器通電,當(dāng)基極電壓拉低時(shí),蜂鳴器斷電,F(xiàn)PGA控制GPIO口給三極管的基極輸出不同頻率的脈沖信號(hào),蜂鳴器就可以發(fā)出不同的音節(jié)。
蜂鳴器驅(qū)動(dòng)設(shè)計(jì)
前面我們了解到電磁式無源蜂鳴器需要外部提供震蕩激勵(lì)才可以發(fā)出聲音,且震蕩頻率不同產(chǎn)生的音調(diào)也不同,不同音節(jié)與蜂鳴器震蕩頻率的對(duì)應(yīng)關(guān)系如下表:
音調(diào)頻率對(duì)照表
音節(jié)名 | 頻率(Hz) | 音節(jié)名 | 頻率(Hz) | 音節(jié)名 | 頻率(Hz) |
低音1 | 261.6 | 中音1 | 523.3 | 高音1 | 1045.5 |
低音2 | 293.7 | 中音2 | 587.3 | 高音2 | 1174.7 |
低音3 | 329.6 | 中音3 | 659.3 | 高音3 | 1318.5 |
中音4 | 349.2 | 中音4 | 698.5 | 高音4 | 1396.9 |
低音5 | 392 | 中音5 | 784 | 高音5 | 1568 |
低音6 | 440 | 中音6 | 880 | 高音6 | 1760 |
低音7 | 493.9 | 中音7 | 987.8 | 高音7 | 1975.5 |
FPGA要驅(qū)動(dòng)蜂鳴器就需要給蜂鳴器模塊輸出《音調(diào)頻率對(duì)照表》中不同頻率的脈沖信號(hào)就可以了,我們?cè)诨A(chǔ)數(shù)字電路實(shí)驗(yàn)中學(xué)習(xí)過PWM產(chǎn)生原理,設(shè)計(jì)過一個(gè)PWM信號(hào)發(fā)生器模塊,模塊根據(jù)兩個(gè)輸入信號(hào)(cycle、duty)控制產(chǎn)生周期可控、占空比可控的脈沖信號(hào)(pwm_out),可以用來驅(qū)動(dòng)無源蜂鳴器電路。
PWM模塊端口程序如下:
module PWM # ( parameter WIDTH = 32 //ensure that 2**WIDTH > cycle ) ( input clk, input rst_n, input [WIDTH-1:0] cycle, //cycle > duty input [WIDTH-1:0] duty, //duty < cycle output reg pwm_out );
驅(qū)動(dòng)蜂鳴器的脈沖信號(hào)對(duì)占空比沒有太高的要求,我們默認(rèn)產(chǎn)生50%占空比的脈沖信號(hào),所以duty的輸入取cycle的一半;cycle的值關(guān)乎蜂鳴器的音節(jié),需要和《音調(diào)頻率對(duì)照表》中對(duì)應(yīng),例如如果要蜂鳴器發(fā)出低音1的音節(jié),脈沖信號(hào)頻率控制為261.6Hz,系統(tǒng)時(shí)鐘采用12MHz,計(jì)數(shù)器計(jì)數(shù)終值cycle就等于12M / 261.6 = 45872,即當(dāng)我們給PWM模塊中cycle信號(hào)的值為45872時(shí),得到低音1的音節(jié)輸出。這樣我們將每個(gè)音節(jié)對(duì)應(yīng)的cycle值計(jì)算出來,當(dāng)按動(dòng)不同按鍵時(shí)給PWM模塊不同的cycle值就可以了,我們可以通過設(shè)計(jì)一個(gè)轉(zhuǎn)碼模塊(tone)將按鍵信息轉(zhuǎn)換成PWM需要的cycle信號(hào),矩陣鍵盤共有16個(gè)按鍵,我們只能輸出16個(gè)音節(jié)。
PWM周期轉(zhuǎn)碼程序?qū)崿F(xiàn)如下:
always@(key_in) begin case(key_in) 16'h0001: cycle = 16'd45872; //L1, 16'h0002: cycle = 16'd40858; //L2, 16'h0004: cycle = 16'd36408; //L3, 16'h0008: cycle = 16'd34364; //L4, 16'h0010: cycle = 16'd30612; //L5, 16'h0020: cycle = 16'd27273; //L6, 16'h0040: cycle = 16'd24296; //L7, 16'h0080: cycle = 16'd22931; //M1, 16'h0100: cycle = 16'd20432; //M2, 16'h0200: cycle = 16'd18201; //M3, 16'h0400: cycle = 16'd17180; //M4, 16'h0800: cycle = 16'd15306; //M5, 16'h1000: cycle = 16'd13636; //M6, 16'h2000: cycle = 16'd12148; //M7, 16'h4000: cycle = 16'd11478; //H1, 16'h8000: cycle = 16'd10215; //H2, default: cycle = 16'd0; //cycle為0,PWM占空比為0,低電平 endcase end
現(xiàn)在我們?cè)贐eeper模塊中實(shí)例化tone和PWM模塊,將tone的輸出與PWM的cycle輸入連線就實(shí)現(xiàn)了按鍵信息產(chǎn)生對(duì)應(yīng)音節(jié)的輸出了,想一想邏輯有問題嗎?
應(yīng)該沒錯(cuò)了,到這里我們就完成了蜂鳴器音節(jié)驅(qū)動(dòng)部分。
系統(tǒng)總體實(shí)現(xiàn)
前次實(shí)驗(yàn)中我們學(xué)習(xí)了矩陣鍵盤的驅(qū)動(dòng)原理及方法,這里就不再重復(fù),不一樣的是之前我們用的矩陣鍵盤模塊的脈沖輸出(keypulse),本實(shí)驗(yàn)中簡(jiǎn)易電子琴在按鍵按下狀態(tài)下一直發(fā)聲,跟按鍵時(shí)間長(zhǎng)短有關(guān),這樣我們就不能使用keypulse了,而應(yīng)該使用keyout信號(hào),另外keyout按鍵有效輸出為低電平,而PWM周期轉(zhuǎn)碼模塊(tone)是高有效編碼,所以在頂層模塊(ElectricPiano)中矩陣鍵盤(ArrayKeyBoard)與蜂鳴器音節(jié)驅(qū)動(dòng)模塊(Beeper)之間的key_out連線需要做按位取反操作。
總體設(shè)計(jì)程序?qū)崿F(xiàn)如下:
//Array_KeyBoard Array_KeyBoard u1 ( .clk (clk ), .rst_n (rst_n ), .col (col ), .row (row ), .key_out (key_out ), .key_pulse (key_pulse ) ); //beeper moduleBeeper u2(.clk (clk ), .rst_n (rst_n ), .key_out (~key_out ), .beeper (beeper ) );
綜合后的設(shè)計(jì)框圖如下:
實(shí)驗(yàn)步驟
實(shí)驗(yàn)現(xiàn)象
將簡(jiǎn)易電子琴設(shè)計(jì)配置文件燒寫到FPGA實(shí)驗(yàn)平臺(tái),按動(dòng)矩陣按鍵聽蜂鳴器發(fā)出的聲音,16個(gè)按鍵對(duì)應(yīng)16個(gè)音節(jié),按鍵K1~K7分別對(duì)應(yīng)音節(jié)低音1~7,接下來一首好聽的《小星星》送給大家,按照下面的曲譜循環(huán)彈奏: 1 1 5 5 6 6 5 , 4 4 3 3 2 2 1 , 5 5 4 4 3 3 2 , 5 5 4 4 3 3 2
按照曲譜彈奏琴電子琴?zèng)]有什么難度,如果我們?cè)O(shè)計(jì)一個(gè)狀態(tài)機(jī),在狀態(tài)跳轉(zhuǎn)時(shí)能夠產(chǎn)生上述的音節(jié)信息,再配合我們今天講的蜂鳴器音節(jié)驅(qū)動(dòng)設(shè)計(jì),就可以實(shí)現(xiàn)一個(gè)音樂盒了,有興趣的同學(xué)不妨嘗試一下。
評(píng)論