一。 電容觸摸按鍵原理
1. RC 充放電電路原理
Cx電壓從0開始充電,一直到V1。
如果達到同樣的電壓值,如果電容越大,那么達到的時間越長。
手指按下后,電容值為Cs+Cx,電容變大,充電時間變長,通過判斷充電時間長短來判斷TPAD是否被按下。
2. 電容觸摸按鍵在PCB板上怎么畫
首先,人體是具有一定電容的。當我們把PCB上的銅畫成如下形式的時候,就完成了一個最基本的觸摸感應按鍵。
上圖左邊,是一個基本的觸摸按鍵,中間圓形綠色的為銅(我們可以稱之為“按鍵”),在這些按鍵中會引出一根導線與MCU相連,MCU通過這些導線來檢測是否有按鍵“按下”(檢測的方法多種多樣,這將在后面章節(jié)中談到);外圍的綠色也是銅,不過外圍的這些銅是與GND大地相連的。在“按鍵”和外圍的銅之間是空隙(我們可以稱為空隙d)。上圖右邊是左圖的截面圖,當沒有手指接觸時,只有一個電容Cp ,當有手指接觸時,“按鍵”通過手指就形成了電容Cf 。由于兩個電容是并聯(lián)的。
下圖更簡單的說明了上述原理
材料:PCB銅箔
形狀:原則上可以做成任意形狀,中間可留孔或鏤空。我們推薦做成邊緣圓滑的形狀,如圓形或六角形,可以避免尖端放電效應 。
大?。鹤钚?mmX4mm, 最大30mmX30mm,有的建議不要大于15mmX15mm,太大的話,外界的干擾相
應的也會增加。
底板覆銅:在電路板底層覆銅是很有必要的,這些接地的覆銅能夠最大限度的降低觸摸按鍵的噪聲以及外部環(huán)境對觸摸按鍵的影響。
推薦采用50%--70%的網(wǎng)格覆銅。
靈敏度:一般的感應按鍵面積大小和靈敏度成正比。一般來說,按鍵感應盤的直徑要大于面板厚度的4倍,
并且增大電極的尺寸,可以提高信噪比。各個感應盤的形狀、面積應該相同,以保證靈敏度一致。 靈敏度與外接CIN電容的大小成反比;與面板的厚度成反比;與按鍵感應盤的大小成正比。
外接 CIN電容的選擇:
CIN電容可在0PF~50PF選擇。電容越小,靈敏度越高,但是抗干擾能力越差。電容越大,靈敏度越低,但是抗干擾能力越強。通常,我們推薦5PF~20PF。
按鍵的間距:各個感應盤間的距離要盡可能的大一些(大于5mm),以減少它們形成的電場之間的相互干擾。當用PCB銅箔做感應盤時,若感應盤間距離較近(5MM~10MM),感應盤周圍必須用鋪地隔離。 如圖:各個按鍵距離比較遠,周圍空白的都用地線隔開了。但注意地線要與按鍵保持一定的距離。
觸摸按鍵表面的覆蓋物:在許多的應用中,我們需要在觸摸按鍵上添加一些覆蓋物,如:塑料等。在這種情況下,人的手指就不能和觸摸按鍵直接接觸了。可以畫個logo。
布局:
A. CIN電容盡量靠近IC放置,各個通道的CIN電容必須用鋪地隔離。感應盤也要盡量靠近IC,這樣
感應盤到IC的連線就會最短。
B. 布局時應盡量保證觸摸IC到感應盤的距離基本平衡。
走線:
A. 感應盤到觸摸芯片的連線盡量短和細,如果PCB工藝允許盡量采用5MIL的線寬
B. 感應盤到觸摸IC的連線不要跨越其他信號線。尤其不能跨越強干擾、高頻的信號線
C. 感應盤到觸摸IC的連線周圍0.5MM不要走其他信號線
D. 如果使用哪個PCB板上的銅箔圖案做觸摸感應盤,盡量使用雙面PCB,觸摸芯片和感應盤到IC
引腳的連線應放在感應盤銅箔的背面(BOTTOM)。感應盤應緊貼觸摸面板。
E. 觸摸IC及其相關的外圍電路要用45°網(wǎng)格鋪地,網(wǎng)格中銅的面積不要超過總面積的40%。連線周
圍0.5MM不能鋪地。感應盤和鋪地至少要有10MM的距離。感應盤正對的背面不允許鋪地,也不允許有任何大面積的銅箔和其他信號線。
二。 硬件連接
我們需要通過 TIM5_CH2(PA1)采集 TPAD 的信號,所以本實驗需要用跳線帽短接多功能端口(P14)的 TPAD 和 ADC,以實現(xiàn) TPAD 連接到 PA1。
三。 實驗程序
程序設計思路
//定時器 5 通道 2 輸入捕獲配置
void TIM5_CH2_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM5_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 PA 時鐘
//設置 GPIOA.1 為浮空輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.1
//初始化 TIM5
TIM_TimeBaseStructure.TIM_Period = arr; //設定計數(shù)器自動重裝值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //預分頻器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根據(jù)參數(shù)初始化 TIMx
//初始化 TIM5 通道 2
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_2; //選擇輸入端 IC2 映射到 TI5 上
TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻
TIM5_ICInitStructure.TIM_ICFilter = 0x03;//配置輸入濾波器 8 個定時器時鐘周期濾波
TIM_ICInit(TIM5, &TIM5_ICInitStructure);//初始化 I5 IC2
TIM_Cmd(TIM5,ENABLE ); //使能定時器 5
}
//得到定時器捕獲值
//如果超時,則直接返回定時器的計數(shù)值.
u16 TPAD_Get_Val(void)
{
TPAD_Reset();
while(TIM_GetITStatus(TIM5, TIM_IT_CC2)== RESET) //等待溢出,如果一直捕獲不到上升沿,直接返回計數(shù) 值
{
if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)
return TIM_GetCounter(TIM5); //超時了,直接返回 CNT 的值
};
return TIM_GetCapture2(TIM5); //捕獲到上升沿后返回捕獲值
}