開關閉合,電容充電,直至電容兩端電壓=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...