電容觸控按鍵實驗(STM32F407)

2021-10-09 05:56:46 字數 3808 閱讀 1784

觸控電容按鍵(tpad),控制led的亮滅。

使用的是檢測電容充放電時間的方法來判斷是否有觸控。

r 是外接的電容充電電阻(上拉電阻,給電容充電), 無觸控時, cs是tpad 與 pcb 之間的雜散電容。 當有觸控時, cx 則是手指與 tpad 之間形成的電容,總的電容就為cs+cx。圖中的開關是電容放電開關。

先用開關將 cs(或 cs+cx)上的電放盡,然後斷開開關,讓 r 給 cs(或 cs+cx)充電,當沒有手指觸控的時候, cs 的充電曲線如圖中的 a 曲線。 而當有手指觸控的時候, 手指和 tpad之間引入了新的電容 cx,此時 cs+cx 的充電曲線如圖中的 b 曲線。由圖可得, a、b兩種情況下,vc 達到 vth 的時間分別為 tcs 和 tcs+tcx。由此把充電時間的差異,作為判斷有無觸控的條件。

電容充放電公式:vc=v0(1-e^(-t/rc))*

其中 vc 為電容電壓, v0 為充電電壓, r 為充電電阻, c 為電容容值, e 為自然底數, t 為

充電時間。

1、程式啟動,無觸控時,先採集10次電容充滿電的時間(利用輸入捕獲),為了減小誤差,取中間6次 的值取平均,即tpad_default_val,這個值作為無觸控時充電時間。

2、按鍵掃瞄,實時採集電容充電時間(利用輸入捕獲),若採集的值大於步驟1中的tpad_default_val+門檻值,說明按鍵有觸控。(此例程的門檻值設為100)。

tpad.**件

#ifndef __tpad_h

#define __tpad_h

#include

"sys.h"

//空載的時候(沒有手按下),計數器需要的時間

//這個值應該在每次開機的時候被初始化一次

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

tim2_ch1_cap_init

(u32 arr,u16 psc)

;#endif

tpad.c檔案

#include

"tpad.h"

#include

"delay.h"

#include

"usart.h"

/*電容按鍵觸控實驗原理:當無觸控時,先檢測電容充滿電的時間;當有觸控時,再檢測電容的充滿電的時間;

這兩個時間值的區別就是判斷有無觸控的條件*/

#define tpad_arr_max_val 0xffffffff

//65536,最大的arr值(tim2是32位定時器)

vu16 tpad_default_val =0;

//空載的時候(沒有手按下),計數器需要的時間

/*初始化觸控按鍵,獲得無觸控的時候觸控按鍵的取值.

psc:分頻係數越小,靈敏度越高.

返回值:0,初始化成功;1,初始化失敗*/

u8 tpad_init

(u8 psc)

for(i=

0;i<

9;i++

)//氣泡排序}}

temp =0;

for(i=

2;i<

8;i++)

tpad_default_val = temp/6;

//tpad_default_val用於後續判斷有無觸控的條件

printf

("tpad_default_val:%d\r\n"

,tpad_default_val);if

(tpad_default_val>tpad_arr_max_val/2)

//初始化遇到超過65536/2的數值,不正常!說明初始化失敗

return1;

return0;

//返回0,說明初始化成功

}/*復位一次,釋放電容電量,並清除定時器的計數值*/

void

tpad_reset

(void

)/*得到定時器捕獲值,即電容充滿電的時間。

如果超時,則直接返回定時器的計數值.

返回值:捕獲值/計數值(超時的情況下返回)*/

u16 tpad_get_val

(void);

return

tim_getcapture1

(tim2)

;//返回的這個值就是無觸控時,電容充滿電的時間

}//以上是無觸控時,tpad的初始化函式;以下是對tpad有無觸控的掃瞄函式

/*掃瞄有無觸控時,連續讀取n次電容充滿電的時間,取最大值,看看這個最大值是否滿足判斷條件*/

u16 tpad_get_maxval

(u8 n)};

return res;

}/*掃瞄是否有觸控

mode:0,不支援連續觸發(按下一次必須鬆開才能按下一次);1,支援連續觸發(可以一直按下)

返回值:0,沒有按下;1,有按下;*/

#define tpad_gate_val 100

//觸控的門限值,也就是必須大於tpad_default_val+tpad_gate_val,才認為是有效觸控.

//這個門限值是根據實驗而定,不可亂來,否則出錯會不斷的修改程式。

u8 tpad_scan

(u8 mode)

rval =

tpad_get_maxval

(sample);if

(rval>

(tpad_default_val+tpad_gate_val)

&&rval

*tpad_default_val)

)//大於tpad_default_val+tpad_gate_val,且小於10倍tpad_default_val,則有效,有觸控

keyen =3;

//至少要再過3次之後才能按鍵有效 }if

(keyen)keyen--

;return res;

}/*定時器2通道2輸入捕獲配置,用於捕獲pa5上的上公升沿*/

void

tim2_ch1_cap_init

(u32 arr,u16 psc)

main函式

#include

"sys.h"

#include

"delay.h"

#include

"usart.h"

#include

"led.h"

#include

"tpad.h"

intmain

(void

) t++;if

(t==15)

delay_ms(10

);}}

我們定義有效資料定義為採集時間大於某乙個設定值如:掃瞄值 > tpad_default_val+門檻值

我們把採集到的有效資料視為高電平,無效的視為低電平。

關於門檻值的定義,一定要先採集自己板子上的實際值再開始資料判斷,每個開發板的實際值有差異,否則可能導致一直不成功反覆修改**。

stm32 電容觸控按鍵

電容觸控按鍵原理 使用的是檢測電容充放電時間的方法來判斷是否有觸控,圖中 r 是外接的電容充電電阻,cs 是沒有觸控按下時 tpad 與 pcb 之間的雜散電容。而 cx 則是有手指按下的時候,手指與 tpad 之間形成的電容。圖中的開關是電容放電開關 由實際使用時,由 stm32f4 的io 代替...

STM32F103ZET6 電容觸控按鍵

開關閉合,電容充電,直至電容兩端電壓 v1 rc電路充放電公式 vt v0 v1 v0 1 exp t rc v0 為電容上的初始電壓值 v1 為電容最終可充到或放到的電壓值 vt 為t時刻電容上的電壓值。如果v0為0,也就是從0v開始充電。那麼公式簡化 vt v1 1 exp t rc 結論 同樣...

stm32f4 定時捕獲

概述 1000hz 20 80 占空比現象 1000hz 51 58 占空比現象 關於本文的更多詳情請往下看。筆者針對於初學者提供的例程都是去掉了許多不必要的功能,精簡了官方的 對初學者一看就明白,以簡單明瞭的工程供大家學習。stm32f4 tim輸入波形捕獲 脈衝頻率 占空比 例項 訪問密碼 st...