資料介紹
描述
背景和起源
在本文中,我介紹了一種配置任意數(shù)量的開關的方法,這些開關鏈接到單個(公共)中斷服務例程 (ISR)。該方法完全是軟件驅(qū)動的,不依賴于開關的任何物理接線來中斷引腳。
這篇文章源于之前開發(fā)一個庫的工作,該庫可以有效地處理任何類型的開關并以不同的方案連接 - ez_switch_lib
.
總而言之,它ez_switch_lib
提供了一些有趣且獨特的功能:
- 可以配置任何開關類型,例如按鈕、撥動開關等
- 支持常見的開關接線方案
- 可同時配置多個不同類型和接線方案的開關
- 開關去抖動會自動處理,這也可以由用戶配置
- 可以隨時測試開關的狀態(tài),例如測試開關是否處于轉換狀態(tài)、打開或關閉等
- 開關可以自動鏈接到其他數(shù)字輸出引腳,以便在發(fā)生切換時也觸發(fā)鏈接的輸出引腳(設置或清除)
本文重點介紹的正是后者,將開關鏈接到其他數(shù)字輸出引腳,并以此為基礎。
將開關鏈接到中斷
本文展示了我們?nèi)绾文軌蜉p松地將任意數(shù)量的、任何類型的、以不同方案接線的開關鏈接(關聯(lián))到中斷或任何額外的接線 - 沒有電線將開關連接到中斷!
為了使示例簡單,我們將使用單個 ISR 來處理所有開關,但這是可變的 - 同樣,我們可以根據(jù)需要使用任意數(shù)量的 ISR 和外部中斷引腳(當然,要達到微控制器的設計限制)。
那么,我們?nèi)绾巫龅竭@一點呢?
如上所述,該ez_switch_lib
庫提供了一個特定功能,允許將開關鏈接到數(shù)字輸出引腳,以便在啟動開關時自動設置/清除相關的輸出引腳。這個函數(shù)被調(diào)用link_switch_to_output
并且只有三個參數(shù):
- 數(shù)字輸出引腳要鏈接到的開關的 ID
- 要鏈接的數(shù)字輸出引腳的引腳號
- 鏈接輸出引腳的初始設置(即 LOW 或 HIGH)
一旦聲明/定義了開關,就可以使用上述功能將其與數(shù)字輸出引腳相關聯(lián)。這是該方法的精髓——我們需要做的就是定義一個 ISR,使用該attachInterrupt
函數(shù)來處理任何合適的外部中斷數(shù)字引腳上的開關事件。
我們將看到我們?nèi)绾文軌蚵暶髟S多不同類型的開關,并以不同的方式連接,但這樣每個開關在啟動時都會自動觸發(fā)一個定義的和常見的 ISR。此 ISR 處理開關的作用不在本文的范圍內(nèi),但讀者將看到 ISR 中存在各種“鉤子”的位置,并草繪添加特定的最終用戶代碼來處理每種可能的開關中斷事件類型。
讓我們看一下示例草圖及其配置的開關。
示例草圖將使用七個數(shù)字引腳,六個用于開關,一個用于公共中斷引腳,根據(jù)下表分配和接線:
(使用面包板按照上表和下圖連接組件。)
需要注意的是:
- 我們使用數(shù)字引腳 2 作為分配給 ISR 的公共引腳,觀察該引腳沒有任何物理連接
-
'
circuit_C1
' 和 'circuit_C2
' 是ez_switch_lib
庫中的保留字,分別代表一個帶有外部 10k ohm 下拉電阻的電路和一個基本電路(除了開關本身沒有額外的組件)
我們將數(shù)字引腳 3-8 分配給開關,如下所示:
-
3 個與下拉 10k 歐姆電阻器相連的撥動開關 - '
circuit_C1
'(參見下面的示意圖)
-
3 x 按鈕開關直接接線,'
circuit_C2
'(參見下面的示意圖)
-
所有開關都是軟件鏈接到一個公共數(shù)字引腳 2(ISR 引腳),
link_switch_to_output
在每個開關創(chuàng)建后使用該函數(shù)(add_switch
函數(shù))
上述開關配置是任意的,用于展示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 - 創(chuàng)建和建立大小等于我們希望配置的交換機數(shù)量(這里是六個)的庫實例。草圖為我們用來為所有功能和資源添加前綴的實例分配名稱'',例如' '等。
ez_switch_lib
ez_switch_lib
my_switches
ez_switch_lib
my_switches.add_switch(..)
-
定義交換機配置數(shù)據(jù)- 定義我們的交換機配置的數(shù)據(jù)。草圖的核心是開關配置數(shù)據(jù),它保存在一個名為 ' ' 的二維數(shù)組中,每一行定義與每個開關關聯(lián)的數(shù)據(jù),如下所示:
my_switch_data
column[0] - 表示開關類型('button_switch
' 或 'toggle_switch
')。(同樣,'button_switch
' 或 'toggle_switch
' 是ez_switch_lib
庫保留字并定義所考慮的開關類型。)
column[1] - 這是分配給開關的數(shù)字引腳
column[2] - 表示開關接線方案(保留字'circuit_C1
'或'circuit_C2
')
-
setup 函數(shù)——你會注意到,這是我們使用該
add_switch
函數(shù)將每個開關聲明到庫的地方,并將公共中斷引腳分配給每個開關(link_switch_to_output
函數(shù))。
-
主循環(huán)處理。在檢查時,主循環(huán)似乎根本沒有做太多事情——它只是使用該
read_switch
函數(shù)不斷地輪詢每個開關,尋找狀態(tài)變化。這是因為該方法完全是軟件驅(qū)動的,因此需要不斷地尋找狀態(tài)變化。當狀態(tài)改變發(fā)生時,會發(fā)生兩件事:
1. 開關相關聯(lián)的輸出引腳(公共中斷引腳)自動升為高電平(RISING),從而觸發(fā) ISR,該 ISR 將處理致動開關的開關事件,并且
2. 完成 ISR 處理后,該read_switch
函數(shù)將返回一個值 'switched
'(也是一個保留的ez_switch_lib
庫字),如果需要,該值可以在主循環(huán)中進一步處理 - 兩口相同的櫻桃!
-
中斷服務程序 (ISR) - 一個相當簡單的 ISR,旨在使用可用變量識別不同的開關類型及其相關特性。
ez_switch_lib
您會注意到 ISR 只是向串行監(jiān)視器報告觸發(fā)了哪個開關事件。在一般情況下,不推薦使用串行打印 I/O,這里使用它只是為了提供視覺確認,即草圖正在做它應該做的事情。根據(jù)您的項目需要,在每個“掛鉤”處添加您自己的最終用戶代碼。
好的,它是如何工作的?
這ez_switch_lib
消除了我們對開關彈跳或開關接線方式的任何擔憂。它還可以為我們提供有關開關的非常有用的狀態(tài)信息,例如開關類型、開關是否正在轉換或已轉換或其他情況、撥動開關當前是打開還是關閉等。但最重要的是,它為我們提供了能夠自動將開關鏈接到另一個數(shù)字輸出引腳,當相關開關被啟動時,我們可以使用它來觸發(fā) ISR。
現(xiàn)在,在我們的示例草圖中,每個聲明的開關觸發(fā)相同的 ISR,所以問題是 ISR 如何確定哪個開關已啟動,即哪個開關觸發(fā)了 ISR?再次,ez_switch_lib
迎合這個。它提供最后一個啟動的開關的開關 ID。正是這一特性為 ISR 提供??了處理正確切換的方法。特定的庫變量稱為“ last_switched_id
”。
有了這些知識,ISR 就可以處理驅(qū)動開關的特定要求。
都好?是的,只要您認識到按鈕和撥動式開關各有其自己的特征,ISR 也必須滿足這些特征。具體來說:
按鈕式開關- 在可以說已完全切換之前,驅(qū)動周期會從關閉再返回關閉。
撥動式開關- 撥動開關有兩個驅(qū)動周期 - 它們可以從關閉或開關轉換。
同樣,ez_switch_lib
允許這些特定的開關特性,為最終用戶(和 ISR)提供適當處理每種事件類型的方法。
當您檢查 ISR 代碼時,您將看到它如何具體而簡單地處理上述場景。
此外,我們不要忘記,雖然 ISR 將處理開關驅(qū)動,但還有一個額外的點可以應用進一步的處理。如果您檢查主循環(huán),您將看到每個開關都被直接和不斷地輪詢和讀取。正是這種對開關的輪詢允許觸發(fā)開關的 ISR。但是,每次觸發(fā)開關 ISR 時,開關本身也將被視為已啟動 (' switched
')。如果開關已啟動,則輪詢循環(huán)中函數(shù)的答案read_switch
將顯示為 ' '。switched
因此,如果需要,或者如果開關沒有鏈接的 ISR 輸出引腳,它提供了在主輪詢循環(huán)中添加進一步開關處理的額外機會。
誰說我們不能吃蛋糕?!!
最后
我希望你對這篇文章感興趣,并且值得為你自己的項目考慮。我確實建議您更全面地瀏覽ez_switch_lib
這篇文章并下載其用戶指南和嬰兒床單,以全面了解功能。
- 電子學報第七期《一種可配置的CNN協(xié)加速器的FPGA實現(xiàn)方法》 15次下載
- 一種開關型穩(wěn)壓電源設計
- 一種實用的反激開關電源變壓器設計方法
- 一種用MATLAB仿真鎖相環(huán)的方法簡介 31次下載
- 一種基于區(qū)塊鏈的日志安全存儲方法 6次下載
- 一種輸液檢測報警裝置的研制 11次下載
- 一種新的導向式灰盒模糊測試方法 7次下載
- 一種基于幾何分析的正交圓軌道星座設計方法 15次下載
- 一種基于框架特征的共指消解方法 7次下載
- 一種DDS任意波形發(fā)生器的ROM優(yōu)化方法 61次下載
- 一種基于PLC開關量輸入單元的轉速信號測量方法
- Buck電路的一種軟開關實現(xiàn)方法
- 一種基于PLC開關量輸入單元的轉速信號測量方法
- 一種新型接近開關及應用
- 一種新型拉線開關電路及制作
- 一種鋰電池內(nèi)水去除工藝方法 359次閱讀
- 雙控開關電路的三種常見接線法 2805次閱讀
- 一種創(chuàng)建雙輸出電壓軌的方法 588次閱讀
- 一種數(shù)組環(huán)形隊列的數(shù)據(jù)結構 520次閱讀
- 一種典型的三極管和MOS管結合的開關控制電路 3684次閱讀
- 一種工業(yè)上常用改善動態(tài)響應的控制方法 875次閱讀
- 氣缸磁性開關怎么安裝_氣缸磁性開關接線方法 4.8w次閱讀
- 人工智能是一種改進數(shù)據(jù)控制和處理的方法 3034次閱讀
- 一種開關電源設計的極簡方法 3874次閱讀
- 一種住戶分散的多表采集系統(tǒng)安裝方法 1176次閱讀
- 一種新的基于電穿孔的皮膚高效核酸遞送方法 4702次閱讀
- 一種新型開關電源的PWM控制 2w次閱讀
- 一種基于SG3525A的PWM型開關穩(wěn)壓電源設計 1.5w次閱讀
- 一種matlab調(diào)用signaltap采集數(shù)據(jù)的方法 3866次閱讀
- 一種紅外感應與來電斷電節(jié)能開關的設計 3731次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多