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