觸摸傳感器被廣泛使用已經有很多年了,不過,混合信號可編程器件的近期發展使得電容式觸摸傳感器在眾多消費類產品中都成為了機械式開關的一種實用、增值型替代方案。本文將粗略地介紹一種可透過一層厚玻璃覆蓋物來激活的觸摸感應式按鈕的設計實例。典型的電容式傳感器設計所規定的覆蓋物厚度為3mm 或更薄。隨著覆蓋物厚度的增加,透過一層覆蓋物來檢測手指的觸摸將變得越來越困難。換句話說,伴隨著覆蓋物厚度的增加,系統調整的過程將從“科學”走向“技巧”。為了說明如何制作一個能夠提升當今技術極限的電容式傳感器,在本文所述的實例中,玻璃覆蓋物的厚度被設定為10mm。玻璃易于使用,購買方便,而且是透明的(因此您可以看到位于其下方的金屬感應墊)。玻璃覆蓋物還被直接應用于白色家電。 手指電容 所有電容式觸摸感應系統的核心部分都是一組與電場相互作用的導體。人體組織中充滿了覆蓋著一層皮膚(這是一種有損電介質)的導電電極。正是手指的導電特性使得電容式觸摸感應成為可能。 簡單的平行片電容器具有兩個導體,其間隔著一層電介質。該系統中的大部分能量直接聚集在電容器極板之間。少許能量會溢出至電容器極板以外的區域中,而與該效應相關的電場線被稱為“邊緣場”。制作實用電容式傳感器的部分難題是:需要設計一組印刷電路走線,以便將邊緣場引導至一個用戶可以夠得到的有效感應區域。對于這樣一種傳感器模式來說,平行片電容器并非上佳之選。 把手指放在邊緣電場的附近將增加電容式系統的導電表面積。由手指所產生的額外電荷積聚電容被稱為手指電容CF。在本文中,無手指觸摸時的傳感器電容用CP 來表示,它代表寄生電容。 關于電容式傳感器的一個常見的誤解是:為了使系統正常工作,手指必需接地。手指是可以檢測到的,因為它會保存電荷(而在手指浮置或接地時都將產生這種現象)。 傳感器的 PCB布局 圖1 示出了一塊印刷電路板(PCB)的頂視圖,在本設計實例中,該PCB 實現了其中的一個電容式傳感器按鈕。該按鈕的直徑為10mm,這是一個成人指尖的平均大小。為該演示電路而組裝的PCB 包含4 個按鈕,它們的中心相隔20mm。如圖所示,接地平面也位于頂層。金屬感應墊和接地平面之間設置了一個均勻的隔離間隙。該間隙的尺寸是一個重要的設計參數。如果間隙設置得過小,則過多的電場能量將直接傳遞至地。而如果間隙設置得過大,則將無法控制能量穿越覆蓋物的方式。選擇0.5mm 的間隙尺寸可以很好地使邊緣場透過10mm 厚的玻璃覆蓋物。 圖2 示出了同一種傳感器模式的截面圖。如該圖所示,PCB 中的一條通路將金屬感應墊與電路板底面上的走線相連。當電場試圖找到最短的接地路徑時,介電常數εr 將對材料中的電場能量充填密度產生影響。標準窗戶玻璃的εr 約為8,而采用FR4 材料制成的PCB 的εr 則在4 左右。白色家電中常用的Pyrex?(派萊克斯)玻璃具有數值大約為5 的εr。在本設計實例中,采用的是標準的窗戶玻璃。需要注意的是,玻璃片是采用3M公司的468-MP 絕緣膠膜安裝在PCB 上的。 CapSense 101 電容式觸摸感應系統的基本元件是:一個可編程電流源、一個精密型模擬比較器和一根可通過一組電容式傳感器進行排序的模擬多路復用器總線。在本文給出的系統中,一個弛張振蕩器起著電容傳感器的作用。該振蕩器的簡化電路示意圖見圖3。 比較器的輸出被饋入一個PWM 的時鐘輸入,該PWM 負責對一個時鐘頻率為24MHz 的16 位計數器進行選通。觸摸按鍵的手指使電容增大,從而導致計數值增加。手指就是以這樣的方式來檢測的。該系統的典型波形示于圖4。 圖5 給出了該項目的一種可實現方案的示意圖。為了實現電容式觸摸感應和串行通信,該電路采用了賽普拉斯的 CY8C21x34 系列PSoC芯片,該芯片包含一組模擬和數字功能塊,這些功能塊可由存儲于板上閃存中的固件來配置。另一顆芯片負責處理RS232 電平移動,旨在提供至主機的通信鏈接,并實現115,200 波特的電容式觸摸感應數據記錄。PSoC 是通過ISSP 頭(包含電源、地)以及編程引腳SCL和SDA 來編程的。主PC 通過一個DB9 連接器與電容式觸摸感應電路板相連。 PSoC 采用固件來配置,以采用一個5V 工作電源和一個內部生成的24MHz 系統時鐘。對該24MHz 時鐘進行1:26 分頻,以提供一個用于115,200 波特TX8 模塊的時鐘。CapSense 用戶模塊選擇以“周期法”(Period Method)來運行,在該工作模式中,計數在固定數量的弛張振蕩器周期中累加。換言之,16 位計數器值代表了一個與傳感器電容成正比的周期。 清單1 羅列了系統固件。與設立電容式觸摸感應系統相關的大部分工作都已被編碼為一組由C 程序來調用的標準CSR 例行程序。例如:CSR_1_Start()負責配置PSoC 的內部布線,以使電流源DAC 與模擬多路復用器相連,而比較器與經過正確初始化的PWM和16 位計數器相連。 清單1:用于電容式觸摸感應系統的固件 //-----------------------------start of listing-------------------------------------------------------- //---------------------------------------------------------------------------- // main.c, a CapSense program in C // A demonstration of Capacitive Sensing with PSoC // with a 10mm glass overlay //---------------------------------------------------------------------------- #include // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules void main() { //a flag that is set when a finger is on any buttons int bBaselineButtonFlag; CSR_1_Start(); //initialize CapSense user module TX8_1_Start(TX8_1_PARITY_NONE); //initialize TX8 module M8C_EnableGInt; //enable global interrupts CSR_1_SetDacCurrent(200,0); //set current source to 200 out of 255 //use low range of current source CSR_1_SetScanSpeed(255); //set number of osc cycles to 255-2=253 while(1) { CSR_1_StartScan(1,1,0); //scan one button only, button 1 on P2[3] //wait for scanning of button to complete while (!(CSR_1_GetScanStatus() & CSR_1_SCAN_SET_COMPLETE)); //update baseline if required, set flag if any button pressed bBaselineButtonFlag = CSR_1_bUpdateBaseline(0); //data log the raw counts on button 1 TX8_1_PutSHexInt(CSR_1_iaSwResult[1]); TX8_1_PutChar(','); //data log switch mask... which switch is on? TX8_1_PutSHexInt(CSR_1_baSwOnMask[0]); TX8_1_CPutString(","); //data log switch difference = raw counts - baseline TX8_1_PutSHexInt(CSR_1_iaSwDiff[1]); TX8_1_PutChar(','); //data log update timer as a teaching aid TX8_1_PutSHexInt(CSR_1_bBaselineUpdateTimer); TX8_1_PutChar(','); //data log the baseline counts for button 1 TX8_1_PutSHexInt(CSR_1_iaSwBaseline[1]/4); TX8_1_PutCRLF(); } } //-------------------------------end of listing-------------------------------------------------------- 調整傳感器 每次在上列程序中調用函數CSR_1_StartScan( )時,均對Button1 的電容進行測量。原始計數值被存儲于CSR_1_iaSwResult[]陣列中。用戶模塊還跟蹤一個用于原始計數的基線。每個按鈕的基線值均為一個由IIR 濾波器采用軟件進行周期性計算的平均原始計數值。IIR 濾波器的更新速率是可編程的。基線使得系統能夠適應由于溫度和其他環境影響而在系統中引起的漂移。開關差分陣列CSR_1_iaSwDiff[]包含消除了基線偏移的原始計數值。按鈕目前的ON/OFF 狀態采用開關差值來決定。這可使系統的性能保持恒定,即便在基線有可能隨著時間的推移而發生漂移的情況下也是如此。 圖6 示出了采用固件來實現的差分計數與按鈕狀態之間的轉移函數。該轉移函數中的遲滯提供了ON 和OFF 狀態之間的干凈轉換,即使計數是有噪的也不例外。這提供了一種針對按鈕的除跳功能。較低的閾值被稱為“噪聲閾值”,而較高的閾值則被稱為“手指閾值”。閾值水平的設定決定了系統的性能。在覆蓋物非常厚的場合,信噪比很低。在此類系統中設定閾值水平是一項具有挑戰性的工作,而這恰好是電容式觸摸感應技巧的一 部分。 圖7 示出了一個持續時間為3 秒的按鈕觸壓操作的理想化原始計數波形。針對本項目的閾值水平示于此圖。噪聲閾值被設定為10 個計數,而手指閾值被設定為60 個計數。為了清晰地顯示閾值水平,圖8 并未示出始終存在于實際計數數據之中的噪聲分量。 電流源DAC 的電流水平選擇和用于計數累加的振蕩器周期數的設定是調整過程的一部分。在固件中,函數CSR_1_SetDacCurrent(200,0)把電流源設定在其低電流水平范圍內,數值為200(最高255),大約對應于14μA。函數CSR_1_SetScanSpeed(255)把振蕩器周期數設定為253(255-2)。原始計數和差分計數的分析表明:該系統具有一個約15pF 的寄生走線電容CP 和一個0.5pF 左右的手指電容CF。手指使總電容產生了約3%的變化。每個原始計數值的采集僅需500μs 的時間(每個按鈕)。 測量性能 電容式觸摸感應系統的測量性能示于圖8。差分計數通過一個終端仿真程序在主PC 上捕獲,然后借助電子制表軟件加以繪制。手指放置在10mm 厚的玻璃覆蓋物上,并持續3 秒的時間。按鈕的ON/OFF 狀態被疊加在原始計數上。按鈕在這兩種狀態之間干凈地轉換,即使存在因通過厚玻璃進行檢測而產生的比較嘈雜的原始計數信號時也是如此。請注意手指和按鈕閾值是如何隨著基線的漂移而進行周期性調整的。當檢測到手指的觸壓動作時,基線值將鎖定其數值,直到手指移開為止。 圖9 和圖10 示出了每種狀態轉換的細部視圖。在圖9 中,按鈕狀態一開始為“OFF”(關閉)。超過手指閾值的差分計數的第一個采樣把按鈕狀態轉換至“ON”(接通)。在圖10 中,利用低于噪聲閾值的差分計數的第一個采樣將按鈕轉換至OFF 狀態。 與機械式開關相比,基于電容的觸摸傳感器的主要優點是耐用性好,不易損壞。混合信號技術的近期發展不僅使得觸摸式傳感器的費用降到了一個經濟劃算的水平(故可在各種消費類產品中實現),而且還提高了檢測電路的靈敏度和可靠性(因而增加了覆蓋物的厚度和耐用性)。利用本文介紹的設計方法,即可通過一個10mm 的玻璃來檢測手指對按鍵的觸壓,并借助基于噪聲閾值和手指閾值的除跳法實現了ON 和OFF 按鈕狀態之間的干凈轉換,從而令電容式觸摸傳感器成為機械式開關元件的一種實用型替代方案。 |