觸控電容按鍵(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...