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