作者:Bird
喇叭,或稱揚聲器,是我們在各種專案中要讓產品發出聲音時,不可或缺的零件,就算你做的不是 Hi-Fi 高傳真音響,而只是要讓 Arduino 發出簡單的嗶嗶聲,還是會需要喇叭,它也許很小、很不起眼,但少了喇叭你就是沒辦法讓你的設計發出聲音。
喇叭的規格
要了解喇叭,就要先看懂它的規格。我們隨便上 Digi-Key 找一個很普通的小喇叭來當作範例,來看看它的規格。

喇叭規格範例(圖片來源:Bird 提供)
這是一個 8 Ω、1 W 的小型喇叭。一般來說選擇喇叭時,最重要的規格就是這兩個參數:阻抗和耐受功率。
讓我們進一步打開它的 datasheet,看看更詳細的規格。

範例喇叭規格(圖片來源:Bird 提供)
喇叭的 datasheet 通常很簡單,一頁就能描述完它的電氣特性、物理特性與機械圖面。這種小喇叭是「電感性」的元件,加在它上面的訊號會流經一個線圈,這個線圈圍繞在一個磁鐵上,訊號在線圈上產生的磁場會與磁鐵的磁場交互作用,兩者之間會產生振動的力量。如果我們固定磁鐵、讓線圈移動並與振膜相連,就是屬於「動圈式」喇叭(因為線圈可以動嘛!)。
那有沒有固定線圈、磁鐵可動的喇叭呢?其實這在歷史上曾經出現過,但因為磁鐵的質量遠大於線圈,使得驅動磁鐵振動的效果遠不如驅動線圈振動,因此現在的喇叭都是做成「線圈可動」的形式。
對電路而言,驅動喇叭就是在驅動一個會與磁鐵交互作用的線圈,因此最重要的特性就是它的特性阻抗,也就是寫在 datasheet 上的第一個規格。
電感的特性阻抗是這麼表示的:
XL = ⍵L = 2𝛑fL
這邊我們先忽略複數分析的部分(應該還有一個 j),我沒有忘記它,只是不想在這裡把事情搞得太複雜。⍵ 是角頻率,但這是物理學家比較喜歡的單位,我們在做電路設計時還是習慣用單位為 Hz 的頻率(f)來計算;兩者之間的比率是 2𝛑;阻抗是一個很像電阻但又不完全是電阻的特性,它的單位也是歐姆。
從這個式子看起來,電感的特性阻抗跟加在它上面的頻率有關。頻率越高,阻抗越大,因此標示一個電感的阻抗時,一定要記得標示這個阻抗測量時的頻率,否則就是個不完整的定義。
以例子中這顆喇叭來說,它的特性阻抗是 8 Ω,測量的頻率是 1000 Hz。如果我們加在它上面的訊號頻率比 1000 Hz 高,阻抗就會比 8 Ω 大;如果我們加在上面的訊號頻率比 1000 Hz 低,阻抗就會小於 8 Ω。而且根據上面的感抗公式,當頻率為 0 時,感抗為 0,也就是說對於直流電來說,電感是一個可以暢行無阻的零件。
不過除了喇叭線圈的電感所造成的感抗,線圈本身的繞線其實也有電阻,只是在這種低阻抗的小喇叭上,線圈的圈數不會太多,直流電阻相對來說都很小,加上這也不是我們設計時考慮的主要因素,因此 datasheet 上多半不會標註(直流電阻可以透過三用電錶的電阻檔直接測量喇叭兩端得知,通常直流電阻都會小於喇叭的特性阻抗)。
功率
這個喇叭的額定功率是 1 W。我們來算算看要如何驅動它才能讓它發出 1 W 的功率。
根據歐姆定律衍生出來的功率公式:
P = V2/R
1 = V2/8
V2 = 8,所以 V = 2.828(V)
也就是說,如果我們在它上面加一個 RMS 是 2.828 V 的 1 KHz 正弦波,就能輸送 1 W 的功率到這個喇叭上,而此時流過喇叭的交流電流是:
I = V / R
I = 2.828 / 8 = 0.353(A)
至於這個喇叭在收到 1 W 的驅動功率時,會發出多大的聲音呢?規格書上告訴我們:Output S.P.L. 是 output sound pressure level 的意思,也就是它輸出的聲壓;規格書上說,在 1 KHz、1.2 KHz、1.5 KHz、2 KHz 的頻率下,距離喇叭 0.1 公尺時,用 1 W 的驅動功率得到的聲壓是 102 、dB,而同樣的訊號在 1 公尺的距離時,聲壓則是 83 dB。
分貝與壓力
這裡描述的聲壓,單位是 dB,也就是分貝。我們在小學自然課都學過這個測量聲音大小的單位,而且課本上還會告訴我們樹葉的摩擦聲是 20 分貝、人們正常交談的音量是 50 分貝、公車旁的噪音大概有 80 分貝等。
但是我們在電子學中計算訊號大小時,分貝並不是個物理量的單位,它只是個對數比值的單位,像我們常用來測量 RF 訊號強度的單位 dBm,事實上是 dbmW 的縮寫(我也覺得這個簡寫莫名其妙,四個字母少掉一個字母算哪門子的簡寫),也就是說它的物理單位是 mW,dB 表示的是以 10 為底的對數比值,再乘以 10。
舉例來說,如果有個 RF 系統的發射功率是 1 W,也就是 1000 mW,若要用 dBm 來表示,就是
10 * log(1000) = 10 * 3= 30(dBm)

衛星在太空中發射的訊號經長途旅程到達地球表面後,強度大為減弱(圖片來源:yukle.mobi)
因為有一些物理量的大小範圍非常大,如果不用 dB 的方式來表達會很麻煩。比如說 GPS 的衛星在天線上的等效發射功率大概是 500 W,這個訊號經過兩萬一千公里的旅行來到地球表面後,它的強度只剩下 0.0000000000001 mW,這樣數字直接用小數點來表示真的非常麻煩而且容易出錯;但如果用 dBm 來表示,就是 -130 dBm,遠比直接寫出來要容易辨認(不信的讀者可以試試看,你能否一眼看出 0.0000000000001 mW 比 0.00000000000001 mW 大 10 倍呢?)。
既然 dB 只是個比例的單位,那聲音大小的 dB 又是怎麼回事呢?事實上就像 dBm 後面躲了一個隱形的 W 一樣,聲音的 dB 後面也躲了一個隱形的單位:20𝞵Pa;換句話說,100 dB 的聲壓,其實是 100 dB20𝞵Pa,也就是 20𝞵Pa 這個單位的 10000000000 倍。
20𝞵Pa 究竟是個什麼神奇的單位呢?事實上它是人類在 1 KHz 時的聽覺極限,也就是人類在 1 KHz 時所能聽到的最小聲音,而這邊的 Pa 就是測量壓力的單位 Pascal,也就是「每平方公尺一牛頓的壓力」,𝞵Pa 是 Pa 的百萬分之一,是極小的壓力(一個大氣壓力等於 101325 Pa,從這裡你就能感覺到 20𝞵Pa 有多小了)。
對,人耳就是這麼敏感,只要一點點如 20𝞵Pa 這麼小的風吹草動,就能聽到聲音,而我們一般所說的音量幾分貝,其實就是聲壓跟這個人類聽覺極限聲壓的比值。

演唱會的音量除產生極大的聲壓外,身體也能感受到聲音的震撼力(圖片來源:pixabay)
像是公車旁的噪音 80 dB(也就是 80 dB20𝞵Pa),大概就是 0.2 Pa,這個音量在我們耳膜上造成的壓力就是正常交談音量 50 dB 時的 1000 倍;演唱會的重低音喇叭在距離舞台較近的地方所造成的聲壓甚至可高達 130 dB,換算成壓力就是 63.2 Pa,這個壓力除了讓你的耳膜承受極大的應力外,也你的身體也能感受得到。但不得不説,人耳的動態範圍真的是大得不可思議。
回到我們的小喇叭。它在 10 公分處雖然可以有 102 dB 的聲壓,但在 1 公尺處就只剩下 83 dB,因為這種喇叭發出來的聲音通常沒有太強的方向性,聲音會往四面八方擴散,因此聲壓會隨著距離快速下降,大致上會遵循平方反比定律。
所以你可以預期這個喇叭在發出 1 KHz 到 2 KHz 的聲音時,如果用足夠的功率去驅動它,它還滿吵的(1 公尺外還有 83 dB,比你講話還大聲得多呢!)。
喇叭的驅動
接下來我們來看看用 Arduino 驅動這種小喇叭需要注意什麼事。一個最簡單也最常見的驅動電路大概是這樣:

常見的驅動電路(圖片來源:Bird 提供)
直接將小喇叭接在 Arduino 的 digital output 與 GND 之間。這麼做不是不可以,只是有個小問題:會讓 Arduino 上的 MCU 在壓力之下工作。
Arduino 的 I/O 電壓是 5 V,因此當它的 digital output 設為 high 時,腳上的電壓就是 5 V。如果我們直接加一個震幅 5 V 的 1 KHz 訊號在阻抗 8 Ω 的喇叭上,根據前面的計算,流經喇叭的電流會是:
5(V) / 8(Ω)= 0.625(A)
這個電流大得嚇死人了,而且事實上 Arduino 的 I/O 接腳並不能輸出這麼大的電流。根據 Arduino 的規格,它每隻腳所能輸出的最大電流是 40 mA,如果你要從它上面抽取更大的電流,它的輸出電壓就會開始下降(反正再怎麼樣 Arduino 就是不可能輸出 625 mA 這麼大的電流),因此如果直接這樣接的話,會讓 Arduino 的輸出接腳始終在過電流的狀況下工作。
那我們退一步來看好了,如果我只希望 Arduino 輸出 30 mA 的電流來驅動喇叭,讓 Arduino 不要那麼辛苦,可以怎麼做呢?我們可以用一個小小的「限流電阻」來完成這件事。
輸出電壓 5 V,電流為 30 mA 時,整個迴路的阻抗應該要是:
5(V)/ 0.03(A)=166(Ω)
若喇叭的阻抗(含 DC 電阻)是 8 Ω,我們就還需要 158 Ω 來湊齊這個阻抗。所以電路會變成:

增加 158 Ω 阻抗後的電路(圖片來源:Bird 提供)
這個電路就妥善得多,不會讓 Arduino 的 I/O 在壓力之下工作,此時送往喇叭的功率是:
P = I2R = 0.032 * 8 = 0.0072(W)
7.2 mW 的功率在這個小喇叭上應該還是可以發出我們聽得到的聲音,只是音量不會太大,如果我們想要用更大的功率驅動喇叭,就得加個電晶體來提升驅動的電流。一個簡單的範例電路是這樣的:

增加電晶體後的電路圖(圖片來源:Bird 提供)
我們可以用一顆 NPN 電晶體來放大電流。由於 Arduino 僅能輸出數位訊號來驅動喇叭,也就是說它的 digital output 用來驅動喇叭的訊號是方波,因此這個電晶體放大電路的設計不用太講究,我們直接讓這顆電晶體工作在飽和區,再用限流電阻決定要流經喇叭的電流要多大。
以上面這個電路來說,我們放了一個 22 Ω 的限流電阻,假設電晶體飽和時的 C-E 飽和電壓是 0.6 V,那麼流經喇叭的電流就會是:
(5.0 – 0.6)/ 22 = 0.2(A)
這時喇叭上的功率會是:
0.22 * 8 = 0.32(W)
將近三分之一瓦的功率,在這個喇叭上已經可以造出蠻大的音量了。
至於電晶體的基極電阻,只要確保流過基極的電流乘上電晶體的直流電流放大率 hFE 後能超過上面那個電流,讓電晶體進入飽和區就可以了。一般小訊號電晶體的直流電流放大率 hFE 最差在電流很小時也有個三五十以上,因此我們可以設計讓流過基極的電流有 1 mA 就足夠了。
Arduino 的 I/O 輸出是 5 V,扣掉電晶體的 B-E 順向偏壓 0.6 V,還有 4.3 V,如果要限制電流在 1 mA,就要一個 4.3 K 的基極電阻。
Arduino 的發聲功能
Arduino 的内建 library 中有一個功能可以讓你很容易控制上面的電路發出聲音,這個 function 叫做 tone():
tone(pin, frequency, duration);
三個參數分別是:pin—要輸出訊號的 digital I/O 腳;frequency—頻率,單位是 Hz;duration—發聲的長度,單位是 ms,如果省略這個參數它就會一直唱不停,直到你執行另一個函式 noTone() 叫它閉嘴爲止。
舉例來説,這一行程式碼:
tone(8, 523, 1000);
就會讓 Arduino 發出一個中央 C(523 Hz)左右的聲音,一秒鐘。
小結
這次我們簡單介紹了小型喇叭的原理及簡單驅動它的方法,希望各位讀者以後在自己的 maker 專案中有需要用到發聲元件時,都能做出適合的電路。
(責任編輯:賴佩萱)
- 【Maker電子學】Flash 記憶體的原理與應用—PART22 - 2025/02/27
- 【Maker電子學】Flash 記憶體的原理與應用—PART21 - 2025/02/21
- 【Maker電子學】Flash 記憶體的原理與應用—PART20 - 2025/01/24
訂閱MakerPRO知識充電報
與40000位開發者一同掌握科技創新的技術資訊!
2021/11/27
請問是否可用 MOSFET 2N7002 取代 Transistor?
2021/07/30
請問80dB -> 0.2Pa 這是否有錯誤?
2021/08/05
您覺得哪裡有錯誤? 人類聽覺 threshold 20 µPa = 2 × 10^−5 Pa,80dB SPL 就是這個的 10^(80/20) = 10^4,所以就是 2×10^-1 Pa,也就是 0.2Pa
2021/07/06
您好
您的文章 對我幫助很大
最近想要對喇叭做出輸出 所以查了很多資料
因為我是資工的電機方面不是很懂 謝謝您的知識
另外 文章所提 聲音 應該是 Lp = 20 log10 (p/p0)
不同距離的換算可以用這公式
Lp2 = Lp1 + 20*log10(0.1/1)
下面是我用octave 驗算的 跟spec 還有您提到的 db都是相符的
pa = 50
p0 = 20e-6
Lp = 20*log10 (pa/p0)
Lp1= 102
Lp2 = Lp1 + 20*log10(0.1/1)
Output
pa = 50
p0 = 2.0000e-05
Lp = 127.96
Lp1 = 102
Lp2 = 82
參考 https://www.translatorscafe.com/unit-converter/en-US/sound-pressure-level/2-9/pascal-sound%20pressure%20level%20in%20decibels/#049
2019/06/18
不知道是不是我記錯了,電感阻抗公式應該是XL=2×3.14×f×L
2019/06/21
你記的沒錯,我寫的也沒錯啊
XL = ⍵L = 2𝛑fL,𝛑 就是你的 3.14
2019/06/13
Great article!!