網上有很多人研究如何去抖一個按鈕。但是,其中一些提供的實現和策略通常缺乏可伸縮性、可移植性以及輕松消除多個按鈕的能力,它們還與設計運行它們的硬件緊密耦合。嵌入式開發人員創建可重用的去抖算法有七個簡單的步驟,幾乎可以在任何嵌入式系統中使用。
步驟 1——定義軟件架構
定義軟件架構應該是軟件開發人員“要做的事情”清單上的第一項。軟件架構就像一張藍圖,告訴開發人員正在開發什么。跳過架構階段就像是在沒有預先考慮建筑物有多高或有多少層的情況下,決定即時建造一座摩天大樓。對于按鈕去抖算法,可以使用非常簡單的分層架構。
技巧2——概述API
應用程序編程接口(API)是開始開發可重用軟件的好方法。API定義了函數和對象,并為開發應用程序提供了構建模塊。API允許抽象出底層細節,即實現。
對于開關去抖算法,有三個開發人員感興趣的主要接口:初始化例程、去抖功能和狀態機。嵌入式開發人員可能還對第四個函數感興趣,用于檢索按鈕的去抖狀態。
技巧3——識別按鈕狀態
每個應用程序對按鈕可能占據的狀態都有不同的要求。非常簡單的應用程序可能只有NOT_PRESSED和PRESSED。一個復雜的應用程序可能有更多的狀態,比如檢測一個按鈕何時被釋放或者在一個定義的時間窗口內被按下了多少次。一個正確定義的API并不關心這些不同的狀態,而是可以在實現中或通過配置層輕松處理所有可能的狀態。
提示4——選擇實現類型
定義一個API是抽象出按鈕去抖算法如何工作的實現細節的好方法,但是有時候開發者需要決定這些細節是什么。在軟件中有許多不同的方法去抖一個按鈕。最簡單的方法是讀取引腳狀態,延遲一段去抖時間,然后再次讀取引腳。然而,使用延遲方法并不是特別有效,也不總是正確的。按鈕去抖的更常見的實現將周期性地對引腳進行采樣,并且只有在“x”個樣本連續讀取相同值之后,按鈕才會被認為是去抖的。您選擇的實現可能取決于初始需求和目標應用程序。
技巧5——設計流程圖
了解實現細節的最簡單方法是在編寫一行代碼之前繪制實現流程圖。流程圖允許嵌入式開發人員將他們的思想集中在他們將要編寫的代碼上。總是存在繞過流程圖直接寫代碼的誘惑。然而,首先編寫代碼總是導致不得不一遍又一遍地重寫代碼。
技巧6——現在,編寫代碼
編寫嵌入式軟件只能在API和流程圖開發完成后進行。有了流程圖,編寫嵌入式軟件就像將流程圖翻譯成開發人員選擇的語言一樣簡單。
技巧7——測試和驗證
最后,在完成了前面的六個步驟之后,現在是時候測試和驗證所選擇的實現和設計是否真的有效了。測試去抖算法的一種方法是選擇一個低成本開發套件,如STM32 Nucleo板,并編寫一些應用代碼,使板載按鈕去抖并打開LED。對于測試來說,保持簡單,如果按鈕在按下狀態下去抖,則打開LED,否則關閉LED。
結論
與一次性編寫代碼相比,編寫可重用的代碼并不需要花費更多的時間或成本。花一點時間預先考慮一個API,選擇一個實現,并設計流程圖,這將比前期投資節省更多的后端時間。這些步驟演示了如何開發可重用的按鈕算法,但是這些相同的步驟和策略也可以應用于嵌入式開發人員將為嵌入式系統使用或開發的幾乎任何組件。