基于 STEP-MAX10M08核心板的簡(jiǎn)易電子琴設(shè)計(jì)
實(shí)驗(yàn)任務(wù)
實(shí)驗(yàn)?zāi)康?/h4>在基礎(chǔ)數(shù)字電路實(shí)驗(yàn)部分我們已經(jīng)掌握了FPGA設(shè)計(jì)PWM信號(hào)發(fā)生器的原理及方法,上節(jié)實(shí)驗(yàn)中又學(xué)習(xí)了矩陣鍵盤(pán)的驅(qū)動(dòng)原理及方法,本實(shí)驗(yàn)主要學(xué)習(xí)無(wú)源蜂鳴器的驅(qū)動(dòng)原理,同時(shí)熟悉PWM發(fā)生模塊及矩陣鍵盤(pán)驅(qū)動(dòng)模塊的實(shí)例化應(yīng)用。
本文引用地址:http://2s4d.com/article/202311/453309.htm設(shè)計(jì)框圖
根據(jù)前面的實(shí)驗(yàn)解析我們可以得知,該設(shè)計(jì)總體可以拆分成兩個(gè)功能模塊實(shí)現(xiàn),
實(shí)驗(yàn)原理
蜂鳴器介紹
蜂鳴器的分類: 按其結(jié)構(gòu)主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型:
按是否帶有信號(hào)源分為有源蜂鳴器和無(wú)源蜂鳴器兩種類型:
我們STEP BaseBoard V3.0底板上集成的蜂鳴器為無(wú)源電磁式蜂鳴器,接下來(lái)和大家一起學(xué)習(xí)無(wú)源蜂鳴器的驅(qū)動(dòng)
蜂鳴器驅(qū)動(dòng)電路
無(wú)源蜂鳴器沒(méi)有集成振蕩器,需要外部提供震蕩激勵(lì),當(dāng)震蕩頻率不同時(shí)發(fā)出不同的音調(diào),對(duì)于數(shù)字系統(tǒng)來(lái)說(shuō),方波信號(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)開(kāi)關(guān)用,當(dāng)基極電壓拉高時(shí),蜂鳴器通電,當(dāng)基極電壓拉低時(shí),蜂鳴器斷電,F(xiàn)PGA控制GPIO口給三極管的基極輸出不同頻率的脈沖信號(hào),蜂鳴器就可以發(fā)出不同的音節(jié)。
蜂鳴器驅(qū)動(dòng)設(shè)計(jì)
前面我們了解到電磁式無(wú)源蜂鳴器需要外部提供震蕩激勵(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í)過(guò)PWM產(chǎn)生原理,設(shè)計(jì)過(guò)一個(gè)PWM信號(hào)發(fā)生器模塊,模塊根據(jù)兩個(gè)輸入信號(hào)(cycle、duty)控制產(chǎn)生周期可控、占空比可控的脈沖信號(hào)(pwm_out),可以用來(lái)驅(qū)動(dòng)無(wú)源蜂鳴器電路。
PWM模塊端口程序如下:
module PWM #(parameter WIDTH = 32 //ensure that 2**WIDTH > cycle)(input clk,input rst_n,input [WIDTH-1:0] cycle, //cycle > dutyinput [WIDTH-1:0] duty, //duty < cycleoutput reg pwm_out);
驅(qū)動(dòng)蜂鳴器的脈沖信號(hào)對(duì)占空比沒(méi)有太高的要求,我們默認(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ì)算出來(lái),當(dāng)按動(dòng)不同按鍵時(shí)給PWM模塊不同的cycle值就可以了,我們可以通過(guò)設(shè)計(jì)一個(gè)轉(zhuǎn)碼模塊(tone)將按鍵信息轉(zhuǎn)換成PWM需要的cycle信號(hào),矩陣鍵盤(pán)共有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,低電平
endcaseend
現(xiàn)在我們?cè)贐eeper模塊中實(shí)例化tone和PWM模塊,將tone的輸出與PWM的cycle輸入連線就實(shí)現(xiàn)了按鍵信息產(chǎn)生對(duì)應(yīng)音節(jié)的輸出了,想一想邏輯有問(wèn)題嗎?
應(yīng)該沒(méi)錯(cuò)了,到這里我們就完成了蜂鳴器音節(jié)驅(qū)動(dòng)部分。
系統(tǒng)總體實(shí)現(xiàn)
前次實(shí)驗(yàn)中我們學(xué)習(xí)了矩陣鍵盤(pán)的驅(qū)動(dòng)原理及方法,這里就不再重復(fù),不一樣的是之前我們用的矩陣鍵盤(pán)模塊的脈沖輸出(keypulse),本實(shí)驗(yàn)中簡(jiǎn)易電子琴在按鍵按下?tīng)顟B(tài)下一直發(fā)聲,跟按鍵時(shí)間長(zhǎng)短有關(guān),這樣我們就不能使用keypulse了,而應(yīng)該使用keyout信號(hào),另外keyout按鍵有效輸出為低電平,而PWM周期轉(zhuǎn)碼模塊(tone)是高有效編碼,所以在頂層模塊(ElectricPiano)中矩陣鍵盤(pán)(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ì)框圖如下:
在基礎(chǔ)數(shù)字電路實(shí)驗(yàn)部分我們已經(jīng)掌握了FPGA設(shè)計(jì)PWM信號(hào)發(fā)生器的原理及方法,上節(jié)實(shí)驗(yàn)中又學(xué)習(xí)了矩陣鍵盤(pán)的驅(qū)動(dòng)原理及方法,本實(shí)驗(yàn)主要學(xué)習(xí)無(wú)源蜂鳴器的驅(qū)動(dòng)原理,同時(shí)熟悉PWM發(fā)生模塊及矩陣鍵盤(pán)驅(qū)動(dòng)模塊的實(shí)例化應(yīng)用。
本文引用地址:http://2s4d.com/article/202311/453309.htm根據(jù)前面的實(shí)驗(yàn)解析我們可以得知,該設(shè)計(jì)總體可以拆分成兩個(gè)功能模塊實(shí)現(xiàn),
蜂鳴器的分類: 按其結(jié)構(gòu)主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型:
按是否帶有信號(hào)源分為有源蜂鳴器和無(wú)源蜂鳴器兩種類型:
我們STEP BaseBoard V3.0底板上集成的蜂鳴器為無(wú)源電磁式蜂鳴器,接下來(lái)和大家一起學(xué)習(xí)無(wú)源蜂鳴器的驅(qū)動(dòng)
無(wú)源蜂鳴器沒(méi)有集成振蕩器,需要外部提供震蕩激勵(lì),當(dāng)震蕩頻率不同時(shí)發(fā)出不同的音調(diào),對(duì)于數(shù)字系統(tǒng)來(lái)說(shuō),方波信號(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)開(kāi)關(guān)用,當(dāng)基極電壓拉高時(shí),蜂鳴器通電,當(dāng)基極電壓拉低時(shí),蜂鳴器斷電,F(xiàn)PGA控制GPIO口給三極管的基極輸出不同頻率的脈沖信號(hào),蜂鳴器就可以發(fā)出不同的音節(jié)。
前面我們了解到電磁式無(wú)源蜂鳴器需要外部提供震蕩激勵(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í)過(guò)PWM產(chǎn)生原理,設(shè)計(jì)過(guò)一個(gè)PWM信號(hào)發(fā)生器模塊,模塊根據(jù)兩個(gè)輸入信號(hào)(cycle、duty)控制產(chǎn)生周期可控、占空比可控的脈沖信號(hào)(pwm_out),可以用來(lái)驅(qū)動(dòng)無(wú)源蜂鳴器電路。
PWM模塊端口程序如下:
module PWM #(parameter WIDTH = 32 //ensure that 2**WIDTH > cycle)(input clk,input rst_n,input [WIDTH-1:0] cycle, //cycle > dutyinput [WIDTH-1:0] duty, //duty < cycleoutput reg pwm_out);
驅(qū)動(dòng)蜂鳴器的脈沖信號(hào)對(duì)占空比沒(méi)有太高的要求,我們默認(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ì)算出來(lái),當(dāng)按動(dòng)不同按鍵時(shí)給PWM模塊不同的cycle值就可以了,我們可以通過(guò)設(shè)計(jì)一個(gè)轉(zhuǎn)碼模塊(tone)將按鍵信息轉(zhuǎn)換成PWM需要的cycle信號(hào),矩陣鍵盤(pán)共有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,低電平 endcaseend
現(xiàn)在我們?cè)贐eeper模塊中實(shí)例化tone和PWM模塊,將tone的輸出與PWM的cycle輸入連線就實(shí)現(xiàn)了按鍵信息產(chǎn)生對(duì)應(yīng)音節(jié)的輸出了,想一想邏輯有問(wèn)題嗎?
應(yīng)該沒(méi)錯(cuò)了,到這里我們就完成了蜂鳴器音節(jié)驅(qū)動(dòng)部分。
前次實(shí)驗(yàn)中我們學(xué)習(xí)了矩陣鍵盤(pán)的驅(qū)動(dòng)原理及方法,這里就不再重復(fù),不一樣的是之前我們用的矩陣鍵盤(pán)模塊的脈沖輸出(keypulse),本實(shí)驗(yàn)中簡(jiǎn)易電子琴在按鍵按下?tīng)顟B(tài)下一直發(fā)聲,跟按鍵時(shí)間長(zhǎng)短有關(guān),這樣我們就不能使用keypulse了,而應(yīng)該使用keyout信號(hào),另外keyout按鍵有效輸出為低電平,而PWM周期轉(zhuǎn)碼模塊(tone)是高有效編碼,所以在頂層模塊(ElectricPiano)中矩陣鍵盤(pán)(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ì)框圖如下:
評(píng)論