RC充放電電路原理:
RC電路充放電公式:
Vt = V0+(V1-V0)* [1-exp(-t/RC)]V0 為電容上的初始電壓值;
V1 為電容最終可充到或放到的電壓值;
Vt 為t時刻電容上的電壓值。如果V0為0,也就是從0V開始充電。那么公式簡化為:
Vt= V1* [1-exp(-t/RC)]
結論:同樣的條件下,電容值C跟時間值t成正比關系,電容越大,充電到達某個臨界值的時間越長。
電容充電時間與電容大小關系:
電容觸摸按鍵原理:
- R:外接電容充放電電阻。
- Cs:TPAD和PCB間的雜散電容。
- Cx:手指按下時,手指和TPAD之間的電容。
- 開關:電容放電開關,由STM32 IO口代替。
檢測電容觸摸按鍵過程:
- TPAD引腳設置為推挽輸出,輸出0,實現電容放電到0。
- TPAD引腳設置為浮空輸入(IO復位后的狀態),電容開始充電。
- 同時開啟TPAD引腳的輸入捕獲開始捕獲。
- 等待充電完成(充電到底Vx,檢測到上升沿)。
- 計算充電時間。
沒有按下的時候,充電時間為T1(default)。按下TPAD,電容變大,所以充電時間為T2。我們可以通過檢測充放電時間,來判斷是否按下。如果T2-T1大于某個值,就可以判斷有按鍵按下。
硬件連接:
幾個重要的函數:
說明:對于不同的平臺,區別主要是定時器底層相關以及IO口初始化。
-
void TPAD_Reset(void)函數:復位TPAD
設置IO口為推挽輸出輸出0,電容放電。等待放電完成之后,設置為浮空輸入,從而開始充電。同時把計數器的CNT設置為0。 -
PAD_Get_Val()函數:獲取一次捕獲值(得到充電時間)
復位TPAD,等待捕獲上升沿,捕獲之后,得到定時器的值,計算充電時間。 -
TPAD_Get_MaxVal()函數:
多次調用TPAD_Get_Val函數獲取充電時間。獲取最大的值。 -
TPAD_Init()函數:初始化TPAD
在系統啟動后,初始化輸入捕獲。先10次調用TPAD_Get_Val()函數獲取10次充電時間,然后獲取中間N(N=8或者6)次的平均值,作為在沒有電容觸摸按鍵按下的時候的充電時間缺省值tpad_default_val。 -
TPAD_Scan()函數:掃描TPAD
調用TPAD_Get_MaxVal函數獲取多次充電中最大的充電時間,跟 tpad_default_val比較,如果大于某個閾值tpad_default_val+TPAD_GATE_VAL,則認為有觸摸動作。 -
void TIM5_CH2_Cap_Init(u16 arr,u16 psc)//輸入捕獲通道初始化
可以使用任何一個定時器。M3使用定時器5,M4使用的定時器2。
程序思路: