引言
壓電蜂鳴器或揚(yáng)聲器使用壓電晶體單元,壓電晶體在加電時(shí)會(huì)出現(xiàn)輕微變形,將電信號(hào)轉(zhuǎn)換為聲音。晶體單元連在揚(yáng)聲器錐體或面板,當(dāng)施加快速變化的電壓時(shí),它會(huì)快速振動(dòng)。這種振動(dòng)激發(fā)出空氣中的聲波,從而產(chǎn)生頻率基于電波頻率的音調(diào)。早期的計(jì)算機(jī)和電子游戲使用壓電揚(yáng)聲器產(chǎn)生的各類(lèi)聲音,從單音、汽笛音到白噪聲等。和早期相比,個(gè)人計(jì)算機(jī)的聲音產(chǎn)生技術(shù)有了很大的進(jìn)步。今天,系統(tǒng)即使增加了多通道、數(shù)字聲音和音樂(lè),以及基于MIDI的音樂(lè)合成器系統(tǒng),仍然使用簡(jiǎn)單的壓電揚(yáng)聲器。汽車(chē)報(bào)警、煙霧探測(cè)器、銷(xiāo)售點(diǎn)(PoS)終端、小型電子玩具和游戲以及很多應(yīng)用都依靠壓電聲發(fā)生器來(lái)產(chǎn)生單音、大分貝報(bào)警音效。
改動(dòng)硬件驅(qū)動(dòng)揚(yáng)聲器
對(duì)系統(tǒng)中的壓電揚(yáng)聲器增加硬件非常簡(jiǎn)單。對(duì)于只需要一路頻率輸出的應(yīng)用,可以對(duì)壓電揚(yáng)聲器進(jìn)行優(yōu)化,以一定的音頻振蕩。通過(guò)加入反饋網(wǎng)絡(luò)和逆變器,揚(yáng)聲器在接通后以共振頻率開(kāi)始自激振蕩。這類(lèi)網(wǎng)絡(luò)通常用于在煙霧探測(cè)器、二氧化碳傳感器和安防系統(tǒng)中產(chǎn)生大分貝報(bào)警音。
Maxim的MAXQ3210微控制器集成了這類(lèi)壓電揚(yáng)聲器驅(qū)動(dòng)電路(圖1)。軟件界面非常簡(jiǎn)單,包括一個(gè)控制位,用于打開(kāi)或者關(guān)斷揚(yáng)聲器。輸出音的頻率和音量完全由壓電揚(yáng)聲器和反饋網(wǎng)絡(luò)元件決定。
圖1. MAXQ3210微控制器的壓電音驅(qū)動(dòng)電路
在軟件控制下迅速接通和關(guān)斷揚(yáng)聲器可以產(chǎn)生各種嘀噠、啁啾等聲音效果,但是輸出頻率不變。怎樣才能產(chǎn)生各種不同的輸出頻率呢?
為改變輸出頻率,必須去掉自動(dòng)反饋環(huán)路,直接通過(guò)端口引腳來(lái)控制揚(yáng)聲器輸出。數(shù)字揚(yáng)聲器的輸入可以在固定電壓和地之間切換,微控制器的數(shù)字I/O引腳可直接驅(qū)動(dòng)它。根據(jù)壓電揚(yáng)聲器輸出大小和所需的分貝數(shù),可能需要專(zhuān)門(mén)的驅(qū)動(dòng)電路或者IC來(lái)處理壓電揚(yáng)聲器引腳的高壓,或者將大電流驅(qū)動(dòng)到揚(yáng)聲器中,以產(chǎn)生高音。在這些情況下,微控制器I/O引腳被用于打開(kāi)或者關(guān)斷揚(yáng)聲器,設(shè)置輸出頻率。I/O引腳不直接驅(qū)動(dòng)壓電單元。
MAXQ3210還可用于產(chǎn)生多個(gè)揚(yáng)聲器輸出頻率。反饋輸入引腳直接連接到器件的一個(gè)其他端口引腳上。只要內(nèi)置揚(yáng)聲器逆變器能夠跟上端口引腳驅(qū)動(dòng)的頻率,按照合適的速率觸發(fā)端口引腳都可以產(chǎn)生所需的音調(diào)。
注意:本應(yīng)用筆記的源代碼可以下載(ZIP, 4.5kB)。
音樂(lè)合成器
為能夠產(chǎn)生簡(jiǎn)單的音樂(lè)信號(hào),揚(yáng)聲器必須接通一段時(shí)間,然后關(guān)斷相同的時(shí)間。產(chǎn)生的聲音頻率由下面的公式給出:輸出頻率 = 1/(長(zhǎng)周期 + 短周期)為能夠產(chǎn)生一定時(shí)間長(zhǎng)度的聲音,需要計(jì)算進(jìn)行驅(qū)動(dòng)的完整周期數(shù):
周期數(shù) = (聲音持續(xù)時(shí)間 × 輸出頻率)以中C基本鋼琴音標(biāo)音頻為例。對(duì)這些頻率進(jìn)行調(diào)諧,音符“中C的A”等于440Hz。表1中列出的值是近似值。
表1. 音符和接近的聲音頻率
Note | Frequency (Hz) |
Middle C | 261 |
C sharp/D flat | 277 |
D | 294 |
D sharp/E flat | 311 |
E | 330 |
F | 349 |
F sharp/G flat | 370 |
G | 392 |
G sharp/A flat | 415 |
A | 440 |
A sharp/B flat | 466 |
B | 494 |
C (next octave up) | 523 |
以一定頻率來(lái)接通和關(guān)斷MAXQ3210端口引腳最簡(jiǎn)單的方法是使用軟件循環(huán)。使用微控制器的單周期指令執(zhí)行頻率來(lái)計(jì)算內(nèi)循環(huán)延時(shí),該頻率典型值為3.57MHz。
move HRNC, #1 ; Turn the piezoelectric horn driver on. ;; Play Middle C for one second. move LC[1], #261 ; Outer loop counter = 261 cycles (1s * 261Hz) middleC: move PO0.0, #1 ; Switch output high. move LC[0], #6839 ; Half period : (1/261Hz) / (1/3.57MHz) / 2 djnz LC[0], $ ; Decrement and jump, if not zero, to current ; instruction. move PO0.0, #0 ; Switch output low. move LC[0], #6839 ; Half period : (1/261Hz) / (1/3.57MHz) / 2 djnz LC[0], $ ; Decrement and jump if not zero to current ; instruction. djnz LC[1], middleC ; Decrement and jump, if not zero, to top of loop.通過(guò)改變循環(huán)計(jì)數(shù)器LC[0]裝載的數(shù)值來(lái)改變輸出頻率(對(duì)應(yīng)于產(chǎn)生的音符)。通過(guò)改變循環(huán)計(jì)數(shù)器LC[1]裝載的數(shù)值來(lái)改變音符持續(xù)時(shí)間。把這些代碼打包到一個(gè)簡(jiǎn)單宏中,定義幾個(gè)常數(shù),就很容易產(chǎn)生播放一小段音樂(lè)的代碼。
#define NOTE_C 261 #define NOTE_C_SH 277 #define NOTE_D_FL 277 #define NOTE_D 294 #define NOTE_D_SH 311 #define NOTE_E_FL 311 #define NOTE_E 330 #define NOTE_F 349 #define NOTE_F_SH 370 #define NOTE_G_FL 370 #define NOTE_G 392 #define EIGHTH 1 ; 120 beats per minute, 4/4 time #define QUARTER 2 ; 120 beats per minute, 4/4 time #define QUARTERDOT 3 ; 120 beats per minute, 4/4 time #define HALF 4 ; 120 beats per minute, 4/4 time #define WHOLE 8 ; 120 beats per minute, 4/4 time play macro note, duration local L1, L2 move HRNC, #1 move LC[1], #(note * duration / 8) L1: move PO0.0, #1 ; Switch output high. move LC[0], #(1785000 / note) djnz LC[0], $ ; Decrement and jump, if not zero, to current ; instruction. move PO0.0, #0 ; Switch output low. move LC[0], #(1785000 / note) djnz LC[0], $ ; Decrement and jump, if not zero, to current ; instruction. djnz LC[1], L1 ; Decrement and jump, if not zero, to top of loop. move HRNC, #1 move LC[1], #50 ; 50ms of silence L2: move LC[0], #3570 ; 1ms (inner loop) djnz LC[0], $ djnz LC[1], L2 endm ;; First 8 bars of Beethoven's "Ode to Joy" play NOTE_E, QUARTER play NOTE_E, QUARTER play NOTE_F, QUARTER play NOTE_G, QUARTER play NOTE_G, QUARTER play NOTE_F, QUARTER play NOTE_E, QUARTER play NOTE_D, QUARTER play NOTE_C, QUARTER play NOTE_C, QUARTER play NOTE_D, QUARTER play NOTE_E, QUARTER play NOTE_E, QUARTERDOT play NOTE_D, EIGHTH play NOTE_D, HALF play NOTE_E, QUARTER play NOTE_E, QUARTER play NOTE_F, QUARTER play NOTE_G, QUARTER play NOTE_G, QUARTER play NOTE_F, QUARTER play NOTE_E, QUARTER play NOTE_D, QUARTER play NOTE_C, QUARTER play NOTE_C, QUARTER play NOTE_D, QUARTER play NOTE_E, QUARTER play NOTE_D, QUARTERDOT play NOTE_C, EIGHTH play NOTE_C, HALF可以縮小這一例子需要的代碼空間。只使用子程序(而不是解開(kāi)的代碼宏)和查找表就可以產(chǎn)生音符值。其基本原理相同。
定時(shí)器驅(qū)動(dòng)的音樂(lè)合成器
上面的代碼雖然非常簡(jiǎn)單,但是要求微控制器犧牲其所有時(shí)間來(lái)產(chǎn)生音調(diào)。對(duì)于音樂(lè)賀卡等簡(jiǎn)單應(yīng)用,這樣簡(jiǎn)單地使用微控制器是可以的。然而,對(duì)于更復(fù)雜的應(yīng)用,需要在后臺(tái)播放音樂(lè),而微控制器去完成其他工作。為完成這種雙重角色,微控制器必須從周期性地開(kāi)關(guān)端口引腳以產(chǎn)生某一音符這類(lèi)工作中解放出來(lái)。MAXQ3210集成了計(jì)數(shù)器/定時(shí)器功能。在一種模式下,定時(shí)器可以在端口引腳上產(chǎn)生某一頻率的輸出波形。利用這種模式,將定時(shí)器輸出引腳連接至反饋輸入,微控制器在音符開(kāi)始時(shí)啟動(dòng)定時(shí)器,在音符結(jié)束時(shí)關(guān)掉它。
定時(shí)器還可以用于控制音符本身的持續(xù)時(shí)間。MAXQ3210含有另一個(gè)長(zhǎng)周期定時(shí)器,非常適合完成這一任務(wù)。通過(guò)在每一音符間隔開(kāi)始產(chǎn)生一個(gè)中斷,定時(shí)器查找預(yù)編碼的音符查找表,以更少的空間來(lái)編碼時(shí)間更長(zhǎng)的音樂(lè)。
評(píng)論
查看更多