從平滑的類比世界,到一個是或否
到目前為止的每一階都活在平滑的類比世界裡,那裡的電壓可以是任何數值。比較器正站在通往數位世界的邊界上,回答一個殘酷而單純的問題:我 + 輸入上的電壓,是不是比 - 輸入上的電壓大?答案是單一個位元——是,輸出就 HIGH;否,輸出就 LOW。你在運算放大器介紹的最末尾其實已瞥見這件事:拿一顆運算放大器,完全不給它負回授,那兩條黃金法則就崩潰了——輸出不再耐心地把兩個輸入維持相等,而是直接猛撞到電軌。在這裡,我們刻意地造出這件事,並讓它變得有用。
算一下就知道這記猛撞為何無可避免。開迴路時,輸出遵守 Vout = A times(V+ - V-),其中 A——也就是開迴路增益——大得驚人,又沒有任何回授去縮小那個差值。若 A = 100,000、電源為 5 V,那麼輸入差值只要達到區區 5 / 100,000 = 50 微伏,輸出就到達極限了。一絲氣息般的差值,就把它整個釘在全高或全低。所以比較器其實是一個 1 位元的決策者——這也讓它成為最簡單的類比數位轉換器,正是你上一階遇過的快閃式與 sigma-delta 轉換器核心裡那個 1 位元量化器。
為什麼要用比較器——而不只是把運算放大器開迴路用
你很容易想隨手抓一顆閒置的運算放大器,省掉回授電阻,就把它當比較器用。在工作台上它甚至半能用,而那正是危險之處。但它確實是錯誤的零件,原因有三個,都值得一步步走過。
- 速度。運算放大器在內部被刻意放慢(它的頻率補償),好讓你真的把回授繞上去時它仍保持穩定。開迴路運轉時,它的輸出以其迴轉率在電軌之間慢慢爬——一顆 0.5 V/us 的零件,光是跨過 5 V 的擺幅就要約 10 us——更糟的是,它被驅入飽和後復原得很遲鈍。真正的比較器沒有補償電容,天生就是要在數十奈秒內猛然切換。
- 輸出。運算放大器的輸出朝它的類比電源軌擺動——而且常常連電軌都搆不乾淨。那不是你的微控制器讀得懂的整齊數位準位。比較器的輸出級則是設計來方方正正地落在有效的邏輯準位上,一個乾淨的 0 或 1,讓數位世界毫無爭議地接受。
- 輸入的行為。許多運算放大器內部有箝位二極體,或在兩個輸入相差超過約一伏時就會作怪的輸入級——甚至閂鎖(latch up)或抽取大電流。但兩個輸入之間有著巨大而持久的差值,恰恰是比較器正常的工作狀態。比較器的輸入天生就能整天停在天差地遠的電壓上而毫無怨言。
這個教訓比這一顆晶片更大:去讀資料手冊、弄清一個零件究竟是為了做什麼而生,並為任務挑對的元件,勝過硬把熟悉的零件塞進一個它從未被補償去扮演的角色。運算放大器被補償成在回授下保持冷靜;比較器則天生就是要在沒有回授時果斷決策。電路圖上是同一個三角形,設計目標卻相反。
為了與邏輯對話而生的輸出:開集極與上拉電阻
這裡有個每個人第一次都會栽跟頭的意外:相當多的比較器(經典的 LM393 即在其中)根本不會把輸出驅動成 HIGH。它們的輸出是開集極(MOSFET 零件上則是開汲極)——輸出電晶體只能把節點往下拉到接地、吸入電流;要往上,它就單純地放手,讓節點浮著。所以你必須從輸出接一個上拉電阻到你想要的電源。那個電阻才是製造出 HIGH 的東西,而它接的電源選定了 HIGH 的準位:接到 3.3 V 就得到 3.3 V 的高準位,接到 5 V 就得到 5 V 的高準位。你剛剛就免費完成了兩個電壓域之間的準位移位。
+5V
|
[10k]
| +3.3V (logic supply)
+----(-) ref = 2.5 V |
| \ [ Rp ] pull-up: makes the HIGH, sets the domain
[10k] >--[ comparator ] |
| / open-collector |
GND / output |
Vin ---(+) \ |
+----------+------> OUT to microcontroller
| (clean 0 V or 3.3 V)
=== internal output transistor
| Vin > 2.5V -> transistor OFF -> pull-up lifts OUT to 3.3V (HIGH)
GND Vin < 2.5V -> transistor ON -> OUT pulled down to ~0V (LOW)挑上拉電阻的大小是一場小小的拔河。值取太大,要對抗導線與下一顆晶片輸入的雜散電容,就會把上升邊緣磨成一條懶洋洋的 RC 曲線——變慢,而比較器的整個任務偏偏就是要快。值取太小,既浪費電流,更糟的是當輸出為 LOW 時可能超過比較器額定的吸入電流。取 Rp = 4.7 k 接到 3.3 V,低態的吸入電流是 3.3 / 4700 ≈ 0.7 mA,很從容;降到 330 ohm 就是 10 mA,對許多零件沒問題,但這是個你必須先對著資料手冊核對的數字。
開集極藏著一個額外好處。把好幾個比較器的輸出綁到同一個共用的上拉電阻上,你就得到線或:因為任何單一輸出都能把共用線拉到接地、卻沒有一個能強迫它變高,所以這條線只有在它們全部放手時才會是 HIGH——只要有任何一個警報觸發,就把共用的鈴聲拉低。共用的數位匯流排也是這樣運作的,第 3 篇會把它充分展開。還有一個概念要帶往後續:設計良好的邏輯族系會留下雜訊邊際——在仍被讀為有效 0 的最高電壓,和被讀為有效 1 的最低電壓之間,留出一段刻意的間隙——好讓導線上的一點雜訊,沒辦法不小心把 0 翻成 1。
抖動問題
草叢裡藏著一條蛇,而當你拿一個赤裸的比較器去處理真實訊號時,牠當下就咬。比較器在它的門檻處殘酷地敏感——別忘了,僅僅 50 微伏的差值就完全決定了它。所以當輸入緩慢地穿越、或哪怕只是帶著幾毫伏的雜訊一起騎過來時,輸出不會做出一次乾淨的轉換。它會閃爍 HIGH-LOW-HIGH-LOW 好多次,因為毛糙的訊號在門檻附近來回跳舞。這就是比較器抖動,而對一個正在數邊緣的微控制器來說,一次真正的穿越看起來像是一打幽靈事件。
具體想像一下。一道緩慢的正弦波,背上馱著 5 mV 的毛刺,慢慢往上爬,穿過你的 2.5 V 門檻。每當那毛刺剛好把瞬時電壓抖回 2.5 V 以下一絲絲,輸出就猛地彈回 LOW;下一次往上的抖動又把它猛地彈成 HIGH。在訊號逗留於門檻附近的那幾毫秒裡,輸出是一陣數位雜訊,而不是一個果斷的階躍。你的穿越越乾淨、越快,你就越不會注意到——但真實世界的訊號鮮少兩者兼具。
誠實的附帶條款:偏移,以及為什麼混合訊號很難
門檻從來不會剛好落在你的分壓器所說的位置。每一顆比較器都帶著輸入偏移電壓——兩個輸入之間幾毫伏的內建不平衡,悄悄地把真正的跳變點往上或往下挪。如果你比較的兩個電壓只差一毫伏,一個 3 mV 的偏移就能直接給你錯誤的答案。修正的方法誠實而簡單:要嘛挑一顆低偏移的零件,要嘛安排你的電路,讓你要比較的訊號差得遠比偏移大,把它淹沒掉。
現在來說更深一層的誠實,也是這整階存在的理由:混合訊號很難。比較器恰恰活在類比與數位的交界上,而那個交界是個充滿敵意的地方。它自己的輸出製造出快速、全擺幅的數位邊緣,而那些陡峭的邊緣從電源大口吞電流,又以電容方式耦合進附近的導線——正是那種串擾,能繞一圈又落回比較器自己那敏感到毫伏級的輸入上,把它重新觸發。一個與自己的輸出搏鬥的電路,是經典的新手心碎。這就是所有混合訊號設計的核心難處:快速的數位邊緣,把雜訊噴灑到嬌弱的類比節點上。
防禦手段是下一階的工藝,但現在先點名出來,好讓你知道接下來會遇到什麼:在晶片電源腳正旁邊放一個去耦電容(一座在地的水塔,好讓那一口快速的電流吞嚥,不會使長長的供電線垂降),一塊扎實的接地層、並把吵雜的數位輸出在實體上遠離安靜的類比輸入,再加上第 2 篇的遲滯,好讓小擾動再也翻不動決定。而一旦你乾淨的 1 位元決定誕生了,你通常還需要肌肉去依它行動——透過電晶體驅動器、繼電器,或跨越隔離屏障的光耦合器去切換一個真實的負載——那就是第 5 篇。從這一個零件開始,這一階就此展開:遲滯(2)、深入的邏輯準位與上拉(3)、類比開關與取樣保持(4),以及驅動負載(5)。