性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

按鍵原理和軟硬件按鍵消抖動

系統(tǒng)的信號輸入中,鍵盤因其結(jié)構(gòu)簡單而被廣泛使用。因此,對鍵盤的輸入(邏輯0或1)進(jìn)行準(zhǔn)確采樣,避免錯誤輸入是非常有必要的。理想的鍵盤輸入特性如圖1所示:按鍵沒有按下時,輸入為邏輯1,一旦按下則輸入立刻變?yōu)檫壿?,松開時輸入則立刻變?yōu)檫壿?。

1

圖 1理想鍵盤輸入特性

然而實際的鍵盤受制造工藝等影響,其輸入特性不可能如圖1完美。當(dāng)按鍵按下時,在觸點(diǎn)即將接觸到完全接觸這段時間里,鍵盤的通斷狀態(tài)很可能已經(jīng)改變了多次。即在這段時間里,鍵盤輸入了多次邏輯0和1,也就是輸入處于失控狀態(tài)。如果這些輸入被系統(tǒng)響應(yīng),則系統(tǒng)暫時也將處于失控狀態(tài),這是我們要盡量避免的。在觸點(diǎn)即將分離到完全分離這段時間也是一樣的。實際鍵盤的輸入特性如圖2所示:

2

圖 2實際鍵盤輸入特性

我們可以看到:鍵盤在輸入邏輯轉(zhuǎn)換時,實際上是產(chǎn)生了瞬時的高頻干擾脈沖。按鍵消抖的目的在于消除此干擾,以達(dá)到接近圖1所示的理想輸入特性。有兩個階段可以設(shè)法消除此干擾:1.在鍵盤信號輸入系統(tǒng)之前(系統(tǒng)外);2.鍵盤信號輸入系統(tǒng)以后(系統(tǒng)內(nèi))。

在信號輸入系統(tǒng)之前將抖動干擾消除,可以節(jié)省系統(tǒng)資源,提高系統(tǒng)對其他信號的響應(yīng)能力,也就是硬件消抖。一種比較巧妙的硬件消抖電路結(jié)構(gòu)如圖3所示:

3

圖 3用基本SR鎖存器構(gòu)成的消抖電路

該電路利用基本SR鎖存器的記憶作用消除開關(guān)觸點(diǎn)振動所產(chǎn)生的影響。開關(guān)S每切換一次,輸出端只有一次翻轉(zhuǎn),不存在抖動波形(讀者可以根據(jù)SR鎖存器功能自行分析,此處略)。但是使用SR鎖存器消抖只適用于單刀雙擲開關(guān),實際應(yīng)用當(dāng)中常用的鍵盤多是兩個接線端的按鍵。對此類按鍵的常用硬件消抖電路如圖4所示:

4

圖 4常用鍵盤硬件消抖電路

此電路利用電容平波,再經(jīng)過施密特反相器整形之后就得到了沒有毛刺的脈沖波。

軟件消抖要占用系統(tǒng)資源,在系統(tǒng)資源充足的情況下使用軟件消抖更加簡單。軟件消抖的實質(zhì)在于降低鍵盤輸入端口的采樣頻率,將高頻抖動略去。實際應(yīng)用中通常采用延時跳過高頻抖動區(qū)間,然后再檢測輸入做出相應(yīng)處理。一般程序代碼如下:

if(value == 0) //一旦檢測到鍵值

{

Delay(); //延時20ms,有效濾除按鍵的抖動

if(value == 0) //再次確定鍵值是否有效

{

…… //執(zhí)行相應(yīng)處理

}

}

這段軟消抖程序從機(jī)理上看不會有什么問題,通常在軟件程序不太"繁忙"的情況下也能夠很好的消抖并做相應(yīng)處理。但是如果在延時期間產(chǎn)生了中斷,則此中斷可能無法得到響應(yīng)。

對于硬件資源豐富的FPGA系統(tǒng),可以使用硬件來減輕軟件工作量,通常稱之為"硬件加速"。在按鍵信號輸入到軟件系統(tǒng)前用邏輯對其進(jìn)行一下簡單的處理即可實現(xiàn)所謂的"硬件消抖",verilog代碼如下:

//對輸入信號inpio硬件濾波,每20ms采樣一次當(dāng)前值

reg[18:0] cnt; //20ms計數(shù)器

always @(posedge clk_25m or negedge rst_n)

if(!rst_n) cnt <= 19'd0;

else if(cnt < 19'd500000) cnt <= cnt+1'b1;

else cnt <= 19'd0;

reg[1:0] inpior; //當(dāng)前inpio信號鎖存,每20ms鎖存一拍

always @(posedge clk_25m or negedge rst_n)

if(!rst_n) inpior <= 2'b11;

else if(cnt == 19'h7ffff) inpior <= {inpior[0],inpior};

wire inpio_swin =inpior[0] | inpior[1]; //前后20ms兩次鎖存值都為0時才為0

該程序中設(shè)置了一個20ms計數(shù)器,通過間隔20ms對輸入信號inpio采樣兩次,兩次相同則認(rèn)為鍵盤輸入穩(wěn)定,得到用硬件邏輯處理后的inpio_swin信號則是消抖處理過的信號。軟件程序就不再需要delay()來濾波了,也不會出現(xiàn)使用純軟件處理出現(xiàn)的"中斷失去響應(yīng)"的情況了,這就是"硬件加速"的效果。

上述verilog代碼采用間隔采樣來達(dá)到消抖的目的,對于不同物理特性的鍵盤,最佳的間隔時間采樣時間也不同,因此還存在一些不穩(wěn)定因素。下面介紹一種更好的軟消抖程序,同樣采用"硬件加速",不同之處在于使用了有限狀態(tài)機(jī)來實現(xiàn),其VHDL代碼如下:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_unsigned.all;

ENTITY xiaod IS

//端口描述:clk 輸入檢測時鐘;reset 復(fù)位信號;din 原始按鍵信號輸入; dout 去抖動輸出信號

PORT

(

clk : IN STD_LOGIC ;

reset : IN STD_LOGIC ;

din : IN STD_LOGIC ;

dout : OUT STD_LOGIC

);

END ENTITY;

 

ARCHITECTURE RTL OF xiaod IS

TYPE state IS( s0,s1,s2,s3);

SIGNAL pre_s, next_s: state;

BEGIN

 

P0:PROCESS( reset, clk )

BEGIN

if reset = '0' then

pre_s <= s0;

elsif rising_edge( clk ) then

pre_s <= next_s;

else

null;

end if;

END PROCESS P0;

 

P1:PROCESS( pre_s, next_s, din )

BEGIN

case pre_s is

when s0 =>

dout <= '1';

if din = '1' then

next_s <= s0;

else

next_s <= s1;

end if;

when s1 =>

dout <= '1';

if din = '1' then

next_s <= s0;

else

next_s <= s2;

end if;

when s2 =>

dout <= '1';

if din = '1' then

next_s <= s0;

else

next_s <= s3;

end if;

when s3 =>

dout <= '0';

if din = '1' then

next_s <= s0;

else

next_s <= s1;

end if;

end case;

END PROCESS P1;

END RTL;

該VHDL代碼描述了一個狀態(tài)機(jī),其狀態(tài)轉(zhuǎn)換圖如圖所示:

5

圖 5狀態(tài)轉(zhuǎn)換圖

該狀態(tài)機(jī)有4個狀態(tài):S0、S1、S2、S3,其中前3個狀態(tài)輸出高電平,最后一個狀態(tài)輸出低電平。初始狀態(tài)為S0,設(shè)按鍵未按下時為高電平,按下則為低電平。在按鍵按下到完全生效期間有一系列的抖動,對于持續(xù)時間為1-2個時鐘周期的低電平抖動將被消除,對于持續(xù)時間為3個或以上時鐘周期的低電平則認(rèn)為按鍵有效,輸出一個時鐘周期的低電平脈沖(讀者可以根據(jù)狀態(tài)轉(zhuǎn)換圖畫出相應(yīng)的時序圖進(jìn)行分析)。如果持續(xù)輸入為低電平,則每隔兩個時鐘周期輸出一個低電平,此時認(rèn)為按鍵處于"長按"輸入狀態(tài),可以編程設(shè)置相應(yīng)功能。在按鍵松開階段其抖動也可以一樣被消除。

適用于FPGA的按鍵消抖方法還有一些,如計數(shù)器型、D觸發(fā)器型等,在此就不作介紹了。

通過上面一些按鍵消抖方法的介紹分析,我們可以看到,傳統(tǒng)單片機(jī)等系統(tǒng)大多是串行處理,即順序執(zhí)行,只能并行處理一些中斷程序。對于這樣的系統(tǒng),只能采用單純軟件或硬件消抖,但都不那么完美。而對于FPGA等并行處理的系統(tǒng),其優(yōu)勢就很明顯,只要片內(nèi)邏輯資源夠用,通過硬件加速軟件消抖的處理,完全可以做到按鍵消抖并行化,不影響系統(tǒng)的實時性。

全部回復(fù)(1)
正序查看
倒序查看
2019-05-17 16:28
首先,一般都是采用軟件消抖,沒必要采用硬件方式,節(jié)省成本,其二,軟件消抖也不一定要采用硬delay的方式死等死等消抖,這種方式真正工程應(yīng)用中是不會用,裸機(jī)可以結(jié)合定時器方式使用,有OS的話這就更不是問題了。
0
回復(fù)
發(fā)