浮接 Floating 是甚麼? 電路的不確定因素

浮接 Floating 的意思就是電路的輸出Output或輸入Input腳位因為空接,導致無可預期的結果出現,就會讓你的電路或程式出現莫名其妙的輸出甚至當機,接下來會說明空接為何影響這麼大。至於為何會當機? 大家可以猜一下,文章最後會揭曉答案。

從電阻分壓講起

下圖是個簡單的電阻分壓電路,R1與R2的比例是9:1,所以晶片Chip端的Input腳位電壓是電源的1/10,這個計算式在下方,有學過電路學的人應該都會算。

\(V_{input}=\frac{R2}{R1+R2}V_{1} =\frac{1M}{9M+1M}V_{1} =\frac{1}{10}V_{1} \)

分壓器電路
分壓器電路

這時候若你用手指去觸碰Input端,這時Input會感應到高高低低的電壓,當然口說無憑,要證明這件事情,需要一些小眉角,那也就是為何我會刻意選9M與1M ohm電阻的原因。

因為這個分壓電路的1M ohm就是示波器的輸入阻抗,9M ohm的部分就是示波器探棒的電阻,也就是所謂的10X探棒,只要在探棒接頭與示波器輸入端之間,利用T型轉接頭做橋接,就有辦法將Input端的接點用導線接出來。

直接來看實例,我拿了一個探棒先接上T型BNC接頭,再接進示波器,這個T型接頭就可以方便我們做實驗,而探棒的探針與GND則刻意短路,也就是V1=0,所以示波器應該要看到一條直線,實際上也是如此,如下圖。

正常的示波器與探棒連接
正常的示波器與探棒連接

你可以看到CH2的旋鈕上我掛了一捲焊錫,這是要拿來當對照組用的,因為接下來我要把焊錫插入T型接頭內。如下圖,在焊錫插入T型接頭中心導體的瞬間,螢幕就出現弦波的擾動,主頻率是60Hz,目前每格是20mV,其實震幅很小。由於我現在是要測量的對象是示波器的input,所以即便我用的是10X的探棒,示波器的倍數我開的仍然是1.00:1,也就是1X。

示波器的input 浮接 時,受到環境的擾動
示波器的input 浮接 時,受到環境的擾動

當然這種振福只有10mV的波形,相信你也看不上眼,可能只當它是雜訊而已,但若你用手指去碰焊錫,那結果完全不同,如下圖示波器直接破表給你看,我刻意不調整Scale,這樣視覺效果比較強烈,實際上這是個振福大約7V的60Hz弦波。

7V的振幅上下就跨了14V,你再也無法忽略它,可能你還會想要消除這種現象,最有效的方法就是在輸入電阻R2的1M ohm上再並聯一個相對小的電阻,例如並上一個1K、10K 甚至100K ohm的電阻,如此這種雜訊馬上就會消失了。

當然你也可以把探棒R1電阻換掉,改串接一個相對小的電阻,一樣能讓雜訊消失,所以R1與R2的電阻越小,越能讓雜訊變小。

浮接 Floating

延續上面的示範電路, 所謂浮接就是輸入端空接,也就是R1的阻值無窮大,所以輸入端不受V1影響,此時影響R2電壓的因素只剩下兩個:

  • Input接出來的導線長度
  • 輸入阻抗R2的大小

導線長度越長,受環境磁場變化的程度越高,感應電動勢EMF推動的電荷的力量就越大,同時搭配輸入阻抗R2越大,由EMF推入的電荷產生的電壓差就越大。反之若R2越小,流入的感應電荷在R2兩端形成的電壓就越小。

高阻抗容易變成天線

所以若Input空接,剛好輸入端又是高阻抗,那麼你那空接的pin腳就很容易受到外界磁場擾動的影響,換句話說它變成天線了。前面有一張圖是用手觸碰示波器輸入端,造成非常大的擾動,就是因為人體擔任了天線的角色。

這個磁場擾動通常來自台電的60Hz電流,如果你是在歐洲那就會是50Hz,磁場變化讓導線感應出微小的電流,當電流通過R2的1M ohm阻抗時,便轉換成了電壓,因而顯示在示波器螢幕上,這個Input端的導線其實就是一條天線,相關文章可以參考手摸示波器探棒-為何有弦波? 原因在這裡

當R2輸入阻抗越高,或Input接出來的導體面積越大,導線長度越長,這個接在Input上的導線對環境就越敏感,一點點磁場的風吹草動,例如隔壁開個電風扇,可能就會讓你的示波器出現劇烈的變化。

那為何當R1、R2換成如1K、10K ohm等級的電阻時,不會有這種現象? 其實它並不是沒有電磁感應的現象,而是它的感應小到你無法察覺,所以你忽略它了。有人說IC的腳這麼短,會有影響嗎? 我的經驗是不一定,但為了電路的穩定,一定不要讓Input空接。

浮接 造成誤動作

雖然擾動的能量很小,但是電晶體的導通臨界電壓,一如它的單位”電壓”所示,它是認電壓的,電壓只要到了臨界值它就作動了,只是這感應來的電壓可能忽高忽低,會讓你的電晶體有時ON有時OFF。

這個意思就是說,原本沒有要讓電晶體作動的V1,現在因為外界的擾動反而讓電晶體產生作動,這就是誤動作,你沒有要它動但它卻動了,這十足像個靈異現象。

一旦發生誤動作,事情可大可小,小則電燈該亮不亮,大則鐵捲門壓到人或車,所以工程師絕對不能讓自己設計的產品產生誤動作。

輸入腳位不能 浮接

為了避免誤動作,IC的輸入腳位絕不能空接或說浮接,一定要串接一個電阻到Vcc或是GND,我們稱為Pull High或Pull Low。

避免 浮接 輸入端務必要 pull high 或 pull low
避免 浮接 輸入端務必要 pull high 或 pull low

如此一來,若沒有訊號接入,Input腳位仍會有個預設值,Pull High的腳位預設準位就變成High,若輸入訊號是Low,Input仍然會收到Low,因為中間有個pull high電阻會形成壓降,頂多只是裡面有電流,多消耗了一些功率就是。

不過現在的晶片越來越有彈性,很多腳位都是所謂的泛用型輸入輸出GPIO(General Purpose Input/Output),你必須寫程式將它設置成為Input它才會是Input,這種情況就會變成你一開始就要先規劃好那些腳位要當Input,因此一開始就要把Pull High/Low電阻設計到layout上。

到底是誰的問題

通常計畫趕不上變化,做案子總是會半途變更規劃的時候,這時就很容易忘記要把Pull High電阻加上去,如果你是一人包案那可能還好處理,若是軟硬體分開兩個team處理,當軟體變更設定需要硬體來配合,但硬體修改設計需要時間,如果時程拖到又要被責怪的話,就會經常上演”為何是我被罵”的戲碼。

通常做案子基本上就是這樣,會在吵吵鬧鬧中進行,酸甜苦辣都有,這時溝通就很重要,如果你的合作夥伴跟你很有默契,那你應該上輩子有燒好香,好好惜福吧。

為何會當機?

記得十多年前助教正在一個新平台上做開發,由於是下一代延伸產品,所以理論上只要CPU沒變,記憶體也裝得下程式,這個平台應該就能順利開機。無奈事與願違,開機10次大概會有3~4次當機的機會,心想這比例也太高了吧!

妙的是前一天完全沒有這種現象,程式沒有拿錯版本,電路板也是同一塊,這就怪了,讓你猜猜這到底是怎麼回事?

於是我把程式的Debug flag打開,執行程式後UART開始跳出開機過程的訊息,很明顯當機的地方位於UART初始化這一步,因為板子上有2組UART,第一組就是我目前正在用的Debug Port,但是第二組還沒使用,就是它造成當機,推測是有甚麼訊號送到第二組UART去,讓它誤動作了。

於是我拿了示波器接上UART2的接收腳位RX,觀察看看是否有甚麼怪訊號跑進去。說也奇怪,示波器接上之後,居然每次就能順利開機了,真是見鬼了! 這種情況我心裡大概有譜,可能是RX浮接、或是電容值不夠之類的。因為探棒本身有電阻10M ohm,也有電容約30p左右,只要探棒掛上測點,它與待測電路會自然產生排除雜訊的效果。

於是我開始檢查線路圖,果然發現UART的RX腳位真的是浮接Floating的,於是拿了個電阻將它Pull high,就完全正常了。

但為何這樣會當機? 經過一連串的程式碼追蹤,原來是因為當UART RX浮接時,如前面所說電壓會有時H有時L,而L訊號便會觸發UART的中斷,因為RX的”資料開始Start”訊號是以L準位作為識別,當RX收到第一個L,便會觸發UART的中斷訊號,接著就會開始執行中斷服務函式ISR(Interrupt Service Routine) 。

只是目前正在開機當中,而中斷向量還要再過幾行程式才會掛進來,或是說ISR的指標還沒有寫入中斷向量表,那裏面都還是初始值或是亂數,如果現在發生中斷,CPU就會亂跳到某個記憶體,並將它視為ISR來執行,想當然爾就當機了。

那為何前一天都沒事? 這只有天曉得,浮接Floating的電壓對於環境有很高的敏感度,天線周遭的東西擺放位置與材質,都會影響電壓的高低,所以只要遇到Floating,就是未知數。

當機的解法

所以這種當機的解法,分為兩方面軟體與硬體。軟體的部分,在ISR掛進來之前,中斷功能不可以開啟Enable,這其實是寫韌體的人該有的Sense,通常是新手才會犯的錯誤,但系統大、軟體的Call Stack又深、人手少,有時候就會犯這種錯;硬體的解法,就是在UART RX端加上Pull High電阻,讓輸入電壓不再浮動。

雖然軟體或硬體只要有一邊修改就可以克服這個狀況,但以我的做法都會兩邊一起修改才是上策,距離潛在的Bug才會遠一點,總之別讓Input浮接,不然你將來會有忙不完的事情。

相關文章

手摸示波器探棒-為何有弦波? 原因在這裡
繼電器 EMI 電磁干擾防範-用一個元件搞定

1 Comment

Leave a Reply

Your email address will not be published.


*