考慮到美觀、整潔和成本效益等方面的因素,在包括消費類電子產品、家用電器等在內的許多電子產品中,觸摸傳感應用正變得越來越流行。本文將討論與電容觸摸傳感">電容觸摸傳感工作相關的基本概念,以及如何簡便地實現電容觸摸傳感">電容觸摸傳感功能。
電容的相關物理性質
為了更好地理解在電容觸摸傳感">電容觸摸傳感應用的硬件、布線和軟件開發中需要采取哪些措施,了解它內在的物理性質非常重要。控制它的是兩個基本公式和一個常識。第一個公式(見公式1)用于求電容值,它說明如何根據極板模型使用面積、距離和材料屬性來定義電容。第二個公式(見公式2)說明電容電壓與電流的關系,并引入RC電路的充電速率(等于時間常數τ)。第三個公式(見公式3)說明并聯電容的總電容值等于兩者相加。
公式1是雙極板電容的模型。它適用于觸摸傳感應用,因為在將手指靠近傳感器極板時,手指的作用也類似于一個極板。傳感器具有一定的標稱電容C1(由于走線、附近的地線等原因而產生)。將手指靠近時,距離“d”下降,而和A上升,并引入了并聯的附加電容“C2”。所產生的效果就是傳感器線路上的電容上升,上升值等于附加電容C2。然后,軟件必須通過硬件(向單片機中輸入傳感器讀數)來檢測電容變化。硬件將利用公式2(充電時間公式)的某種形式向單片機傳達傳感器讀數。
傳感器設計
傳感器設計通常很簡單。設計布線時,需要注意容性耦合效應及其關聯的物理性質。焊盤的面積及覆蓋在其上方的材料的厚度是最關鍵的因素。對于小鍵盤類型的應用,傳感器的大小應當至少為將手指按平時,指尖面積的大小。根據公式1中的面積“A”,傳感器較大時,其傳感能力通常也較好。此外,人們并不一定能夠恰當地控制手指的放置位置(從而控制產生的電容),而不同的兩個人也不會具有完全相同的電容。所以,傳感器的容限必須盡可能很大,可以處理遇到的各種觸摸情況,同時準確地報告按下狀態。
有些時候,指尖大小的傳感器并不總是最佳的。作為一條準則,傳感器焊盤上方的材料越厚,焊盤就必須越大,才能檢測到是否有手指按下。這是因為根據公式1,當傳感器焊盤上方的材料厚度增加時,距離“d”就會增大,從而手指的電容就會下降。對于需要非常精確的傳感器控制的應用(例如,傳感器很小),如果材料覆蓋層很厚,則最終會限制傳感器檢查按下狀態的能力。因此,如果傳感器非常小,覆蓋層必須盡可能薄。此外,如果非常小的傳感器相互緊鄰,還會產生容性耦合,在傳感器之間布置接地電路可以減少這種耦合效應。此外,還可以使用一些軟件技巧來辨別相互耦合程度很高的傳感器。
用于捕捉傳感器數據并將其轉換為數值(讀數)的硬件可采用許多方式開發。在電容觸摸傳感">電容觸摸傳感設計中,用硬件區分不同單片機供應商針對此應用推出的產品。根據公式2,可以測量和電流與電壓關系有關的3個基本量:
1. 充電至固定電壓需要的時間變化量(Δt,固定V);
2. 固定充電時間內的電壓變化量(ΔV,固定t);
3. 固定時間周期中的頻率變化量(Δf,固定T) 。
頻率測量方案基于充電速率公式(重復許多次),但它對應于較長的周期T,而不是單個充電周期t。所以,充電至固定電壓需要的時間變化量(Δt,固定V)和固定充電時間內的電壓變化量(ΔV,固定t),定義了檢測電容變化的基本方法。根據需要,可以基于這些基本方法來構造新的測量方案。
對于測量充電至固定電壓需要的時間變化量這種方法,手指產生的附加電容會增加充電時間(C上升),所以時間讀數會相應地上升。對于測量固定充電時間內的電平變化量這種方法,附加電容會降低相同時間量內所能達到的電壓,所以電壓讀數會下降。最后,對于測量固定時間周期中的頻率這種方法,頻率會隨振蕩器RC常數的上升而下降。因此,頻率讀數會下降。
本文以頻率測量方案為例進行說明,但每個系統都會應用后處理方案。使用一種方案時,電容讀數可能會上升,而使用另一種方案時,電容讀數可能會下降,但這可以在軟件中調整。選擇了硬件方案之后,讀數將根據請求輸入單片機,或按照軟件配置指定的其他時間間隔輸入單片機。
單片機軟件與后處理
單片機中的軟件負責處理電容觸摸傳感">電容觸摸傳感應用中的許多工作,前提是硬件和傳感器均正常工作。傳感器和整個系統的質量越好,軟件的實現就越簡單。開發軟件之前,需要記住每個傳感器都具有一定的固有寄生電容:Cp(或公式3中的C1)。因此,每個傳感器都可以檢測到某個標稱值。通過觀察傳感器的輸出,可以直觀方便地確定它,但必須先在軟件中設定該標稱值,然后才能以此為基準計算相對于它的偏差。實現它的最好方式是創建一個滑動平均值——即,16 點平均值。通過存儲先前16個值來計算平均值的效率很低,所以改為使用一種看起來較復雜,但計算較簡單、可節省存儲空間的求均值方法。
與具有極強計算能力的較大的計算機處理器相比,單片機通常在這方面受到限制。與實際執行除法相比,使用移位、加法和減法可以降低性能損失。此外,這個求均值程序并不僅限用于電容觸摸傳感">電容觸摸傳感——它對于8位單片機的很多應用都非常有用。
確定了平均值后,接下來必須構造傳感器掃描循環,目的是監視相對于平均值的偏差。從一個簡單循環開始,如圖1流程圖所示。掃描循環使用中斷來驅動,并使用兩個定時器和頻率偏移檢測方法。Timer0決定固定的時間周期T,在該時間周期內,將測量進入Timer1捕捉模塊的正邊沿數量,然后它產生一個頻率測量值。正邊沿數量越多,說明頻率越高。準備好獲取測量值時,Timer0發生溢出以觸發中斷,而Timer1會測量正邊沿數量。流程圖的“捕捉讀數”框顯示了何時獲取讀數。
下一步是確定按鈕是否被按下。如果按鈕未被按下,則繼續對傳感器讀數求均值。如果按鈕被按下,則不對傳感器讀數求均值,也就是說它將繼續一直跟蹤讀數(通常這不是所期望的)。然后,通過在C代碼中使用位標志或通過其他方式,向應用程序代碼指示按鈕已被按下。不要在中斷服務程序(ISR)中調用需要大量進一步計算的程序——較好的做法是設置一個標志,讓主循環進行響應。
此時,如果只有單個按鍵,則按照基本方法的描述,通過將定時器清零或將電容對地放電來重新開始測量過程。如果存在多個按鍵,則按順序掃描每個按鍵。按照圖1中的流程圖,基本的系統可以定期掃描按鍵。
尚待討論的是如何確定按鍵是否被按下。最需要考慮和注意的是圖1中的“按鍵是否被按下?”判斷塊的細節。這將在下一步討論。
為了確定按鍵是否被按下,需要先確定滑動平均值。確定平均值之后,根據測量值相對于平均值的偏差可以指示按鍵是否被按下。對于我們的系統,讀數下降表示按鍵按下。因為涉及到一些環境效應和其他因素(例如噪聲),所以必須設置一定的容限。但是,該系統未提供遲滯值,若讀數在均值與判決門限值之差附近上下變化,就會出現系統在判定按下與未按下之間來回振蕩這一糟糕的情形。為了避免這一點,需要包含遲滯值:
if (reading < average – trip) {
Buttons.SENSOR0 = PRESSED;
} else if (reading > average – trip + hyst) {
Buttons.SENSOR0 = UNPRESSED;
}
以上代碼在按鈕釋放中增添了遲滯值,使按鈕不會產生振動。這也為電容開關構造了最低程度的消抖功能。機械按鈕會在0-VDD之間來回抖動。電容按鈕不會產生該問題;但是,通過增添遲滯值,按鈕按下的操作與原來無異,只是加強了對按鈕釋放的判斷。這可以產生最低程度的消抖效果,因為單次按下仍然可以觸發按鍵。要進一步增強消抖,可以要求連續幾次的傳感器讀數均有效,才表示按鈕確實按下,然后向應用程序指示按鈕被按下。這樣可以防止虛假的低讀數影響系統。
復雜解碼方案
上面用于確定按鈕是否被按下的解碼方案是相當簡單的。
對于百分比按下檢測,將繼續使用前面討論的求均值方案。但是,讀數變量將變換為如下形式:
unsigned long percent;
percent = average – (reading*16);
if (percent < 0) {
percent = 0; // 忽略電容上升
} else {
percent = percent * 1000; // 乘以1000
percent = percent / average; // 結果使用100.0%的形式
}
結果變量percent包含0~1000的值,更具體地說,值的范圍約為0~200(代表20.0%)。結果值保持單個小數位,因為更多小數位并不會提高精度。
更換先前的“if”語句,產生類似于以下語句的“if”語句:
#define PCT_ON 50 // >5.0%,打開
#define PCT_OFF 30 // <3.0%,關閉
if (reading < PCT_ON) {
Buttons.SENSOR0 = PRESSED;
} else if (reading > PCT_OFF) {
Buttons.SENSOR0 = UNPRESSED;
}
下一個復雜解碼方案稱為“多鍵表決”。如前面所討論,傳感器不僅會與手指和周圍的地產生耦合,而且會相互耦合。因此,觸摸一個傳感器會影響另一個傳感器,但影響程度通常會低于其他意外激勵。如果即使影響程度較低,影響仍足以觸發按下狀態,會發生什么情況?
開發多鍵表決系統可以幫助解決該問題,以及與小鍵盤污染關聯的其他問題。多鍵表決系統會選擇按下后受影響最大的按鍵,代價是多次按下動作只能產生單個按鍵響應。例如,如果觸摸會影響兩個按鍵,但手指按下的按鍵受到的影響最大,該算法將選擇受影響最大的按鍵。
該算法必須獲取來自所有可用傳感器的數據。舉例來說,假定使用了4個傳感器。算法還是使用百分比按下檢測方法,因為每個傳感器的讀數可能會稍有不同,采用相對與原始值的偏差可以起到一些幫助。系統必須掃描全部4個傳感器,并在掃描之后執行以下步驟:
1. 首先,掃描所有傳感器;
2. 在每次掃描期間,記錄每個傳感器的受影響百分比;
3. 根據受影響程度進行排序;
4. 基于步驟3,對索引進行排序;
5. 位于數組單元0的傳感器的受影響程度最高;
6. 確定是否大于最小門限值;
7. 指示按下/未按下。
代碼示例1(略)
最后一個復雜解碼方案也是百分比方案。百分比計算會占用8位單片機上可用存儲器總空間中大量的程序和RAM存儲空間,占用。在可能的情況下,最好降低這種存儲器消耗。如果使用較大的數值,并可以承受一定的分辨率損失,則可以使用一種較簡單的百分比方法。
通過使用更多的移位來代替除法(類似于求均值方案),可以用如下方式確定平均值的百分比門限值:
threshold = average >> 3; // 傳感器
// 門限值現在為1/8,即12.5%
if (reading < average – threshold)
{...}
以下列出了一些有用的百分比。
threshold = reading >> 1; // 1/2 = 0.500
threshold = reading >> 2; // 1/4 = 0.250
threshold = reading >> 3; // 1/8 = 0.125
threshold = reading >> 4; // 1/16 = 0.063
threshold = reading >> 5; // 1/32 = 0.031
threshold = reading >> 6; // 1/64 = 0.016
threshold = reading >> 7; // 1/128 = 0.008
對于進行移位的每個位,門限值會損失一定的舍入分辨率。但是,使用較大的16位數值時,對于1/16的百分比(即6.25%),損失4個最低位是可以接受的。現在,對于簡單百分比計算,可以省去前面使用的unsigned long percent變量,以及執行除法所需的額外計算量。這是另一種并不僅限用于電容觸摸傳感">電容觸摸傳感的技術,但它對于觸摸傳感的實現非常有用。
結論
有許多方法可以實現電容觸摸系統,市場上針對此應用推出的各種嵌入式產品充分證明了這一點。關于這些解決方案有趣的一點是它們基于相同的物理原理,具有共同的基礎。其中一些解決方案采用了不同的布線方式(將地與傳感器組合);許多解決方案涉及到使用專有的材料。但是,電容觸摸傳感">電容觸摸傳感背后的概念是相當簡單的——關鍵在于在實現設計時需要理解應用背后隱含的物理原理。基于這種理解,結合對于所用硬件和軟件方案的良好理解,就可以簡便地實現電容觸摸傳感">電容觸摸傳感系統。
-
傳感器
+關注
關注
2548文章
50673瀏覽量
751987 -
觸摸傳感器
+關注
關注
0文章
121瀏覽量
23048 -
電容觸摸傳感
+關注
關注
0文章
11瀏覽量
6424
發布評論請先 登錄
相關推薦
評論