Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 9 章 電晶體

本章目標

學完這一章,你會:

  • 用「小電流控制大電流的水閥」來解釋電晶體(Transistor)在做什麼。
  • 認出 2N2222 的三隻腳 E、B、C,並且畫得出 NPN 電晶體的符號。
  • 自己算出基極電阻要用多大,才能讓電晶體「完全打開」去推動馬達。
  • 用 Arduino 經過電晶體開關一顆馬達,並在示波器上看到集極電壓跟 Arduino 腳位「剛好相反」。
  • 說出 MOSFET IRLZ44N 的 G、D、S 腳,以及它和 2N2222 的差別、什麼時候該用哪一個。

開場:Arduino 推不動馬達

社團裡有一位同學想做一台小風扇。他把小直流馬達一腳接 Arduino 的 D9、另一腳接 GND,程式寫 digitalWrite(9, HIGH)。結果馬達只是「嗡」地抖了一下就不動了,過一會兒 Arduino 的晶片還微微發熱。

問題出在哪?第 4 章我們量過:Arduino 的一隻腳位最多只能給大約 20 mA(硬撐 40 mA 就可能燒掉),可是小馬達起動時要吃幾百 mA。這就像叫一個小學生去推卡車——推不動,還會受傷。

我們需要一個「幫手」:Arduino 只要用一點點電流去「指揮」它,它就能用自己的力氣推動馬達。這個幫手就是電晶體,它是電子世界最重要的元件——你手機裡的晶片,就是幾十億顆電晶體擠在一起。這一章只教它最常用的功能:當開關。學會之後,Arduino 想開馬達、繼電器、LED 燈條,通通沒問題。

核心概念

用小電流控制大電流:水閥比喻

想像一條粗大的水管,中間裝了一個閥門。這個閥門很特別:它不是用手轉的,而是旁邊有一根細細的小水管,只要小水管裡有一點點水流進來推動閥門,大水管的閥門就會打開,讓大量的水通過。小水管的水越多,大閥門開得越大;小水管沒水,大閥門就關起來。

電晶體就是這樣的閥門:

  • 大水管 = 從集極(C)流到射極(E)的大電流,我們叫它集極電流 I_C。
  • 小水管 = 從基極(B)流到射極(E)的小電流,叫基極電流 I_B。
  • 規則:I_C 大約等於 β × I_B,β(念「beta」)叫電流放大倍數,2N2222 的 β 大約在 100 到 300 之間。

換句話說,Arduino 只要送 1 mA 的小電流進基極,電晶體就可以讓 100 mA 以上的大電流從集極流到射極。這就是「用小電流控制大電流」。

NPN 電晶體的三隻腳:E、B、C

本書用的 2N2222 是一顆 NPN 電晶體(還有另一種叫 PNP,方向相反,本書不用)。它是黑色半圓柱的塑膠包裝,一面是平的、印著字。把平的那一面朝向自己,腳朝下,由左到右是 E、B、C:

          ┌─────────┐
          │  2N2222 │   ← 平面(印字那一面)朝向自己
          │         │
          └─┬──┬──┬─┘
            │  │  │
            E  B  C
           射極 基極 集極
       (Emitter)(Base)(Collector)

注意:有些 2N2222 是金屬圓罐包裝(TO-18),腳位排法不同。本書假設你拿到的是黑色塑膠包裝(TO-92)。拿到不確定的元件,就用三用電表的二極體檔確認(見「用儀器看看」)。

電路符號長這樣,記法:箭頭在射極上,NPN 的箭頭朝外:

            C(集極)
            │
            │
     B ─────┤
    (基極)  │╲
            │ ╲
            │  ▼
            E(射極)

三隻腳的分工:

  • 基極 B:控制腳。小電流從這裡進來。
  • 集極 C:大電流從這裡進來(「收集」電流)。
  • 射極 E:大電流和小電流都從這裡出去(「射出」電流),接 GND。

基極和射極之間其實就像一顆二極體:要讓電流流進基極,B 要比 E 高大約 0.7V,這個 0.7V 跟上一章的二極體壓降是同一回事,我們寫成 V_BE ≈ 0.7V。

放大倍數 β 與「飽和」:把閥門開到底

既然 I_C = β × I_B,那是不是 I_B 越大,I_C 就可以無限大?當然不行。集極電流最多能流多少,是由外面的電路決定的:例如 5V 電源接一顆馬達,馬達轉動時只需要 200 mA,電晶體再怎麼開,也只能流 200 mA——因為水管就那麼粗。

這時候我們說電晶體**飽和(Saturation)**了:閥門已經開到底,集極和射極之間幾乎短路,只剩大約 0.1–0.3V 的壓降(叫 V_CE(sat))。這是當開關時最理想的狀態:電壓很小 × 電流 → 功率很小 → 電晶體不發熱。

相反地,如果基極電流不夠,閥門只開一半,馬達拿不到足夠的電流(轉得慢或不轉),而且集極和射極之間會落下好幾伏特——例如 2.5V × 0.2A = 0.5W,一顆小小的 2N2222 最多只能承受大約 0.5W,它會變得很燙。

結論:當開關用時,一定要給足夠的基極電流,讓電晶體飽和。 寧可多給一點,也不要剛剛好。

基極電阻怎麼算

Arduino 腳位輸出 HIGH 是 5V,基極對 GND 是 0.7V,所以中間那顆基極電阻 R_B 兩端的電壓是 5 − 0.7 = 4.3V。基極電流就是:

I_B = (5V − 0.7V) ÷ R_B

本書的標準接法是 R_B = 1kΩ:

I_B = 4.3 ÷ 1000 = 0.0043 A = 4.3 mA

β 保守取 100(規格書上的最低值),那電晶體最多可以讓多少集極電流通過?

I_C(最大) = β × I_B = 100 × 4.3 mA = 430 mA

也就是說,只要負載需要的電流在 430 mA 以內,電晶體都會乖乖飽和。我們的小馬達 100–300 mA、繼電器線圈 70 mA、蜂鳴器 30 mA 都在範圍內,所以 1kΩ 可以用。而 4.3 mA 對 Arduino 腳位來說也只是 20 mA 上限的五分之一,很安全。

反過來看,如果有人隨手拿了 100kΩ 當基極電阻:

I_B = 4.3 ÷ 100000 = 0.000043 A = 43 µA → I_C(最大) = 100 × 43 µA = 4.3 mA

4.3 mA 連 LED 都只能點到微亮,馬達完全不會動,而且電晶體會因為沒飽和而發熱。所以基極電阻不是越大越省電,要算。

一個常用的簡單規則:算出來需要的 I_B 再乘 2 到 5 倍,確保飽和。

電晶體當開關:低邊開關的標準接法

本書所有「用 Arduino 開關某個東西」都用同一種接法,叫低邊開關(Low-side Switch),因為電晶體接在負載的「下面」(GND 那一邊):

                 +5V
                  │
              ┌───┴───┐
              │ 負載  │  (馬達、繼電器線圈、蜂鳴器、LED+電阻……)
              └───┬───┘   如果是馬達或線圈,要並聯 1N4007,白線朝上
                  │ C
 Arduino 腳位 ──[ R_B ]──┤ B   2N2222
                  │ E
                  │
                 GND(和 Arduino 共地)

四個重點:

  1. 負載接在 +5V 和 C 之間。
  2. E 接 GND,而且一定要跟 Arduino 的 GND 接在一起(共地),不然基極電流沒有回路。
  3. 基極電阻 1kΩ 不能省:沒有它,Arduino 會直接把 5V 灌進 0.7V 的 B-E 二極體,電流暴衝,腳位燒掉。
  4. 馬達、繼電器線圈這種「有線圈」的負載,一定要並聯飛輪二極體(第 7 章)。

MOSFET:用電壓控制的開關

2N2222 很好用,但它有兩個小缺點:需要「餵」基極電流、飽和時還有 0.1–0.3V 的壓降(電流大時會發熱)。要推動 1A 以上的東西,我們改用另一種電晶體:MOSFET(金氧半場效電晶體)。本書用的是 N 通道的 IRLZ44N。

MOSFET 也有三隻腳,名字不同:

  • 閘極 G(Gate):控制腳,對應 BJT 的 B。
  • 汲極 D(Drain):大電流流入,對應 C。
  • 源極 S(Source):大電流流出,對應 E,接 GND。

IRLZ44N 是比較大顆的 TO-220 包裝,背面有一片金屬散熱片。印字那面朝向自己,腳朝下,由左到右是 G、D、S:

          ┌───────────┐
          │     ○     │  ← 金屬散熱片的鎖孔(散熱片和 D 腳是相通的!)
          │  IRLZ44N  │     印字那一面朝向自己
          │           │
          └─┬───┬───┬─┘
            │   │   │
            G   D   S
          閘極  汲極  源極
      (Gate)(Drain)(Source)

MOSFET 和 2N2222 最大的差別是:它靠電壓控制,不靠電流。 閘極像是一個電容,你只要把它充到夠高的電壓(IRLZ44N 大約 2V 就開始導通,5V 就完全打開),它就開了,之後幾乎不吃電流。而且它打開之後,D 和 S 之間就像一條電阻只有 0.022Ω 的電線,叫 R_DS(on)。

算一個例子:流 1A 的電流,IRLZ44N 兩端的壓降是 1 × 0.022 = 0.022V,發熱功率 = 0.022V × 1A = 0.022W,幾乎不熱。同樣 1A 給 2N2222,它根本撐不住(最大 800 mA),就算撐住也有 0.3V × 1A = 0.3W。

IRLZ44N 標準接法:

                 +5V
                  │
              ┌───┴───┐
              │ 負載  │   馬達要並聯 1N4007,白線朝上
              └───┬───┘
                  │ D
 Arduino 腳位 ──[ 220Ω ]──┬──┤ G   IRLZ44N
                      │   │ S
                  [ 10kΩ ]│
                      │   │
                     GND ─┴── GND
  • 220Ω:閘極像電容,剛開關時會有一瞬間的充電電流,這顆電阻讓它溫和一點。
  • 10kΩ 接到 GND:叫下拉電阻。Arduino 還沒開機或腳位沒設定時,閘極會「飄」在空中,MOSFET 可能自己亂開;10kΩ 把它拉在 0V,確保平常是關的。
  • 注意 IRLZ44N 的名字裡有「L」,代表 Logic-level(邏輯準位),5V 就能完全打開。一般的 IRFZ44N(沒有 L)需要 10V,Arduino 推不動,買的時候要看清楚。

達靈頓:兩個電晶體手牽手

如果一顆電晶體放大 100 倍不夠,可以把兩顆接在一起:第一顆的射極接到第二顆的基極,兩顆的集極接在一起。這樣第一顆放大 100 倍、第二顆再放大 100 倍,總共 100 × 100 = 10000 倍!這種接法叫達靈頓(Darlington)。

              C(共用)
          ┌───┴───┐
          │       │ C
   B ─────┤ Q1    │
          │╲      │
          ▼ E ────┤ B   Q2
                  │╲
                  ▼ E
                  │
                 GND

代價是:基極要比射極高兩個 0.7V(1.4V)才會導通,而且飽和壓降也變高(約 0.9V)。實驗 9-1 我們會用達靈頓做一個「手指碰一下就亮」的觸控開關。

動手做

實驗 9-1:用小電流點亮 LED,再做手指觸控開關

材料

  • 2N2222 NPN 電晶體 2 顆
  • 紅色 LED 1 顆
  • 220Ω 電阻 1 顆
  • 10kΩ 電阻 1 顆、100kΩ 電阻 1 顆
  • 按鈕開關 1 個
  • Arduino UNO(只用 5V 與 GND 當電源)
  • 麵包板、杜邦線
  • 數位三用電表

接線(第一階段:單顆電晶體)

 +5V ──[ 220Ω ]──►|───────┐
                 LED      │ C
 +5V ──[ 按鈕 ]──[ 10kΩ ]──┤ B   2N2222
                          │ E
                          │
                         GND

  • Arduino 5V → 220Ω → LED 長腳;LED 短腳 → 2N2222 的 C。
  • Arduino 5V → 按鈕一腳;按鈕另一腳 → 10kΩ → 2N2222 的 B。
  • 2N2222 的 E → GND。

步驟

  1. 照圖接好。沒按按鈕時,LED 應該不亮(基極沒電流,閥門關著)。
  2. 按住按鈕,LED 亮。按住的同時用電表量:B 對 GND 的電壓(V_BE)、C 對 GND 的電壓(V_CE)、10kΩ 兩端的電壓(用來算 I_B = 電壓 ÷ 10000)、220Ω 兩端的電壓(用來算 I_C = 電壓 ÷ 220)。
  3. 把 10kΩ 換成 100kΩ,重做步驟 2。LED 有沒有變暗?V_CE 有沒有變高?
  4. 把 100kΩ 和按鈕都拔掉,改成:一根杜邦線接 5V、另一根接 B,兩根線的另一端都露出來。用兩隻手指分別捏住兩根線的金屬部分(可以先把手指沾濕一點),看 LED 有沒有反應。你的身體電阻大概是幾十萬到幾百萬 Ω,現在它就是基極電阻。
  5. 第二階段:加第二顆 2N2222 做達靈頓。接線改成:
 +5V ──[ 220Ω ]──►|───────┬─────────┐
                 LED      │ C       │ C
 杜邦線(手指)──────────────┤ B  Q1   │
                          │ E       │
                          └─────────┤ B  Q2
                                    │ E
                                    │
                                   GND

  • Q1 的 C 和 Q2 的 C 接在一起 → LED 短腳。
  • Q1 的 E → Q2 的 B。
  • Q2 的 E → GND。
  • 手指的杜邦線接 Q1 的 B(另一根還是接 5V)。
  1. 再用手指捏住兩根線,比較 LED 的亮度跟步驟 4 差多少。

你應該看到

第一階段用 10kΩ:LED 正常亮。V_BE 約 0.7V,V_CE 約 0.05–0.2V(飽和),10kΩ 兩端約 4.3V → I_B ≈ 0.43 mA,220Ω 兩端約 2.9V → I_C ≈ 13 mA。你會發現 I_C ÷ I_B ≈ 30,比 β 小很多——這很正常,因為電晶體已經飽和,集極電流被 220Ω 限制住了,閥門開到底也只能流這麼多。

換成 100kΩ:I_B 只剩約 43 µA,β 取 100 的話最多只能供 4.3 mA。LED 可能變暗一點,也可能還是亮(因為你拿到的那顆 β 可能有 200 以上),但 V_CE 會明顯變高。

手指當電阻:單顆電晶體時 LED 可能只有一點點微光,甚至看不出來。換成達靈頓之後,手指一碰 LED 就清楚地亮起來,因為放大倍數變成一萬倍。恭喜你做出了觸控開關!(整個電路只有 5V,手指碰完全安全。)

觀察與記錄

情況V_BE(V)V_CE(V)I_B(mA)I_C(mA)LED 亮度
10kΩ 基極電阻
100kΩ 基極電阻
手指(單顆)————
手指(達靈頓)————

實驗 9-2:Arduino 經電晶體開關馬達,示波器看集極反相

材料

  • Arduino UNO 與 USB 線
  • 2N2222 NPN 電晶體 1 顆
  • 1kΩ 電阻 1 顆
  • 小直流馬達(3–6V)1 顆
  • 1N4007 整流二極體 1 顆
  • 100µF 電解電容 1 顆(選用)
  • 麵包板、杜邦線
  • 示波器(雙通道,探棒切 10×)
  • 數位三用電表

接線

                Arduino 5V ──────────┬───────────┐
                                     │           │
                                  ┌──┴──┐        │
                                  │ 馬達 │     1N4007 ▲ 白線端朝上(接 5V)
                                  └──┬──┘        │
                                     │           │
                  CH2 探棒接這裡 ───►├───────────┘
                                     │ C
  Arduino D9 ──┬──[ 1kΩ ]────────────┤ B   2N2222
               │                     │ E
   CH1 探棒接這裡                     │
                Arduino GND ─────────┴──── 兩個接地夾都夾這裡

  • Arduino D9 → 1kΩ → 2N2222 的 B。
  • 2N2222 的 E → Arduino GND。
  • 2N2222 的 C → 馬達一腳;馬達另一腳 → Arduino 5V。
  • 1N4007 並聯在馬達兩端:白線端(陰極)→ 5V,另一端(陽極)→ C。
  • 示波器 CH1 探棒 → D9(可以夾在 1kΩ 靠 D9 那一端);CH2 探棒 → C 腳;兩個接地夾 → Arduino GND。

程式

// 第 9 章 實驗 9-2:Arduino 經 2N2222 開關直流馬達
const int motorPin = 9;          // D9 → 1kΩ → 2N2222 基極
const int onTime = 500;          // 馬達轉幾毫秒(看示波器時可以改成 50)
const int offTime = 500;         // 馬達停幾毫秒

void setup() {
  pinMode(motorPin, OUTPUT);     // D9 設為輸出
  Serial.begin(9600);            // 打開序列埠回報狀態
}

void loop() {
  digitalWrite(motorPin, HIGH);  // D9 = 5V,基極有電流,電晶體導通,馬達轉
  Serial.println("Motor ON");    // 在序列埠印出狀態
  delay(onTime);

  digitalWrite(motorPin, LOW);   // D9 = 0V,基極沒電流,電晶體關閉,馬達停
  Serial.println("Motor OFF");
  delay(offTime);
}

步驟

  1. 照圖接好,再三確認 1N4007 白線朝 5V、2N2222 的 E 接 GND,然後上傳程式。
  2. 馬達應該轉半秒、停半秒。打開序列埠監控視窗(9600),應該看到 Motor ON / Motor OFF 交替。
  3. 在馬達轉的時候(程式印 ON 的那半秒),用電表量:1kΩ 兩端電壓(算 I_B)、B 對 GND(V_BE)、C 對 GND(V_CE)。因為每半秒切換一次,電表數字會跳,你可以暫時把程式的 onTime 改成 5000 讓它多轉一會兒再量。
  4. 把電表切到直流電流 10A 檔,串聯在 5V 和馬達之間,量馬達轉動時的電流 I_C。算一下 I_C 有沒有小於 β × I_B = 100 × I_B。
  5. 示波器:CH1、CH2 都設 2 V/div,時間 200 ms/div,觸發來源 CH1、上升緣、準位 2.5V,模式「自動」。把 CH1 的 0V 線放在畫面上半部、CH2 的 0V 線放在下半部。
  6. 觀察兩個通道:CH1 是 D9 的 0V/5V 方波;CH2 是集極的電壓。D9 是 HIGH 的時候,集極是幾伏?D9 是 LOW 的時候呢?
  7. 把時間調到 20 µs/div,觸發改成 CH2、上升緣、準位 5.5V、模式「一般」,看看馬達關掉的瞬間,集極有沒有一個小小的凸起(被二極體限制在約 5.7V)。如果你把二極體拔掉再看——第 7 章的尖波會回來。看完記得裝回去。

你應該看到

電表:1kΩ 兩端約 4.3V → I_B ≈ 4.3 mA;V_BE ≈ 0.7V;V_CE ≈ 0.1–0.3V(飽和)。馬達電流大約 100–300 mA,小於 430 mA,所以電晶體確實飽和了。

示波器:兩個波形剛好相反。 D9 是 5V(HIGH)時,電晶體導通,集極被拉到接近 0V;D9 是 0V(LOW)時,電晶體關閉,集極被馬達拉到 5V。這叫反相(Inverting)。

CH1(D9)
  5V ┤      ┌────────┐        ┌────────┐
  0V ┼──────┘        └────────┘        └──────  時間

CH2(集極)
  5V ┤──────┐        ┌────────┐        ┌──────
  0V ┼      └────────┘        └────────┘        ← 剛好相反
         馬達停       馬達轉      馬達停   馬達轉

在 20 µs/div 下,CH2 上升的那一瞬間會有一個小凸起到約 5.7V,然後落回 5V,那就是被飛輪二極體剪過的反電動勢。

觀察與記錄

量測項目讀數
1kΩ 兩端電壓(V)
I_B = 1kΩ 電壓 ÷ 1000(mA)
V_BE(V)
V_CE 馬達轉時(V)
馬達電流 I_C(mA)
β × I_B(取 β = 100)(mA)
有飽和嗎?(I_C < β × I_B)
示波器:D9 = 5V 時集極電壓(V)
示波器:D9 = 0V 時集極電壓(V)

替換玩法:把馬達換成無源蜂鳴器,程式改用 tone(motorPin, 440) 與 noTone(motorPin) 交替,就有一個用電晶體推動、更大聲的蜂鳴器。

實驗 9-3:換成 MOSFET IRLZ44N

材料

  • 實驗 9-2 的全部材料(2N2222 換下來)
  • IRLZ44N MOSFET 1 顆
  • 220Ω 電阻 1 顆、10kΩ 電阻 1 顆

接線

                Arduino 5V ──────────┬───────────┐
                                     │           │
                                  ┌──┴──┐        │
                                  │ 馬達 │     1N4007 ▲ 白線端朝上
                                  └──┬──┘        │
                                     │           │
                  CH2 探棒接這裡 ───►├───────────┘
                                     │ D
  Arduino D9 ──┬──[ 220Ω ]──┬────────┤ G   IRLZ44N
               │            │        │ S
   CH1 探棒接這裡        [ 10kΩ ]     │
                            │        │
                Arduino GND ┴────────┴──── 接地夾

  • Arduino D9 → 220Ω → IRLZ44N 的 G。
  • G → 10kΩ → GND。
  • IRLZ44N 的 S → GND;D → 馬達一腳;馬達另一腳 → 5V。
  • 1N4007 並聯馬達,白線端接 5V。
  • 示波器 CH1 → D9,CH2 → D 腳,接地夾 → GND。
  • 小心 IRLZ44N 背面的金屬片和 D 腳相通,不要讓它碰到別的線。

步驟

  1. 用和實驗 9-2 完全相同的程式。
  2. 馬達轉的時候量 D 對 GND 的電壓(V_DS),跟 9-2 的 V_CE 比較。
  3. 量 G 對 GND 的電壓,以及 220Ω 兩端的電壓(算閘極電流)。
  4. 示波器看 CH1 和 CH2,應該和 9-2 一樣是反相的方波。
  5. 把 10kΩ 拔掉,拔掉 Arduino 的 USB 再插回去,在程式開始跑之前的那一瞬間,馬達有沒有自己抖一下?(這就是閘極「飄」在空中的後果。)看完把 10kΩ 裝回去。

你應該看到

V_DS 幾乎是 0.00V(電表可能顯示 0.00 或 0.01V),比 2N2222 的 0.1–0.3V 低很多。220Ω 兩端電壓是 0V——MOSFET 穩定導通後閘極完全不吃電流(10kΩ 那邊會流 5 ÷ 10000 = 0.5 mA,那是下拉電阻的,不是閘極的)。示波器上一樣是反相。

觀察與記錄

比較項目2N2222(實驗 9-2)IRLZ44N(實驗 9-3)
控制腳對 GND 電壓(V_BE / V_GS)
控制腳電流(I_B / I_G)
導通時負載端對 GND 電壓(V_CE / V_DS)
摸起來的溫度
示波器 CH2 是否反相

用儀器看看

示波器:雙通道看反相

這是本書第一次正式用兩個通道同時看「輸入」和「輸出」,設定重點:

項目設定為什麼
探棒兩支都 10×集極可能有短暫的尖波,10× 比較安全
接地夾兩個都夾 Arduino GND兩個通道的接地夾在示波器裡面是連通的,夾不同地方會短路
CH1 / CH2 V/div2 V/div0–5V 的方波,約占 2.5 格
兩通道 0V 位置CH1 放上半部、CH2 放下半部兩個波形分開看,才看得出上下相反
s/div200 ms/div程式每 500 ms 切換一次,畫面可以看到兩個週期
觸發CH1、上升緣、2.5V、自動以 Arduino 的輸出當基準
看尖波時20 µs/div,觸發 CH2、5.5V、一般跟第 7 章一樣的技巧

很多示波器有「數學(Math)」功能可以把 CH1 和 CH2 相加或相減,可以試試看 CH1 + CH2:導通和關閉時都接近 5V,因為兩個波形互補。

三用電表:認腳位、量 β

用二極體檔認 2N2222 的腳位:B-E 和 B-C 之間都像一顆二極體。把電表切到二極體檔,紅棒固定在中間那隻腳(B),黑棒分別碰左右兩隻腳:兩邊都應該顯示 0.6–0.7V(黑棒碰 E 那邊會略高一點點,例如 0.68 對 0.65)。紅黑對調後兩邊都應該是 OL。如果中間腳不符合這個規律,表示你拿到的不是 E-B-C 排法,要查規格書。

量 β:有些三用電表有「hFE」檔和一個小插座,標著 E、B、C。把 2N2222 依照腳位插進去(NPN 那一側),電表會直接顯示 β 值,通常在 100–300 之間。同一包裡的兩顆 2N2222 可能差很多,這就是為什麼設計時 β 要保守取 100。

量 MOSFET 有沒有壞:IRLZ44N 的 D-S 之間內建一顆二極體(方向是 S → D)。二極體檔紅棒碰 S、黑棒碰 D 會顯示約 0.5V;反過來應該是 OL。如果兩個方向都是 0,MOSFET 已經短路燒掉了。

常見錯誤與除錯

  • 馬達完全不轉,電晶體不熱 → D9 的線沒接到 1kΩ,或 E、C 接反(接反時 β 只剩個位數,幾乎推不動)→ 量 B 對 GND,HIGH 時應有 0.7V;確認平面朝自己由左到右 E-B-C。
  • 馬達轉很慢,電晶體很燙 → 基極電阻太大沒飽和,或馬達被卡住電流過大 → 量 V_CE,超過 0.5V 就是沒飽和;確認用 1kΩ;用手撥一下馬達看會不會卡。
  • Arduino 一直重開(序列埠反覆印出開頭的訊息) → 馬達起動電流把 USB 的 5V 拉垮 → 在 5V 和 GND 之間加 100µF 電解電容;或用 3 號電池盒(3 顆)供電給馬達,電池盒黑線接 Arduino GND,紅線接馬達和二極體陰極。
  • 馬達一直轉,不受 Arduino 控制 → 2N2222 的 C、E 短路燒壞了(可能是之前沒接二極體被尖波打壞),或 MOSFET 的閘極沒有 10kΩ 下拉 → 換一顆電晶體;裝上下拉電阻。
  • 示波器 CH2 看起來跟 CH1 一樣,不是反相 → CH2 探棒夾到 D9 那一排,或夾到 5V → 確認探棒尖端在 C 腳(麵包板上跟馬達同一排)。
  • 一碰電路,Arduino 的 5V 就掉到 3V 以下 → 1N4007 接反了,電晶體一導通就把 5V 短路 → 立刻拔 USB,把二極體轉 180 度。
  • IRLZ44N 一插上去就很燙 → D-S 接反或散熱片碰到別的導線 → 斷電檢查;確認 G-D-S 由左到右,印字面朝自己。

想一想

1. 如果基極電阻改用 4.7kΩ,I_B 是多少?β 取 100 的話,最多能讓多少集極電流飽和?這樣可以推 LED(約 10 mA)嗎?可以推馬達(約 200 mA)嗎?

參考答案

I_B = (5 − 0.7) ÷ 4700 = 4.3 ÷ 4700 ≈ 0.000915 A ≈ 0.92 mA。I_C(最大) = 100 × 0.92 ≈ 92 mA。推 LED 綽綽有餘;推 200 mA 的馬達不夠,電晶體不會飽和,會發熱。所以推馬達還是用 1kΩ。

2. 實驗 9-1 用手指當基極電阻,假設你的手指電阻是 1MΩ。單顆 2N2222(β = 100)時,集極電流最多多少?換成達靈頓(β = 10000,V_BE 用 1.4V)呢?

參考答案

單顆:I_B = (5 − 0.7) ÷ 1000000 = 4.3 µA,I_C(最大) = 100 × 4.3 µA = 0.43 mA,LED 只會非常微弱地亮。達靈頓:I_B = (5 − 1.4) ÷ 1000000 = 3.6 µA,I_C(最大) = 10000 × 3.6 µA = 36 mA,已經超過 LED 電路本身(220Ω 限制約 13 mA)需要的電流,所以 LED 會全亮。

3. 為什麼飛輪二極體的白線端一定要接 5V 那邊,而不是接集極那邊?用「平常」和「關掉的瞬間」兩種情況說明。

參考答案

白線(陰極)接 5V 時,平常電晶體導通,二極體兩端是 5V 對 0.2V,是逆向的,不導電,不影響馬達。關掉瞬間,馬達線圈把集極推到高於 5.7V,二極體變成順向導通,把能量繞回去,集極就被限制在 5.7V。如果接反(陰極接集極),平常電晶體一導通,二極體就是順向,5V 直接經過二極體和電晶體短路到 GND,電流暴衝,會燒掉元件。

4. 第 17 章的「Wi-Fi 遙控風扇」要推一顆會吃 1A 的風扇。該用 2N2222 還是 IRLZ44N?請給兩個理由。

參考答案

用 IRLZ44N。理由一:2N2222 最大集極電流只有 800 mA,1A 會超過;IRLZ44N 可以到幾十安培。理由二:2N2222 要飽和 1A 需要 I_B 至少 10 mA(β = 100 時),接近 Arduino 腳位上限,而且飽和壓降 0.3V × 1A = 0.3W 會發熱;IRLZ44N 閘極幾乎不吃電流,R_DS(on) 只有 0.022Ω,1A 時只有 0.022W,幾乎不熱。

5.(開放挑戰) 第 7 章說繼電器模組的板子上已經有電晶體和二極體。請根據本章學到的低邊開關接法,畫出你猜想的繼電器模組內部電路(IN 腳、電晶體、基極電阻、線圈、飛輪二極體、VCC、GND),並說明當 IN 接 HIGH 時電流怎麼走。

參考答案

IN → 基極電阻(約 1kΩ)→ NPN 電晶體 B;E → GND;C → 繼電器線圈一端;線圈另一端 → VCC(5V);1N4007 並聯線圈,陰極接 VCC。IN 為 HIGH 時,基極電流流進 B,電晶體導通,電流從 VCC → 線圈 → C → E → GND,線圈變成電磁鐵吸住接點。IN 為 LOW 時電晶體關閉,線圈的反電動勢經二極體繞回去。(實際模組很多會再加一顆 LED 指示燈,有些則用 PNP 或光耦合器做成「LOW 才動作」的版本,所以用之前要看模組說明。)

6.(開放挑戰) 不用 Arduino,只用光敏電阻(LDR)、電阻、2N2222、LED 和 5V,設計一個「天黑自動亮燈」。提示:第 3 章的分壓器可以把「亮度」變成「電壓」,而電晶體在 B 大約 0.7V 時會開始導通。畫出電路並說明亮和暗的時候 B 腳電壓怎麼變。

參考答案

一種做法:5V → 10kΩ → B 腳節點 → LDR → GND(10kΩ 在上、LDR 在下組成分壓器,B 腳接在中間);LED 接法同實驗 9-1(5V → 220Ω → LED → C,E → GND)。白天 LDR 電阻很小(幾百 Ω),分壓點被拉得很低(遠低於 0.7V),電晶體關閉,LED 不亮;天黑時 LDR 電阻變成幾十 kΩ 以上,分壓點升到 0.7V 以上,基極有電流,電晶體導通,LED 亮。可以把 10kΩ 換成 10kΩ 可變電阻來調整「多暗才亮」。想讓它切換得更乾脆,可以改用達靈頓。

本章小結

  • 電晶體是「用小電流控制大電流」的閥門:I_C ≈ β × I_B,2N2222 的 β 約 100–300,設計時保守取 100。
  • 2N2222 平面朝自己、腳朝下,由左到右是 E、B、C;NPN 符號的箭頭在射極上、朝外。
  • 當開關時要讓電晶體飽和:V_CE 只剩 0.1–0.3V,不發熱。基極電流不夠就會「半開」而發燙。
  • 基極電阻用 1kΩ:I_B = (5 − 0.7) ÷ 1000 = 4.3 mA,β = 100 時可讓 430 mA 以內的負載飽和。
  • 標準低邊開關接法:負載接 5V 與 C 之間,E 接 GND 並與 Arduino 共地,基極串 1kΩ,馬達和線圈並聯飛輪二極體。
  • 示波器雙通道看輸入(D9)和輸出(集極):兩者反相,D9 HIGH 時集極接近 0V。
  • IRLZ44N 由左到右是 G、D、S,靠電壓控制,5V 就全開,R_DS(on) 只有 0.022Ω,適合推 1A 以上的負載;閘極串 220Ω 並加 10kΩ 下拉。
  • 達靈頓把兩顆電晶體串起來,β 相乘(100 × 100 = 10000),但需要 1.4V 才導通。

名詞表

中文英文一句話解釋
電晶體Transistor用小訊號控制大電流的半導體元件
NPN 電晶體NPN Transistor基極電流流進去、集極電流從 C 流到 E 的電晶體,本書用 2N2222
基極Base(B)電晶體的控制腳,小電流從這裡進來
集極Collector(C)大電流流進電晶體的腳
射極Emitter(E)大電流流出電晶體的腳,通常接 GND
電流放大倍數β(hFE)集極電流除以基極電流,2N2222 約 100–300
飽和Saturation電晶體開到底的狀態,C-E 之間只剩 0.1–0.3V
基極電阻Base Resistor(R_B)串在 Arduino 腳位和基極之間、決定基極電流的電阻
低邊開關Low-side Switch電晶體接在負載和 GND 之間的開關接法
共地Common Ground兩個電路的 GND 接在一起,電流才有回路
反相Inverting輸出和輸入剛好相反:輸入 HIGH 時輸出 LOW
MOSFETMetal-Oxide-Semiconductor FET用電壓控制的電晶體,本書用 IRLZ44N
閘極 / 汲極 / 源極Gate / Drain / Source(G/D/S)MOSFET 的三隻腳,分別對應 B / C / E
導通電阻R_DS(on)MOSFET 完全打開時 D-S 之間的電阻,IRLZ44N 約 0.022Ω
邏輯準位 MOSFETLogic-level MOSFET5V 就能完全打開的 MOSFET(型號裡的 L)
下拉電阻Pull-down Resistor把腳位平常拉到 0V、避免「飄」的電阻
達靈頓Darlington兩顆電晶體串接、放大倍數相乘的接法