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

(使用面包板按照上表和下圖連接組件。)
需要注意的是:
- 我們使用數(shù)字引腳 2 作為分配給 ISR 的公共引腳,觀察該引腳沒(méi)有任何物理連接
-
'
circuit_C1' 和 'circuit_C2' 是ez_switch_lib庫(kù)中的保留字,分別代表一個(gè)帶有外部 10k ohm 下拉電阻的電路和一個(gè)基本電路(除了開(kāi)關(guān)本身沒(méi)有額外的組件)
我們將數(shù)字引腳 3-8 分配給開(kāi)關(guān),如下所示:
-
3 個(gè)與下拉 10k 歐姆電阻器相連的撥動(dòng)開(kāi)關(guān) - '
circuit_C1'(參見(jiàn)下面的示意圖)
-
3 x 按鈕開(kāi)關(guān)直接接線,'
circuit_C2'(參見(jiàn)下面的示意圖)
-
所有開(kāi)關(guān)都是軟件鏈接到一個(gè)公共數(shù)字引腳 2(ISR 引腳),
link_switch_to_output在每個(gè)開(kāi)關(guān)創(chuàng)建后使用該函數(shù)(add_switch函數(shù))
上述開(kāi)關(guān)配置是任意的,用于展示ez_switch_lib庫(kù)的靈活性,開(kāi)關(guān)可以鏈接到單個(gè) ISR,但可以使用任何組合開(kāi)關(guān)類型、開(kāi)關(guān)電路布線和多個(gè) ISR。
素描設(shè)計(jì)
草圖有六個(gè)主要部分:
-
ez_switch_lib聲明-ez_switch_lib庫(kù)的聲明(即#include "ez_switch_lib.h")。要運(yùn)行草圖,您需要將ez_switch_lib庫(kù)文件(.cpp、.h 和 .txt)復(fù)制到 Arduino 庫(kù)目錄到名為“ez_switch_lib”的目錄中,即../Arduino/libraries/ez_switch_lib(請(qǐng)參閱ez_switch_lib文章以訪問(wèn)和下載這些文件)。
-
create instance - 創(chuàng)建和建立大小等于我們希望配置的交換機(jī)數(shù)量(這里是六個(gè))的庫(kù)實(shí)例。草圖為我們用來(lái)為所有功能和資源添加前綴的實(shí)例分配名稱'',例如' '等。
ez_switch_libez_switch_libmy_switchesez_switch_libmy_switches.add_switch(..)
-
定義交換機(jī)配置數(shù)據(jù)- 定義我們的交換機(jī)配置的數(shù)據(jù)。草圖的核心是開(kāi)關(guān)配置數(shù)據(jù),它保存在一個(gè)名為 ' ' 的二維數(shù)組中,每一行定義與每個(gè)開(kāi)關(guān)關(guān)聯(lián)的數(shù)據(jù),如下所示:
my_switch_data
column[0] - 表示開(kāi)關(guān)類型('button_switch' 或 'toggle_switch')。(同樣,'button_switch' 或 'toggle_switch' 是ez_switch_lib庫(kù)保留字并定義所考慮的開(kāi)關(guān)類型。)
column[1] - 這是分配給開(kāi)關(guān)的數(shù)字引腳
column[2] - 表示開(kāi)關(guān)接線方案(保留字'circuit_C1'或'circuit_C2')
-
setup 函數(shù)——你會(huì)注意到,這是我們使用該
add_switch函數(shù)將每個(gè)開(kāi)關(guān)聲明到庫(kù)的地方,并將公共中斷引腳分配給每個(gè)開(kāi)關(guān)(link_switch_to_output函數(shù))。
-
主循環(huán)處理。在檢查時(shí),主循環(huán)似乎根本沒(méi)有做太多事情——它只是使用該
read_switch函數(shù)不斷地輪詢每個(gè)開(kāi)關(guān),尋找狀態(tài)變化。這是因?yàn)樵摲椒ㄍ耆擒浖?qū)動(dòng)的,因此需要不斷地尋找狀態(tài)變化。當(dāng)狀態(tài)改變發(fā)生時(shí),會(huì)發(fā)生兩件事:
1. 開(kāi)關(guān)相關(guān)聯(lián)的輸出引腳(公共中斷引腳)自動(dòng)升為高電平(RISING),從而觸發(fā) ISR,該 ISR 將處理致動(dòng)開(kāi)關(guān)的開(kāi)關(guān)事件,并且
2. 完成 ISR 處理后,該read_switch函數(shù)將返回一個(gè)值 'switched'(也是一個(gè)保留的ez_switch_lib庫(kù)字),如果需要,該值可以在主循環(huán)中進(jìn)一步處理 - 兩口相同的櫻桃!
-
中斷服務(wù)程序 (ISR) - 一個(gè)相當(dāng)簡(jiǎn)單的 ISR,旨在使用可用變量識(shí)別不同的開(kāi)關(guān)類型及其相關(guān)特性。
ez_switch_lib您會(huì)注意到 ISR 只是向串行監(jiān)視器報(bào)告觸發(fā)了哪個(gè)開(kāi)關(guān)事件。在一般情況下,不推薦使用串行打印 I/O,這里使用它只是為了提供視覺(jué)確認(rèn),即草圖正在做它應(yīng)該做的事情。根據(jù)您的項(xiàng)目需要,在每個(gè)“掛鉤”處添加您自己的最終用戶代碼。
好的,它是如何工作的?
這ez_switch_lib 消除了我們對(duì)開(kāi)關(guān)彈跳或開(kāi)關(guān)接線方式的任何擔(dān)憂。它還可以為我們提供有關(guān)開(kāi)關(guān)的非常有用的狀態(tài)信息,例如開(kāi)關(guān)類型、開(kāi)關(guān)是否正在轉(zhuǎn)換或已轉(zhuǎn)換或其他情況、撥動(dòng)開(kāi)關(guān)當(dāng)前是打開(kāi)還是關(guān)閉等。但最重要的是,它為我們提供了能夠自動(dòng)將開(kāi)關(guān)鏈接到另一個(gè)數(shù)字輸出引腳,當(dāng)相關(guān)開(kāi)關(guān)被啟動(dòng)時(shí),我們可以使用它來(lái)觸發(fā) ISR。
現(xiàn)在,在我們的示例草圖中,每個(gè)聲明的開(kāi)關(guān)觸發(fā)相同的 ISR,所以問(wèn)題是 ISR 如何確定哪個(gè)開(kāi)關(guān)已啟動(dòng),即哪個(gè)開(kāi)關(guān)觸發(fā)了 ISR?再次,ez_switch_lib 迎合這個(gè)。它提供最后一個(gè)啟動(dòng)的開(kāi)關(guān)的開(kāi)關(guān) ID。正是這一特性為 ISR 提供??了處理正確切換的方法。特定的庫(kù)變量稱為“ last_switched_id”。
有了這些知識(shí),ISR 就可以處理驅(qū)動(dòng)開(kāi)關(guān)的特定要求。
都好?是的,只要您認(rèn)識(shí)到按鈕和撥動(dòng)式開(kāi)關(guān)各有其自己的特征,ISR 也必須滿足這些特征。具體來(lái)說(shuō):
按鈕式開(kāi)關(guān)- 在可以說(shuō)已完全切換之前,驅(qū)動(dòng)周期會(huì)從關(guān)閉再返回關(guān)閉。
撥動(dòng)式開(kāi)關(guān)- 撥動(dòng)開(kāi)關(guān)有兩個(gè)驅(qū)動(dòng)周期 - 它們可以從關(guān)閉或開(kāi)關(guān)轉(zhuǎn)換。
同樣,ez_switch_lib 允許這些特定的開(kāi)關(guān)特性,為最終用戶(和 ISR)提供適當(dāng)處理每種事件類型的方法。
當(dāng)您檢查 ISR 代碼時(shí),您將看到它如何具體而簡(jiǎn)單地處理上述場(chǎng)景。
此外,我們不要忘記,雖然 ISR 將處理開(kāi)關(guān)驅(qū)動(dòng),但還有一個(gè)額外的點(diǎn)可以應(yīng)用進(jìn)一步的處理。如果您檢查主循環(huán),您將看到每個(gè)開(kāi)關(guān)都被直接和不斷地輪詢和讀取。正是這種對(duì)開(kāi)關(guān)的輪詢?cè)试S觸發(fā)開(kāi)關(guān)的 ISR。但是,每次觸發(fā)開(kāi)關(guān) ISR 時(shí),開(kāi)關(guān)本身也將被視為已啟動(dòng) (' switched')。如果開(kāi)關(guān)已啟動(dòng),則輪詢循環(huán)中函數(shù)的答案read_switch將顯示為 ' '。switched因此,如果需要,或者如果開(kāi)關(guān)沒(méi)有鏈接的 ISR 輸出引腳,它提供了在主輪詢循環(huán)中添加進(jìn)一步開(kāi)關(guān)處理的額外機(jī)會(huì)。
誰(shuí)說(shuō)我們不能吃蛋糕?!!
最后
我希望你對(duì)這篇文章感興趣,并且值得為你自己的項(xiàng)目考慮。我確實(shí)建議您更全面地瀏覽ez_switch_lib 這篇文章并下載其用戶指南和嬰兒床單,以全面了解功能。
- 電子學(xué)報(bào)第七期《一種可配置的CNN協(xié)加速器的FPGA實(shí)現(xiàn)方法》 15次下載
- 一種高壓開(kāi)關(guān)電源的設(shè)計(jì)總結(jié)
- 一種開(kāi)關(guān)型穩(wěn)壓電源設(shè)計(jì)
- 一種實(shí)用的反激開(kāi)關(guān)電源變壓器設(shè)計(jì)方法
- 一種用MATLAB仿真鎖相環(huán)的方法簡(jiǎn)介 31次下載
- 一種基于區(qū)塊鏈的日志安全存儲(chǔ)方法 6次下載
- 一種輸液檢測(cè)報(bào)警裝置的研制 11次下載
- 一種新的導(dǎo)向式灰盒模糊測(cè)試方法 7次下載
- 一種基于框架特征的共指消解方法 7次下載
- 一種DDS任意波形發(fā)生器的ROM優(yōu)化方法 61次下載
- 一種基于PLC開(kāi)關(guān)量輸入單元的轉(zhuǎn)速信號(hào)測(cè)量方法
- Buck電路的一種軟開(kāi)關(guān)實(shí)現(xiàn)方法
- 一種基于PLC開(kāi)關(guān)量輸入單元的轉(zhuǎn)速信號(hào)測(cè)量方法
- 一種新型接近開(kāi)關(guān)及應(yīng)用
- 一種新型拉線開(kāi)關(guān)電路及制作
- 一種基于光強(qiáng)度相關(guān)反饋的波前整形方法 271次閱讀
- 一種簡(jiǎn)單高效配置FPGA的方法 746次閱讀
- 一種利用wireshark對(duì)遠(yuǎn)程服務(wù)器/路由器網(wǎng)絡(luò)抓包方法 3387次閱讀
- 一種鋰電池內(nèi)水去除工藝方法 503次閱讀
- 雙控開(kāi)關(guān)電路的三種常見(jiàn)接線法 3834次閱讀
- 一種創(chuàng)建雙輸出電壓軌的方法 709次閱讀
- 一種典型的三極管和MOS管結(jié)合的開(kāi)關(guān)控制電路 4297次閱讀
- 一種工業(yè)上常用改善動(dòng)態(tài)響應(yīng)的控制方法 1124次閱讀
- 氣缸磁性開(kāi)關(guān)怎么安裝_氣缸磁性開(kāi)關(guān)接線方法 4.9w次閱讀
- 人工智能是一種改進(jìn)數(shù)據(jù)控制和處理的方法 3166次閱讀
- 一種開(kāi)關(guān)電源設(shè)計(jì)的極簡(jiǎn)方法 3997次閱讀
- 一種新的基于電穿孔的皮膚高效核酸遞送方法 5187次閱讀
- 一種新型開(kāi)關(guān)電源的PWM控制 2w次閱讀
- 一種基于SG3525A的PWM型開(kāi)關(guān)穩(wěn)壓電源設(shè)計(jì) 1.6w次閱讀
- 一種matlab調(diào)用signaltap采集數(shù)據(jù)的方法 3949次閱讀
下載排行
本周
- 1NB-IoT芯片廠商的資料說(shuō)明
- 0.31 MB | 22次下載 | 1 積分
- 2智慧監(jiān)獄建設(shè)的核心終端—智慧監(jiān)倉(cāng)屏
- 0.25 MB | 2次下載 | 免費(fèi)
- 3PC318C016M/D 200V半橋柵極驅(qū)動(dòng)器技術(shù)手冊(cè)
- 0.77 MB | 2次下載 | 免費(fèi)
- 45.0SMDJ200A單向TVS瞬態(tài)抑制二極管規(guī)格書(shū)
- 0.88 MB | 1次下載 | 免費(fèi)
- 5PC318C041EQ 200V半橋柵極驅(qū)動(dòng)器技術(shù)手冊(cè)
- 0.50 MB | 次下載 | 免費(fèi)
- 6PC318C042NM 200V半橋柵極驅(qū)動(dòng)器技術(shù)手冊(cè)
- 0.55 MB | 次下載 | 免費(fèi)
- 7技嘉H110主板IT8628E_BX IO電路圖資料
- 2.61 MB | 次下載 | 1 積分
- 8H110主板CPU PWM芯片ISL95858HRZ-T核心供電電路圖資料
- 0.63 MB | 次下載 | 1 積分
本月
- 1元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 241次下載 | 免費(fèi)
- 2元宇宙底層硬件系列報(bào)告
- 13.42 MB | 184次下載 | 免費(fèi)
- 32022 年展望報(bào)告 – 半導(dǎo)體產(chǎn)業(yè)
- 1.43 MB | 136次下載 | 免費(fèi)
- 4晶振與濾波器應(yīng)用電路《電子工程師必備:元器件應(yīng)用寶典》
- 1.57 MB | 90次下載 | 免費(fèi)
- 5汽車(chē)電子行業(yè)深度解析:智能化與電動(dòng)化方興未艾
- 6.47 MB | 71次下載 | 免費(fèi)
- 6中國(guó)DPU行業(yè)白皮書(shū)
- 23.80 MB | 37次下載 | 免費(fèi)
- 7晶科鑫代理線-微盟電子2021年度產(chǎn)品目錄選型手冊(cè)
- 14.75 MB | 27次下載 | 免費(fèi)
- 8NB-IoT芯片廠商的資料說(shuō)明
- 0.31 MB | 22次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191425次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183352次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App






創(chuàng)作
發(fā)文章
發(fā)帖
提問(wèn)
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論