JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

系統化除錯

你把它搭好了、上了電,然後什麼也沒發生。這篇指南要把那股下沉的心情變成一套方法:一塊不動的板子是一個有答案的問題,而實驗桌上的儀器加上一場對半搜尋,會比隨機換零件快得多地把它找出來。

一塊不動的板子是問題,不是謎團

你搭好了某個東西。你給它上電,然後……什麼也沒有。或一縷青煙。或它半死不活地動著,動得毫無道理。誘惑是開始隨機換零件——忍住。電路每一微秒都服從物理,所以無論哪裡出錯,都有一個確切的原因坐在板子上某個確切的位置,而前幾篇指南裡的那些桌上儀器,如今就是你尋找它的感官。除錯不是運氣,也不是藝術;它是一門小而可重複的科學:觀察、提出假設、設計一個假設必須通過或失敗的測試,然後收窄範圍。

前幾篇指南把工具交到了你手上——帶有電流限制的工作電源供應器、三用電表、示波器與它那支已補償的探棒、函數產生器。這篇指南交給你的,是瞄準它們的方法。最強大的那一個念頭是:絕不一次改兩件事,而當你能量到故障在哪時,就絕不去猜它在哪。一次能排除半塊板子的量測,勝過十次走運的換零件。

第一條規則:先檢查電源與接地

在追任何精巧的訊號故障之前,先確認那個無聊的地基:每一顆晶片都真的收到了它的供應電壓,而且是相對於一個穩固的接地。高得驚人的一部分「它不會動」,到頭來只是某條電源軌從未送達、某個接地沒接上、或電源在負載下垮了下去。把三用電表切到直流電壓檔,黑表筆接在一個已知的接地上,然後就在每顆晶片的電源腳上量電壓——不是在電源端子上,是在腳上——因為兩者之間一條太細的走線或一個壞掉的焊點,正是你要獵捕的那種故障。

讓數字開口說話。假設一條 5 V 的電源軌在電源端讀到 5.0 V,但在晶片那端只剩 3.1 V。那 1.9 V 的落差不是雜訊——它是電流乘上中間某個東西的電阻:一道髮絲般的裂縫、一個冷焊點、一條太細的走線。又或者,那條軌在什麼都沒跑時讀到 5 V,卻在你一啟用電路的瞬間垮到 3 V:這時是下游某個東西汲取了遠超過它該有的電流,而電源的電流限制正在盡責地拒絕餵養這場失控。無論哪一種,三用電表都已把「它不會動」變成了那個小得多的問題:「過量的負載在哪裡?」——而把電表切到電流檔、串在電源裡,就會精確告訴你到底被汲走了多少。

兩項大家會跳過的地基檢查。第一,接地的導通:把三用電表切到會嗶嗶叫的導通檔,確認每一個接地點都真的連回了同一個節點——一個浮空或被切斷的接地,會給出怪異而飄移的症狀,偽裝成上百種不同的臭蟲。第二,用示波器看那條軌,而不只是用三用電表。電表讀的是平均值;示波器顯出的是那份擺動。如果每當一顆晶片切換、那條軌就下陷並震鈴,你就有了一顆缺席或擺得太遠的去耦電容——那座在地的水塔,讓電源在它旁邊那台口渴的機器突然灌下一大口時,不至於垂頭喪氣。

分而治之:把問題切成一半

電源穩固之後,最高明的策略是分而治之——和你在字典裡找一個字所用的二分搜尋一模一樣。一個電路是一連串的級,一條從輸入跑到輸出的訊號鏈。與其從頭一級一級地探,不如先探中間。如果訊號在那裡是健康的,故障就落在後半段;如果它在那裡已經錯了,故障就落在前半段。每一次量測都把嫌疑領土砍掉一半,所以一塊有十六級的板子,大約四次探測就被逼到角落,而不是十六次。

要這麼做,你需要一個已知良好的輸入去跟隨。這就是函數產生器掙到它飯碗的地方:在輸入端注入一個乾淨、已知的訊號——比方說一個 1 kHz、峰對峰 100 mV 的正弦波——然後沿著鏈一路走示波器,把你看到的,和設計說你在每個節點該看到的,逐一比對。一個吃進好訊號、卻吐出壞訊號的級,剛剛就招供了。在數位板上,同樣的邏輯改用邏輯分析儀,一次盯住許多條線,正好在圖樣第一次出錯的地方逮到那條匯流排。

 FOLLOW THE SIGNAL  (inject 1 kHz, 100 mVpp at the input)
 ------------------------------------------------------------------------
  node            expected           measured         verdict
  --------------  -----------------  ---------------  -----------------------
  input           1 kHz, 100 mVpp    1 kHz, 100 mVpp  good  -> fault downstream
  after RC filter 1 kHz,  ~70 mVpp    1 kHz, 100 mVpp  C not doing its job?
  amp output      1 kHz, 700 mVpp    flat 0 V         DEAD: fault is HERE
 ------------------------------------------------------------------------
  signal good at input, dead at output  ->  probe the MIDDLE first,
  not stage 1 then 2 then 3 ...   (4 probes corner 16 stages, not 16)
用分而治之來跟隨訊號:在每個節點把預期值和量測值比一比,弄壞訊號的那一級就是元兇。先探中間,好讓每一次量測都把搜尋範圍對半砍。

比對、假設、測試——一次只改一件事

每一次量測,唯有對著一個預期才有意義,所以除錯倚賴三種參考。把板子和它的電路圖比對:實際裝上去的零件,是不是電路圖要求的那一顆,方向對嗎、數值對嗎?把它和一個模擬比對:這個節點該坐在什麼電壓上,真實的那個接近嗎?以及,當你手邊有一塊時,把它和一塊已知良好的板子並排比對。大多數「不可能」的臭蟲,在你注意到某個該讀 2.5 V 的節點卻讀著 0 V、並單純問一句為什麼的那一刻,就溶解了。

對於模擬能告訴你什麼、不能告訴你什麼,要誠實。一個 SPICE 結果的好壞,頂多就和它裡頭的元件模型一樣好,而它對你的實體板子一無所知——它看不見焊橋、看不見一條長長的接地回流、看不見麵包板的雜散電容,也看不見一支正在負載它所量測那個節點的探棒。模擬告訴你設計「應該」做什麼;實驗桌告訴你眼前這一份「實際」做了什麼,連同佈線在內。當兩者不一致時,那個差異「就是」臭蟲,而追逐那道縫隙,就是這場遊戲的全部。

  1. 精確地觀察症狀。「輸入被驅動時輸出卡在 0 V」勝過「它壞了」。把到底哪裡不對、又在到底什麼條件下不對,寫下來。
  2. 提出一個帶有地址的假設。不是「放大器哪裡怪怪的」,而是「我賭回授電阻開路了,所以這個節點應該會浮到電源軌。」一個好的假設會預言一個具體的量測。
  3. 設計那個假設必須通過的測試。若電阻開路,這節點會讀到電源軌;若它沒事,會讀到 2.5 V。在你把探棒按下去之前,就先把判決定好。
  4. 確確實實只改一件事,然後重測。一次改兩件,你永遠分不清是哪一件起了作用——更糟的是,一件修好、另一件弄壞,於是板子當著你的面說謊。
  5. 無論判決如何,你都學到了東西:故障在這裡,或不在這裡。循環下去——觀察、假設、測試、只改一件事——直到嫌疑領土縮小成單獨一個元件。

常見的嫌疑犯:常見故障模式

經歷夠多次的實驗桌後,你會學到故障並不是平均分布的——一小撮故障模式就佔了其中大半,而記住這份清單,能把一臉茫然變成一張檢查表。首先是組裝失誤:裝反的零件(電解電容、二極體與積體電路都在意自己朝哪個方向)、把相鄰兩腳短在一起的焊橋、看似接好其實沒接的冷焊點、放錯的數值,或一支根本沒焊上的腳。這些正是為什麼那十秒的目視檢查,回報如此豐厚。

接著是更微妙的、運作中才現形的故障。一個被逼超過規格書極限的零件——電壓太高、電流太大、熱量太多——終究會壞,有時壞成短路,有時壞成全然開路。一個變得更熱、就導更多、於是又變得更熱的電晶體或穩壓器,會一路走進熱失控,把自己煮熟。而一個完全正確的放大器,若它的回授迴路帶著太多相位移,也可能爆發出不請自來的振盪:實驗桌上的症狀是一個「不會動」的級,其實它正在某個百萬赫茲處高歌,那是你終於把一支夠快的示波器接上去,才看得見的。

貫穿這一切的那條線:故障有一個原因,原因有一個地址,而桌上儀器加上一場對半搜尋,會比運氣快得多地把它找到。除錯,和設計本身是同一個有紀律的迭代迴圈——觀察、假設、測試、只改一件事、重複——而它正是你真正開始懂得自己電路如何運作的地方,因為一個從不曾出過半點差錯的電路,什麼也教不了你。這個階段的最後一篇,將以深入解讀規格書、並在這些故障模式咬人之前就認出它們,來把這個迴圈收尾。