電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>一種配置任意數(shù)量開關(guān)的方法

一種配置任意數(shù)量開關(guān)的方法

2022-10-31 | zip | 0.03 MB | 次下載 | 免費(fèi)

資料介紹

描述

背景和起源

在本文中,我介紹了一種配置任意數(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ù)下表分配和接線:

pYYBAGNYtJ6APm91AADkJ2DUs3Y010.png
開關(guān)配置
?

(使用面包板按照上表和下圖連接組件。)

需要注意的是:

  • 我們使用數(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_libez_switch_libmy_switchesez_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 這篇文章并下載其用戶指南嬰兒床單,以全面了解功能。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)