單片機模擬電容觸摸按鍵_第1頁
單片機模擬電容觸摸按鍵_第2頁
單片機模擬電容觸摸按鍵_第3頁
單片機模擬電容觸摸按鍵_第4頁
單片機模擬電容觸摸按鍵_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、 單片機模擬電容觸摸按鍵圖2 TPAD與STM32連接原理圖圖1、電容觸摸按鍵原理 這里我們使用的是檢測電容充放電時間的方法來判斷是否有觸摸,圖中R是外接的電容充電電阻,Cs是沒有觸摸按下時TPAD與PCB之間的雜散電容。而Cx則是有手指按下的時候,手指與TPAD之間形成的電容。圖中的開關(guān)是電容放電開關(guān)(由實際使用時,由STM32的IO代替)。 先用開關(guān)將Cs(或Cs+Cx)上的電放盡,然后斷開開關(guān),讓R給Cs(或Cs+Cx)充電,當(dāng)沒有手指觸摸的時候,Cs的充電曲線如圖中的A曲線。而當(dāng)有手指觸摸的時候,手指和TPAD之間引入了新的電容Cx,此時Cs+Cx的充電曲線如圖中的B曲線。從上圖可以看

2、出,A、B兩種情況下,Vc達(dá)到Vth的時間分別為Tcs和Tcs+Tcx。 其中,除了Cs和Cx我們需要計算,其他都是已知的,根據(jù)電容充放電公式:Vc=V0*(1-e(-t/RC) 其中Vc為電容電壓,V0為充電電壓,R為充電電阻,C為電容容值,e為自然底數(shù),t為充電時間。根據(jù)這個公式,我們就可以計算出Cs和Cx。利用這個公式,我們還可以把戰(zhàn)艦開發(fā)板作為一個簡單的電容計,直接可以測電容容量了,有興趣的朋友可以搗鼓下。 在本章中,其實我們只要能夠區(qū)分Tcs和Tcs+Tcx,就已經(jīng)可以實現(xiàn)觸摸檢測了,當(dāng)充電時間在Tcs附近,就可以認(rèn)為沒有觸摸,而當(dāng)充電時間大于Tcs+Tx時,就認(rèn)為有觸摸按下(Tx為

3、檢測閥值)。 本章,我們使用PA1(TIM5_CH2)來檢測TPAD是否有觸摸,在每次檢測之前,我們先配置PA1為推挽輸出,將電容Cs(或Cs+Cx)放電,然后配置PA1為浮空輸入,利用外部上拉電阻給電容Cs(Cs+Cx)充電,同時開啟TIM5_CH2的輸入捕獲,檢測上升沿,當(dāng)檢測到上升沿的時候,就認(rèn)為電容充電完成了,完成一次捕獲檢測。在MCU每次復(fù)位重啟的時候,我們執(zhí)行一次捕獲檢測(可以認(rèn)為沒觸摸),記錄此時的值,記為tpad_default_val,作為判斷的依據(jù)。在后續(xù)的捕獲檢測,我們就通過與tpad_default_val的對比,來判斷是不是有觸摸發(fā)生。關(guān)于輸入捕獲的配置,在上一章我們

4、已經(jīng)有詳細(xì)介紹了,這里我們就不再介紹。至此,電容觸摸按鍵的原理介紹完畢。2 硬件設(shè)計本實驗用到的硬件資源有:1) 指示燈DS0和DS12) 定時器TIM53) 觸摸按鍵TPAD前面兩個之前均有介紹,我們需要通過TIM5_CH2(PA1)采集TPAD的信號,所以本實驗需要用跳線帽短接多功能端口(P14)的TPAD和ADC,以實現(xiàn)TPAD連接到PA1。如圖16.2.1所示: 3 軟件設(shè)計軟件設(shè)計我們在之前的工程上面增加,首先在HARDWARE文件夾下新建TPAD的文件夾。然后打開USER文件夾下的工程,新建一個tpad.c的文件和tpad.h的頭文件,保存在TAPD文件夾下,并將TPAD文件夾加入

5、頭文件包含路徑。我們在tpad.c里輸入如下代碼:#define TPAD_ARR_MAX_VAL 0XFFFF /最大的ARR值 vu16 tpad_default_val=0;/空載的時候(沒有手按下),計數(shù)器需要的時間/初始化觸摸按鍵/獲得空載的時候觸摸按鍵的取值./systick:系統(tǒng)時鐘頻率/返回值:0,初始化成功;1,初始化失敗u8 TPAD_Init(u8 systick) u16 buf10; u16 temp; u8 j,i; TIM5_CH2_Cap_Init(TPAD_ARR_MAX_VAL,systick-1);/以1Mhz的頻率計數(shù) for(i=0;i10;i+)/連

6、續(xù)讀取10次 buf=TPAD_Get_Val(); delay_ms(10); for(i=0;i9;i+)/排序 for(j=i+1;jbufj)/升序排列 temp=buf; buf=bufj; bufj=temp; temp=0; for(i=2;iTPAD_ARR_MAX_VAL/2)return 1;/初始化遇到超過TPAD_ARR_MAX_VAL/2的數(shù)值,不正常! return 0; /復(fù)位一次/釋放電容電量,并清除定時器的計數(shù)值void TPAD_Reset(void) GPIOA-CRL&=0XFFFFFF0F; /PA1 輸入 GPIOA-CRL|=0X; /復(fù)用功能輸出

7、 GPIOA-ODR&=(1SR=0; /清除標(biāo)記 TIM5-CNT=0; /歸零 GPIOA-CRL&=0XFFFFFF0F; /PA1 輸入 GPIOA-CRL|=0X; /復(fù)用功能輸出 /得到定時器捕獲值/如果超時,則直接返回定時器的計數(shù)值./返回值:捕獲值/計數(shù)值(超時的情況下返回)u16 TPAD_Get_Val(void) TPAD_Reset(); while(TIM5-SR&0X04)=0)/等待捕獲上升沿 if(TIM5-CNTTPAD_ARR_MAX_VAL-500)return TIM5-CNT;/超時了,直接返回CNT的值 ; return TIM5-CCR2; /讀取

8、n次,取最大值/n:連續(xù)獲取的次數(shù)/返回值:n次讀數(shù)里面讀到的最大讀數(shù)值u16 TPAD_Get_MaxVal(u8 n) u16 temp=0; u16 res=0; while(n-) temp=TPAD_Get_Val();/得到一次值 if(tempres)res=temp; ; return res;/掃描觸摸按鍵/mode:0,不支持連續(xù)觸發(fā)(按下一次必須松開才能按下一次);1,支持連續(xù)觸發(fā)(可以一直按下)/返回值:0,沒有按下;1,有按下; #define TPAD_GATE_VAL 80 /觸摸的門限值,也就是必須大于tpad_default_val+TPAD_GATE_VAL

9、,才認(rèn)為是有效觸摸.u8 TPAD_Scan(u8 mode) static u8 keyen=0; /0,可以開始檢測;0,還不能開始檢測 u8 res=0; u8 sample=3; /默認(rèn)采樣次數(shù)為3次 u16 rval; if(mode) sample=6; /支持連按的時候,設(shè)置采樣次數(shù)為6次 keyen=0; /支持連按 rval=TPAD_Get_MaxVal(sample); if(rval(tpad_default_val+TPAD_GATE_VAL)/大于tpad_default_val+TPAD_GATE_VAL,有效 rval=TPAD_Get_MaxVal(sampl

10、e); if(keyen=0)&(rval(tpad_default_val+TPAD_GATE_VAL)/大于tpad_default_val+TPAD_GATE_VAL,有效 res=1; /printf(r:%drn,rval); keyen=5; /至少要再過5次之后才能按鍵有效 else if(keyen2)keyen=2; /如果檢測到按鍵松開,則直接將次數(shù)將為2,以提高響應(yīng)速度 if(keyen)keyen-; return res;/定時器2通道2輸入捕獲配置/arr:自動重裝值/psc:時鐘預(yù)分頻數(shù)void TIM5_CH2_Cap_Init(u16 arr,u16 psc)

11、 /此部分需手動修改 IO口設(shè)置 RCC-APB1ENR|=1APB2ENR|=1CRL&=0XFFFFFF0F; /PA1 輸入 GPIOA-CRL|=0X; /浮空輸入 TIM5-ARR=arr; /設(shè)定計數(shù)器自動重裝值/剛好1ms TIM5-PSC=psc; /預(yù)分頻器,1M的計數(shù)頻率 TIM5-CCMR1|=1CCMR1|=3CCMR1|=0CCER|=0CCER|=1CR1|=0x01; /使能定時器5此部分代碼包含6個函數(shù),我們將介紹其中4個比較重要的函數(shù):TIM5_CH2_Cap_Init、TPAD_Get_Val、TPAD_Init和TPAD_Scan。首先介紹TIM5_CH2

12、_Cap_Init函數(shù),該函數(shù)和上一章的輸入捕獲函數(shù)基本一樣,不同的是,這里我們設(shè)置的是CH2通道,并開啟了輸入濾波器。通過該函數(shù)的設(shè)置,我們將可以捕獲PA1上的上升沿。我們再來看看TPAD_Get_Val函數(shù),該函數(shù)用于得到定時器的一次捕獲值。該函數(shù)先調(diào)用TPAD_Reset,將電容放電,同時設(shè)置TIM5_CNT寄存器為0,然后死循環(huán)等待發(fā)生上升沿捕獲(或計數(shù)溢出),將捕獲到的值(或溢出值)作為返回值返回。接著我們介紹TPAD_Init函數(shù),該函數(shù)用于初始化輸入捕獲,并獲取默認(rèn)的TPAD值。該函數(shù)有一個參數(shù),用來傳遞系統(tǒng)時鐘,其實是為了配置TIM5_CH2_Cap_Init為1us計數(shù)周期。

13、在該函數(shù)中連續(xù)10次讀取TPAD值,將這些值升序排列后取中間6個值再做平均(這樣做的目的是盡量減少誤差),并賦值給tpad_default_val,用于后續(xù)觸摸判斷的標(biāo)準(zhǔn)。最后,我們來看看TPAD_Scan函數(shù),該函數(shù)用于掃描TPAD是否有觸摸,該函數(shù)的參數(shù)mode,用于設(shè)置是否支持連續(xù)觸發(fā)。返回值如果是0,說明沒有觸摸,如果是1,則說明有觸摸。該函數(shù)同樣包含了一個靜態(tài)變量,用于檢測控制,類似第八章的KEY_Scan函數(shù)。所以該函數(shù)同樣是不可重入的。在函數(shù)中,我們通過連續(xù)讀取3次(不支持連續(xù)按的時候)TPAD的值,取這他們的最大值,和tpad_default_val+TPAD_GATE_VAL

14、比較,如果大于則說明有觸摸,如果小于,則說明無觸摸。其中tpad_default_val是我們在調(diào)用TPAD_Init函數(shù)的時候得到的值,而TPAD_GATE_VAL則是我們設(shè)定的一個門限值(這個大家可以通過實驗數(shù)據(jù)得出,根據(jù)實際情況選擇適合的值就好了),這里我們設(shè)置為80。該函數(shù),我們還做了一些其他的條件限制,讓觸摸按鍵有更好的效果,這個就請大家看代碼自行參悟了。我們將tpad.c文件保存,然后加入到HARDWARE組下。接下來,在tpad.h文件里,我們輸入如下代碼:#ifndef _TPAD_H#define _TPAD_H#include sys.h#include timer.h /

15、空載的時候(沒有手按下),計數(shù)器需要的時間/這個值應(yīng)該在每次開機的時候被初始化一次extern vu16 tpad_default_val; void TPAD_Reset(void);u16 TPAD_Get_Val(void);u16 TPAD_Get_MaxVal(u8 n);u8 TPAD_Init(u8 systick);u8 TPAD_Scan(u8 mode);void TIM5_CH2_Cap_Init(u16 arr,u16 psc); #endif此部分代碼比較簡單,這里不做介紹。接下來,我們修改主程序里面的main函數(shù)如下:int main(void) u8 t=0; S

16、tm32_Clock_Init(9); /系統(tǒng)時鐘設(shè)置 uart_init(72,9600); /串口初始化為9600 delay_init(72); /延時初始化 LED_Init(); /初始化與LED連接的硬件接口 TPAD_Init(72); /初始化觸摸按鍵 while(1) if(TPAD_Scan(0) /成功捕獲到了一次上升沿(此函數(shù)執(zhí)行時間至少15ms) LED1=!LED1; /LED1取反 t+; if(t=15) t=0; LED0=!LED0; /LED0取反,提示程序正在運行 delay_ms(10); 該main函數(shù)比較簡單,TPAD_Init(72)函數(shù)執(zhí)行之后,就開始觸摸按鍵的掃描,當(dāng)有觸摸的時候,對DS1取反,而DS0則有規(guī)律的間隔取反,提示程序正在運行。注意在修改main函數(shù)之后,還需要在test.c里面添加tpad.h頭文件,否則

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論