資料介紹
描述
背景和起源
在本文中,我介紹了一種配置任意數量的開關的方法,這些開關鏈接到單個(公共)中斷服務例程 (ISR)。該方法完全是軟件驅動的,不依賴于開關的任何物理接線來中斷引腳。
這篇文章源于之前開發一個庫的工作,該庫可以有效地處理任何類型的開關并以不同的方案連接 - ez_switch_lib
.
總而言之,它ez_switch_lib
提供了一些有趣且獨特的功能:
- 可以配置任何開關類型,例如按鈕、撥動開關等
- 支持常見的開關接線方案
- 可同時配置多個不同類型和接線方案的開關
- 開關去抖動會自動處理,這也可以由用戶配置
- 可以隨時測試開關的狀態,例如測試開關是否處于轉換狀態、打開或關閉等
- 開關可以自動鏈接到其他數字輸出引腳,以便在發生切換時也觸發鏈接的輸出引腳(設置或清除)
本文重點介紹的正是后者,將開關鏈接到其他數字輸出引腳,并以此為基礎。
將開關鏈接到中斷
本文展示了我們如何能夠輕松地將任意數量的、任何類型的、以不同方案接線的開關鏈接(關聯)到中斷或任何額外的接線 - 沒有電線將開關連接到中斷!
為了使示例簡單,我們將使用單個 ISR 來處理所有開關,但這是可變的 - 同樣,我們可以根據需要使用任意數量的 ISR 和外部中斷引腳(當然,要達到微控制器的設計限制)。
那么,我們如何做到這一點呢?
如上所述,該ez_switch_lib
庫提供了一個特定功能,允許將開關鏈接到數字輸出引腳,以便在啟動開關時自動設置/清除相關的輸出引腳。這個函數被調用link_switch_to_output
并且只有三個參數:
- 數字輸出引腳要鏈接到的開關的 ID
- 要鏈接的數字輸出引腳的引腳號
- 鏈接輸出引腳的初始設置(即 LOW 或 HIGH)
一旦聲明/定義了開關,就可以使用上述功能將其與數字輸出引腳相關聯。這是該方法的精髓——我們需要做的就是定義一個 ISR,使用該attachInterrupt
函數來處理任何合適的外部中斷數字引腳上的開關事件。
我們將看到我們如何能夠聲明許多不同類型的開關,并以不同的方式連接,但這樣每個開關在啟動時都會自動觸發一個定義的和常見的 ISR。此 ISR 處理開關的作用不在本文的范圍內,但讀者將看到 ISR 中存在各種“鉤子”的位置,并草繪添加特定的最終用戶代碼來處理每種可能的開關中斷事件類型。
讓我們看一下示例草圖及其配置的開關。
示例草圖將使用七個數字引腳,六個用于開關,一個用于公共中斷引腳,根據下表分配和接線:

(使用面包板按照上表和下圖連接組件。)
需要注意的是:
- 我們使用數字引腳 2 作為分配給 ISR 的公共引腳,觀察該引腳沒有任何物理連接
-
'
circuit_C1
' 和 'circuit_C2
' 是ez_switch_lib
庫中的保留字,分別代表一個帶有外部 10k ohm 下拉電阻的電路和一個基本電路(除了開關本身沒有額外的組件)
我們將數字引腳 3-8 分配給開關,如下所示:
-
3 個與下拉 10k 歐姆電阻器相連的撥動開關 - '
circuit_C1
'(參見下面的示意圖)
-
3 x 按鈕開關直接接線,'
circuit_C2
'(參見下面的示意圖)
-
所有開關都是軟件鏈接到一個公共數字引腳 2(ISR 引腳),
link_switch_to_output
在每個開關創建后使用該函數(add_switch
函數)
上述開關配置是任意的,用于展示ez_switch_lib
庫的靈活性,開關可以鏈接到單個 ISR,但可以使用任何組合開關類型、開關電路布線和多個 ISR。
素描設計
草圖有六個主要部分:
-
ez_switch_lib
聲明-ez_switch_lib
庫的聲明(即#include "ez_switch_lib.h"
)。要運行草圖,您需要將ez_switch_lib
庫文件(.cpp、.h 和 .txt)復制到 Arduino 庫目錄到名為“ez_switch_lib
”的目錄中,即../Arduino/libraries/ez_switch_lib
(請參閱ez_switch_lib
文章以訪問和下載這些文件)。
-
create instance - 創建和建立大小等于我們希望配置的交換機數量(這里是六個)的庫實例。草圖為我們用來為所有功能和資源添加前綴的實例分配名稱'',例如' '等。
ez_switch_lib
ez_switch_lib
my_switches
ez_switch_lib
my_switches.add_switch(..)
-
定義交換機配置數據- 定義我們的交換機配置的數據。草圖的核心是開關配置數據,它保存在一個名為 ' ' 的二維數組中,每一行定義與每個開關關聯的數據,如下所示:
my_switch_data
column[0] - 表示開關類型('button_switch
' 或 'toggle_switch
')。(同樣,'button_switch
' 或 'toggle_switch
' 是ez_switch_lib
庫保留字并定義所考慮的開關類型。)
column[1] - 這是分配給開關的數字引腳
column[2] - 表示開關接線方案(保留字'circuit_C1
'或'circuit_C2
')
-
setup 函數——你會注意到,這是我們使用該
add_switch
函數將每個開關聲明到庫的地方,并將公共中斷引腳分配給每個開關(link_switch_to_output
函數)。
-
主循環處理。在檢查時,主循環似乎根本沒有做太多事情——它只是使用該
read_switch
函數不斷地輪詢每個開關,尋找狀態變化。這是因為該方法完全是軟件驅動的,因此需要不斷地尋找狀態變化。當狀態改變發生時,會發生兩件事:
1. 開關相關聯的輸出引腳(公共中斷引腳)自動升為高電平(RISING),從而觸發 ISR,該 ISR 將處理致動開關的開關事件,并且
2. 完成 ISR 處理后,該read_switch
函數將返回一個值 'switched
'(也是一個保留的ez_switch_lib
庫字),如果需要,該值可以在主循環中進一步處理 - 兩口相同的櫻桃!
-
中斷服務程序 (ISR) - 一個相當簡單的 ISR,旨在使用可用變量識別不同的開關類型及其相關特性。
ez_switch_lib
您會注意到 ISR 只是向串行監視器報告觸發了哪個開關事件。在一般情況下,不推薦使用串行打印 I/O,這里使用它只是為了提供視覺確認,即草圖正在做它應該做的事情。根據您的項目需要,在每個“掛鉤”處添加您自己的最終用戶代碼。
好的,它是如何工作的?
這ez_switch_lib
消除了我們對開關彈跳或開關接線方式的任何擔憂。它還可以為我們提供有關開關的非常有用的狀態信息,例如開關類型、開關是否正在轉換或已轉換或其他情況、撥動開關當前是打開還是關閉等。但最重要的是,它為我們提供了能夠自動將開關鏈接到另一個數字輸出引腳,當相關開關被啟動時,我們可以使用它來觸發 ISR。
現在,在我們的示例草圖中,每個聲明的開關觸發相同的 ISR,所以問題是 ISR 如何確定哪個開關已啟動,即哪個開關觸發了 ISR?再次,ez_switch_lib
迎合這個。它提供最后一個啟動的開關的開關 ID。正是這一特性為 ISR 提供??了處理正確切換的方法。特定的庫變量稱為“ last_switched_id
”。
有了這些知識,ISR 就可以處理驅動開關的特定要求。
都好?是的,只要您認識到按鈕和撥動式開關各有其自己的特征,ISR 也必須滿足這些特征。具體來說:
按鈕式開關- 在可以說已完全切換之前,驅動周期會從關閉再返回關閉。
撥動式開關- 撥動開關有兩個驅動周期 - 它們可以從關閉或開關轉換。
同樣,ez_switch_lib
允許這些特定的開關特性,為最終用戶(和 ISR)提供適當處理每種事件類型的方法。
當您檢查 ISR 代碼時,您將看到它如何具體而簡單地處理上述場景。
此外,我們不要忘記,雖然 ISR 將處理開關驅動,但還有一個額外的點可以應用進一步的處理。如果您檢查主循環,您將看到每個開關都被直接和不斷地輪詢和讀取。正是這種對開關的輪詢允許觸發開關的 ISR。但是,每次觸發開關 ISR 時,開關本身也將被視為已啟動 (' switched
')。如果開關已啟動,則輪詢循環中函數的答案read_switch
將顯示為 ' '。switched
因此,如果需要,或者如果開關沒有鏈接的 ISR 輸出引腳,它提供了在主輪詢循環中添加進一步開關處理的額外機會。
誰說我們不能吃蛋糕?!!
最后
我希望你對這篇文章感興趣,并且值得為你自己的項目考慮。我確實建議您更全面地瀏覽ez_switch_lib
這篇文章并下載其用戶指南和嬰兒床單,以全面了解功能。
- 電子學報第七期《一種可配置的CNN協加速器的FPGA實現方法》 15次下載
- 一種高壓開關電源的設計總結
- 一種開關型穩壓電源設計
- 一種實用的反激開關電源變壓器設計方法
- 一種用MATLAB仿真鎖相環的方法簡介 31次下載
- 一種基于區塊鏈的日志安全存儲方法 6次下載
- 一種輸液檢測報警裝置的研制 11次下載
- 一種新的導向式灰盒模糊測試方法 7次下載
- 一種基于框架特征的共指消解方法 7次下載
- 一種DDS任意波形發生器的ROM優化方法 61次下載
- 一種基于PLC開關量輸入單元的轉速信號測量方法
- Buck電路的一種軟開關實現方法
- 一種基于PLC開關量輸入單元的轉速信號測量方法
- 一種新型接近開關及應用
- 一種新型拉線開關電路及制作
- 一種基于光強度相關反饋的波前整形方法 271次閱讀
- 一種簡單高效配置FPGA的方法 746次閱讀
- 一種利用wireshark對遠程服務器/路由器網絡抓包方法 3387次閱讀
- 一種鋰電池內水去除工藝方法 503次閱讀
- 雙控開關電路的三種常見接線法 3834次閱讀
- 一種創建雙輸出電壓軌的方法 709次閱讀
- 一種典型的三極管和MOS管結合的開關控制電路 4297次閱讀
- 一種工業上常用改善動態響應的控制方法 1124次閱讀
- 氣缸磁性開關怎么安裝_氣缸磁性開關接線方法 4.9w次閱讀
- 人工智能是一種改進數據控制和處理的方法 3166次閱讀
- 一種開關電源設計的極簡方法 3997次閱讀
- 一種新的基于電穿孔的皮膚高效核酸遞送方法 5187次閱讀
- 一種新型開關電源的PWM控制 2w次閱讀
- 一種基于SG3525A的PWM型開關穩壓電源設計 1.6w次閱讀
- 一種matlab調用signaltap采集數據的方法 3949次閱讀
下載排行
本周
- 1U盤一鍵制作
- 23.84 MB | 3次下載 | 免費
- 2ch341驅動
- 0.18 MB | 1次下載 | 免費
- 3貼片電阻阻值代號
- 0.08 MB | 1次下載 | 1 積分
- 4DS-CM5A H24-CN-V2
- 524.28 KB | 1次下載 | 免費
- 5基于Linux的液晶顯示屏驅動技術的研究與應用
- 14.59 MB | 次下載 | 1 積分
- 6研華AIMB-218工控主板用戶手冊
- 4.45 MB | 次下載 | 1 積分
- 7研華AIMB-275工控主板用戶手冊
- 3.11 MB | 次下載 | 1 積分
- 8ST NPI 新上架產品【DCP0606Y】
- 1.35 MB | 次下載 | 免費
本月
- 1人形機器人電機驅動和傳感報告
- 4.27 MB | 60次下載 | 免費
- 2晶體三極管的電流放大作用詳細說明
- 0.77 MB | 32次下載 | 2 積分
- 3九陽豆漿機高清原理圖
- 2.47 MB | 31次下載 | 1 積分
- 4雙極型三極管放大電路的三種基本組態的學習課件免費下載
- 4.03 MB | 25次下載 | 1 積分
- 5多級放大電路的學習課件免費下載
- 1.81 MB | 21次下載 | 2 積分
- 6Altium Designer元件庫
- 17.11 MB | 11次下載 | 免費
- 7STM32F10xxx單片機編程手冊
- 0.29 MB | 5次下載 | 免費
- 8HT8691R內置BOOST升壓模塊的D類音頻功率放大器中文手冊
- 1.77 MB | 4次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420063次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191382次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183339次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81586次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73814次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論