<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > 簡易電子琴設計

          簡易電子琴設計

          作者:時間:2023-12-07來源:電子森林收藏
          • 任務:基于核心板 和 底板 完成簡易電子琴設計并觀察調試結果
          • 要求:按動,驅動底板無源蜂鳴器發出產生不同音調,彈奏一首《小星星》。
          • 解析:通過編程驅動電路,獲取鍵入的信息,然后通過編碼將鍵盤輸出的信息譯碼成對應的音節數據,最后通過PWM發生模塊驅動底板上的無源蜂鳴器發出聲音。

          在基礎數字電路實驗部分我們已經掌握了設計PWM信號發生器的原理及方法,上節實驗中又學習了矩陣鍵盤的驅動原理及方法,本實驗主要學習無源蜂鳴器的驅動原理,同時熟悉PWM發生模塊及矩陣鍵盤驅動模塊的實例化應用。

          本文引用地址:http://www.ex-cimer.com/article/202312/453641.htm
          • 熟悉PWM信號發生驅動模塊和矩陣鍵盤驅動模塊的應用
          • 了解無源蜂鳴器的驅動原理及方法
          • 完成簡易電子琴設計實現

          根據前面的實驗解析我們可以得知,該設計總體可以拆分成兩個功能模塊實現,

          • ArrayKeyBoard:通過驅動矩陣鍵盤工作獲取鍵盤的操作信息數據。 * Beeper:根據鍵盤按鍵信息驅動無源蜂鳴器發出不同的音節。 頂層模塊ElectricPiano通過實例化兩個子模塊并將對應的信號連接,最終實現簡易電子琴的總體設計。我們知道無源蜂鳴器是通過交流信號驅動的,可以通過輸出不同頻率的PWM脈沖信號控制蜂鳴器產生不同的音節輸出,所以上面Beeper模塊又可以拆分成兩個功能模塊實現其功能
          • tone:通過編碼方式將鍵盤的操作信息譯碼成對應的PWM周期信息。
          • PWM:根據PWM周期信息產生對應的PWM脈沖信號。

          Top-Down層次設計

          模塊結構設計

          蜂鳴器介紹

          蜂鳴器的分類: 按其結構主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型:

          • 電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動膜片及外殼等組成。接通電源后,振蕩器產生的音頻信號電流通過電磁線圈,使電磁線圈產生磁場,振動膜片在電磁線圈和磁鐵的相互作用下,周期性地振動發聲。
          • 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。多諧振蕩器由晶體管或集成電路構成,當接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號,阻抗匹配器推動壓電蜂鳴片發聲。

          按是否帶有信號源分為有源蜂鳴器和無源蜂鳴器兩種類型:

          • 有源蜂鳴器只需要在其供電端加上額定直流電壓,其內部的震蕩器就可以產生固定頻率的信號,驅動蜂鳴器發出聲音。
          • 無源蜂鳴器可以理解成與喇叭一樣,需要在其供電端上加上高低不斷變化的電信號才可以驅動發出聲音。

          我們底板上集成的蜂鳴器為無源電磁式蜂鳴器,接下來和大家一起學習無源蜂鳴器的驅動

          蜂鳴器驅動電路

          無源蜂鳴器沒有集成振蕩器,需要外部提供震蕩激勵,當震蕩頻率不同時發出不同的音調,對于數字系統來說,方波信號產生方便可靠,成為外部震蕩激勵的首選,方波信號輸入諧振裝置轉換為聲音信號輸出,電磁式蜂鳴器需要的驅動電流較高,一般單片機和FPGA管腳驅動能力有限不能直接驅動,常用三極管增加驅動能力,另外電磁式蜂鳴器內部含有感應線圈,在電路通斷瞬間會產生感應電勢,為保證電路長期穩定的工作,最好增加續流二極管設計,底板蜂鳴器驅動電路如下:

          蜂鳴器驅動電路

          注:不需要蜂鳴器工作時,控制器BEEP端口輸出低電平,管腳配置下拉(pull dowm)模式

          蜂鳴器使用NPN三極管(S8050)驅動,三極管當開關用,當基極電壓拉高時,蜂鳴器通電,當基極電壓拉低時,蜂鳴器斷電,FPGA控制GPIO口給三極管的基極輸出不同頻率的脈沖信號,蜂鳴器就可以發出不同的音節。

          蜂鳴器驅動設計

          前面我們了解到電磁式無源蜂鳴器需要外部提供震蕩激勵才可以發出聲音,且震蕩頻率不同產生的音調也不同,不同音節與蜂鳴器震蕩頻率的對應關系如下表:

          音調頻率對照表

          音節名頻率(Hz)音節名頻率(Hz)音節名頻率(Hz)
          低音1261.6中音1523.3高音11045.5
          低音2293.7中音2587.3高音21174.7
          低音3329.6中音3659.3高音31318.5
          中音4349.2中音4698.5高音41396.9
          低音5392中音5784高音51568
          低音6440中音6880高音61760
          低音7493.9中音7987.8高音71975.5

          FPGA要驅動蜂鳴器就需要給蜂鳴器模塊輸出《音調頻率對照表》中不同頻率的脈沖信號就可以了,我們在基礎數字電路實驗中學習過PWM產生原理,設計過一個PWM信號發生器模塊,模塊根據兩個輸入信號(cycle、duty)控制產生周期可控、占空比可控的脈沖信號(pwm_out),可以用來驅動無源蜂鳴器電路。

          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
          );
          • cycle:基于系統時鐘的計數器計數終值,與產生脈沖信號的周期有關
          • duty:脈沖信號產生機制中的比較器閾值,與產生脈沖信號的脈寬(占空比)有關

          驅動蜂鳴器的脈沖信號對占空比沒有太高的要求,我們默認產生50%占空比的脈沖信號,所以duty的輸入取cycle的一半;cycle的值關乎蜂鳴器的音節,需要和《音調頻率對照表》中對應,例如如果要蜂鳴器發出低音1的音節,脈沖信號頻率控制為261.6Hz,系統時鐘采用12MHz,計數器計數終值cycle就等于12M / 261.6 = 45872,即當我們給PWM模塊中cycle信號的值為45872時,得到低音1的音節輸出。這樣我們將每個音節對應的cycle值計算出來,當按動不同按鍵時給PWM模塊不同的cycle值就可以了,我們可以通過設計一個轉碼模塊(tone)將按鍵信息轉換成PWM需要的cycle信號,矩陣鍵盤共有16個按鍵,我們只能輸出16個音節。

          PWM周期轉碼程序實現如下:

          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

          現在我們在Beeper模塊中實例化tone和PWM模塊,將tone的輸出與PWM的cycle輸入連線就實現了按鍵信息產生對應音節的輸出了,想一想邏輯有問題嗎?

          • 當我們按下按鍵,會得到按鍵信息,根據按鍵信息轉碼得到一個cycle值,連線傳輸給PWM模塊,產生對應頻率脈沖,聽到對應音節輸出;
          • 當我們松開按鍵,同樣有按鍵信息,對應到轉碼模塊中得到cycle值為0,連線傳輸給PWM模塊,產生低電平信號,蜂鳴器不發聲。

          應該沒錯了,到這里我們就完成了蜂鳴器音節驅動部分。

          系統總體實現

          前次實驗中我們學習了矩陣鍵盤的驅動原理及方法,這里就不再重復,不一樣的是之前我們用的矩陣鍵盤模塊的脈沖輸出(keypulse),本實驗中簡易電子琴在按鍵按下狀態下一直發聲,跟按鍵時間長短有關,這樣我們就不能使用keypulse了,而應該使用keyout信號,另外keyout按鍵有效輸出為低電平,而PWM周期轉碼模塊(tone)是高有效編碼,所以在頂層模塊(ElectricPiano)中矩陣鍵盤(ArrayKeyBoard)與蜂鳴器音節驅動模塊(Beeper)之間的key_out連線需要做按位取反操作。

          總體設計程序實現如下:

          //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			)
          );

          綜合后的設計框圖如下:

          rtl設計框圖

          • 雙擊打開Quartus Prime工具軟件;
          • 新建工程:File → New Project Wizard(工程命名,工程目錄選擇,設備型號選擇,EDA工具選擇);
          • 新建文件:File → New → Verilog HDL File,鍵入設計代碼并保存;
          • 設計綜合:雙擊Tasks窗口頁面下的Analysis & Synthesis對代碼進行綜合;
          • 管腳約束:Assignments → Assignment Editor,根據項目需求分配管腳;
          • 設計編譯:雙擊Tasks窗口頁面下的Compile Design對設計進行整體編譯并生成配置文件;
          • 程序燒錄:點擊Tools → Programmer打開配置工具,Program進行下載;
          • 觀察設計運行結果。

          將簡易電子琴設計配置文件燒寫到FPGA實驗平臺,按動矩陣按鍵聽蜂鳴器發出的聲音,16個按鍵對應16個音節,按鍵K1~K7分別對應音節低音1~7,接下來一首好聽的《小星星》送給大家,按照下面的曲譜循環彈奏: 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

          按照曲譜彈奏琴電子琴沒有什么難度,如果我們設計一個狀態機,在狀態跳轉時能夠產生上述的音節信息,再配合我們今天講的蜂鳴器音節驅動設計,就可以實現一個音樂盒了,有興趣的同學不妨嘗試一下。



          評論


          相關推薦

          技術專區

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();