STM32F103ZET6 電容觸控按鍵

2021-10-02 16:50:45 字數 3458 閱讀 9869

開關閉合,電容充電,直至電容兩端電壓=v1

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口代替。

按鍵按下時,cx與cs併聯,其總電容=cx+cs,電容值變大,充放電時間變長

檢測電容觸控按鍵過程:

tpad引腳設定為推挽輸出,輸出0,實現電容放電到0。

tpad引腳設定為浮空輸入(io復位後的狀態),電容開始充電。

同時開啟tpad引腳的輸入捕獲開始捕獲。

等待充電完成(充電到底vx,檢測到上公升沿)。

計算充電時間。

ps:沒有按下的時候,充電時間為t1(default)。按下tpad,電容變大,所以充電時間為t2。我們可以通過檢測充放電時間,來判斷是否按下。如果t2-t1大於某個值,就可以判斷有按鍵按下。

void tpad_reset(void)函式:復位tpad

設定io口為推挽輸出輸出0,電容放電。等待放電完成之後,設定為浮空 輸入,從而開始充電。同時把計數器的cnt設定為0。

tpad_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。

//最大的arr值

vu16 tpad_default_val=0;

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

//初始化觸控按鍵

//獲得空載的時候觸控按鍵的取值.

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

u8 tpad_init

(u8 psc)

for(i=

0;i<

9;i++

)//排序}}

temp=0;

for(i=

2;i<

8;i++

)temp+

=buf[i]

;//取中間的6個資料進行平均

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_getcapture2

(tim5);}

//讀取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)

)//大於tpad_default_val+tpad_gate_val,有效

if(keyen)keyen--

;return res;

}//定時器2通道2輸入捕獲配置

void

tim5_ch2_cap_init

(u16 arr,u16 psc)

main.c

int

main

(void

) t++;if

(t==15)

delay_ms(10

);}}

STM32F103ZET6學習總結

1.任何外設在使用之前,必須先使能相應的時鐘。2.使用不同外設時,gpio引腳應該如何配置?1 gpio mode ain 模擬輸入 2 gpio mode in floating 浮空輸入 3 gpio mode ipd 下拉輸入 4 gpio mode ipu 上拉輸入 5 gpio mode ...

STM32F103ZET6移植FreeRTOS過程

2.解壓 我們需要幾個檔案 1 在freertosv9.0.0 freertos source 下的所有c檔案 ps 並不是所有都一定要用,按需要取 2 在freertosv9.0.0 freertos source include整個資料夾 3 在freertosv9.0.0 freertos s...

STM32F103ZET6待機喚醒 低功耗

在系統或者電源復位後,微控制器出於執行狀態之下,hclk為cpu提供時鐘,核心執行 當cpu不需要繼續執行時,可以利用多種低功耗模式來節省功耗,例如等待某個事件觸發。睡眠模式 核心停止,外設如nvic,系統時鐘systick仍執行。停止模式 所有時鐘都已停止。1.8v核心電源工作。pll,his和h...