◇武漢輕工大學(xué)電氣與電子工程學(xué)院 王洪欽 李素芬 吳倩
本文介紹了基于FPGA設(shè)計(jì)的無源蜂鳴器的音樂播放,使用無源蜂鳴器在不同頻率的脈沖方波信號(hào)下來產(chǎn)生基本的音調(diào),采用了VerilogHDL語言進(jìn)行描述,通過Diamond 3 軟件和ModelSim進(jìn)行電路的綜合與仿真,并下載到小腳丫MachXO2-4000HC開發(fā)板中驗(yàn)證了無源蜂鳴器音樂播放的可行性。
蜂鳴器是電器設(shè)備中經(jīng)常使用的一種聲音器件,按其結(jié)構(gòu)主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型:
一種是電磁式蜂鳴器由振蕩器、電磁線圈、磁鐵、振動(dòng)膜片及外殼等組成。接通電源后,振蕩器產(chǎn)生的音頻信號(hào)電流通過電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng),振動(dòng)膜片在電磁線圈和磁鐵的相互作用下,周期性地振動(dòng)發(fā)聲。
另一種是壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。多諧振蕩器由晶體管或集成電路構(gòu)成,當(dāng)接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。
按是否帶有信號(hào)源分為有源蜂鳴器和無源蜂鳴器兩種類型。
一種是有源蜂鳴器只需要在其供電端加上額定直流電壓,其內(nèi)部的震蕩器就可以產(chǎn)生固定頻率的信號(hào),驅(qū)動(dòng)蜂鳴器發(fā)出聲音。
另一種是無源蜂鳴器可以理解成與喇叭一樣,需要在其供電端上加上高低不斷變化的電信號(hào)才可以驅(qū)動(dòng)發(fā)出聲音。
圖1 無源蜂鳴器去驅(qū)動(dòng)電路
使用無源蜂鳴器產(chǎn)生樂曲時(shí),是沒有音色的區(qū)別的,只會(huì)有簡(jiǎn)單的音調(diào)和節(jié)拍,蜂鳴器使用NPN三極管(9013)驅(qū)動(dòng),三極管當(dāng)開關(guān)用,當(dāng)基極電壓拉高時(shí),蜂鳴器通電,當(dāng)基極電壓拉低時(shí),蜂鳴器斷電,F(xiàn)PGA控制GPIO口給三極管的基極輸出不同頻率的脈沖信號(hào),蜂鳴器就可以發(fā)出不同的音節(jié)。小腳丫MachXO2-4000HC開發(fā)板內(nèi)置時(shí)鐘為12MHz,無需外置時(shí)鐘,時(shí)鐘分頻后每一個(gè)特定的頻率對(duì)應(yīng)一個(gè)音調(diào),對(duì)應(yīng)關(guān)系如表1所示。
表1 音調(diào)簡(jiǎn)碼表
音調(diào)是通過給無源蜂鳴器輸入給定頻率的方波信號(hào)來實(shí)現(xiàn)的,不同的音調(diào)不同的頻率方波信號(hào),因此在編程中首先要實(shí)現(xiàn)分頻產(chǎn)生不同的信號(hào)方波,而方波的信號(hào)又來自于計(jì)數(shù)器的計(jì)數(shù)值不同而產(chǎn)生的,表1展示了不同音調(diào)對(duì)應(yīng)下12MHz中計(jì)數(shù)器理論計(jì)數(shù)值。
本次實(shí)驗(yàn)實(shí)現(xiàn)的是歌曲《Astronomia》簡(jiǎn)單曲譜演奏,精簡(jiǎn)后的曲譜如下:
圖2 歌曲《Astronomia》簡(jiǎn)譜
由簡(jiǎn)譜可見,前四拍每一小節(jié)中有4拍,每拍有2個(gè)音符,則每一小節(jié)有8個(gè)音符,粗略計(jì)算為每一小節(jié)2s鐘,則每一個(gè)音符對(duì)應(yīng)的時(shí)間為0.125s,程序如下:
計(jì)數(shù)器CNT的最大值CNT_MAX的值為24位寬的1499999,小腳丫開發(fā)板的內(nèi)置系統(tǒng)時(shí)鐘為12MHZ,分頻的到0.125s對(duì)應(yīng)的計(jì)數(shù)值為1499999。
《Astronomia》簡(jiǎn)譜至采取了前2段,故音符數(shù)的位寬為8位寬共129位,每個(gè)音符的時(shí)間間隔都控制好之后,接下來就是讓每個(gè)音符都發(fā)出固定的聲音,無源蜂鳴器要給出不同頻率的信號(hào)方波才可以發(fā)出不同的音調(diào),程序如下:
Freq_cnt在達(dá)到音調(diào)頻率計(jì)數(shù)值或計(jì)數(shù)器cnt達(dá)到最大時(shí)清零,其它時(shí)刻都自行計(jì)數(shù),同時(shí)將音符計(jì)數(shù)值右移一位賦值給duty_data,同時(shí)將音符頻率計(jì)數(shù)值與duty_data進(jìn)行比較,前者大的時(shí)候,beep高電平;前者小的時(shí)候,beep低電平。這樣就形成了一束頻率信號(hào)方波輸入給無源蜂鳴器發(fā)生,至此一個(gè)音符的發(fā)生完畢。
實(shí)現(xiàn)多個(gè)甚至整首歌曲的音符演奏,本程序采用了內(nèi)置多個(gè)case分之語句與定義多個(gè)頻率來完成。
基于FPGA的無源蜂鳴器音樂播放實(shí)驗(yàn)成功發(fā)聲并發(fā)出不同的音調(diào),但并并沒有對(duì)每個(gè)音符時(shí)間間隔給出一個(gè)通解,具有特殊性,同時(shí)程序編配上還具有最優(yōu)解。實(shí)際生活中可以編配簡(jiǎn)單的歌曲,具有一定的經(jīng)濟(jì)意義。