DIP 開關與微控制器介接的基礎知識

將微控制器連接到雙列直插封裝 (DIP) 開關是常見的應用。俗稱「DIP」的開關有多種設計可供選擇,從適合麵包板原型設計的傳統 DIP 到表面貼裝「鋼琴」型,再到具有易於讀取的十六進制值的旋轉開關。

image image image

在這篇文章中,我們將仔細研究旋轉開關,並探討如何將其整合到我們的微控制器設計中。本文介紹的技術通常適用於所有微控制器設計。

從規則開始

讓我們從一個簡單的規則開始:不允許浮動輸入。當微控制器針腳配置為輸入但未連接時,會發生浮動輸入。此處顯示了一個範例。當開關閉合時,相關針腳連接到正極軌。當開關打開時,針腳懸空。

image

這是非常不希望的,因為針動引腳可能被解釋為邏輯高電平,或者在其他時候解釋為邏輯低電平。從故障排除的角度來看,微控制器的反應沒有規律或理由。此針腳容易受到雜訊的影響,並且通常會鬆散地遵循相鄰微控制器針腳的值。

解決方法是加一個下拉電阻,如下圖。透過這個微小的變化,當開關閉合時,微控制器的針腳將被上拉至電源軌,或者當開關打開時,微控制器的針腳將被下拉至接地。

image

最佳化方案

現代微控制器就是為這種類型的介面而建構的。幾乎所有微控制器都具有帶有內部電阻的 I/O 部分,用於對 I/O 針腳進行上拉或下拉。這是理想的,因為開關可以直接連接到微控制器,從而消除對外部電阻的需求。

技術提示:有些微控制器同時具有上拉 (Pull-up) 和下拉 (Pull-down) 電阻。有些只有一種類型,上拉電阻配置更為常見。這些週邊通常被稱為“弱上拉(Weak Pull-up)”,消耗數十至數百uA。這相當於連接一個值在 15kΩ 到 150kΩ 之間的外部拉電阻。

Arduino 的一個例子是:

pinMode(SW_PIN_D0, INPUT_PULLUP);

此原理圖展示了一種將微控制器連接到開關的方法。雖然此範例採用旋轉 DIP 開關,但此設計適用於所有開關。這裡有一些觀察:

  • 利用微控制器的特殊功能暫存器來啟用內部上拉電阻
  • 開關的公共元件接地

image

技術提示:原理圖中顯示了一組可選的串聯電阻以及可選的多路復用部分。這允許 I/O 針腳執行雙重任務。例如,此半位元組寬介面可用於讀取開關以及驅動 LCD 顯示器的 D3 至 D0。這可能是理想的,因為它有可能以電路和程式碼複雜性為代價來減少微控制器針腳數和 PCB 的整體尺寸。

在結束之前,讓我們先看看與旋轉 DIP 開關相關的實體開關代碼。代表性的十六進位代碼取自此 Omron 規格書。觀察有兩種開關配置,包括“BCD 十六進位代碼”和“BCD 十六進位補碼”,分別對應型號 A6A-16RA6A-16C

回顧微控制器原理圖及其相關的上拉電阻,我們看到了一個反轉。例如,當開關處於 1 Position 位置時,位置 2 + 4 + 8 上將有 3 個正邏輯輸入。同時,如果安裝了互補開關,則會有一個對應於 1 訊號的正邏輯(高電平 active high)輸入。

從程式設計的角度來看,物理開關程式碼中的這種差異是無關緊要的。一個簡單的位元反轉指令將使它們相等。從故障排除或教育的角度來看,補充版本可能更容易理解,因為它會導致微控制器的針腳上出現正邏輯值。