電容觸控按鍵原理:使用的是檢測電容充放電時間的方法來判斷是否有觸控,圖中 r 是外接的電容充電電阻,cs 是沒有觸控按下時 tpad 與 pcb 之間的雜散電容。而 cx 則是有手指按下的時候,手指與 tpad 之間形成的電容。
圖中的開關是電容放電開關(由實際使用時,由 stm32f4 的io 代替)
#include
"tpad.h"
#include
"stm32f4xx.h"
#include
"delay.h"
#define tpad_arr_max_val 0xffffffff
//最大的arr值(tim2是32位定時器)
//定時器2通道1輸入捕獲
//arr為自動重裝載值,psc為預分頻數
void
tim2_ch1_cap_init
(u8 psc)
vu16 tpad_default_val=0;
//空載的時候(沒有手按下),計數器需要的時間
//獲得空載的時候觸控按鍵的取值,即無觸控時的取值
//psc:分頻係數,越小,靈敏度越高.
//返回值:0,初始化成功;1,初始化失敗
u8 tpad_init
(u8 psc)
for(i=
0;i<
9;i++
)//對捕獲到的10個值進行排序}}
temp=0;
for(i=
2;i<
8;i++
)temp+
=buf[i]
;//取中間的8個資料進行平均
tpad_default_val=temp/6;
printf
("tpad_default_val:%d\r\n"
,tpad_default_val);if
(tpad_default_val>tpad_arr_max_val/2)
return1;
//初始化遇到超過tpad_arr_max_val/2的數值,不正常!
return0;
}//復位一次
//釋放電容電量,並清除定時器的計數值,一般作為第一步
//等待捕獲
void
tpad_reset
(void
)//得到定時器捕獲值
//如果超時,則直接返回定時器的計數值.
//返回值:捕獲值/計數值(超時的情況下返回)
u16 tpad_get_val
(void);
return
tim_getcapture1
(tim2);}
//讀取n次,取最大值
//n:連續獲取的次數
//返回值: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<(10
*tpad_default_val)
)//大於tpad_default_val+tpad_gate_val,且小於10倍tpad_default_val,則有效
//printf("r:%d\r\n",rval);
keyen=3;
//至少要再過3次之後才能按鍵有效 }if
(keyen)keyen--
;return res;
}
STM32 十九 電容按鍵檢測
如上圖為乙個電容按鍵結構圖,由絕緣材料 金屬感應片以及fr 4板材構成,金屬感應片和接地的金屬片形成乙個等效電容cx,當手指觸控時金屬感應片和手指會形成乙個cs等效電容。工作原理 在電路板未上電時,可以認為電容cx是沒有電荷的,在上電時,在電阻作用下,電容cx就會有乙個充電過程,直到電容充滿,即vc...
電容觸控按鍵實驗(STM32F407)
觸控電容按鍵 tpad 控制led的亮滅。使用的是檢測電容充放電時間的方法來判斷是否有觸控。r 是外接的電容充電電阻 上拉電阻,給電容充電 無觸控時,cs是tpad 與 pcb 之間的雜散電容。當有觸控時,cx 則是手指與 tpad 之間形成的電容,總的電容就為cs cx。圖中的開關是電容放電開關。...
STM32F103ZET6 電容觸控按鍵
開關閉合,電容充電,直至電容兩端電壓 v1 rc電路充放電公式 vt v0 v1 v0 1 exp t rc v0 為電容上的初始電壓值 v1 為電容最終可充到或放到的電壓值 vt 為t時刻電容上的電壓值。如果v0為0,也就是從0v開始充電。那麼公式簡化 vt v1 1 exp t rc 結論 同樣...