電容式觸摸感應(yīng)的技巧
PSoC 采用固件來配置,以采用一個(gè)5V 工作電源和一個(gè)內(nèi)部生成的24MHz 系統(tǒng)時(shí)鐘。對(duì)該24MHz 時(shí)鐘進(jìn)行1:26 分頻,以提供一個(gè)用于115,200 波特TX8 模塊的時(shí)鐘。CapSense 用戶模塊選擇以“周期法”(Period Method)來運(yùn)行,在該工作模式中,計(jì)數(shù)在固定數(shù)量的弛張振蕩器周期中累加。換言之,16 位計(jì)數(shù)器值代表了一個(gè)與傳感器電容成正比的周期。
清單1 羅列了系統(tǒng)固件。與設(shè)立電容式觸摸感應(yīng)系統(tǒng)相關(guān)的大部分工作都已被編碼為一組由C 程序來調(diào)用的標(biāo)準(zhǔn)CSR例行程序。例如:CSR_1_Start()負(fù)責(zé)配置PSoC 的內(nèi)部布線,以使電流源DAC與模擬多路復(fù)用器相連,而比較器與經(jīng)過正確初始化的PWM和16 位計(jì)數(shù)器相連。
清單1:用于電容式觸摸感應(yīng)系統(tǒng)的固件
//-----------------------------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--------------------------------------------------------
調(diào)整傳感器
每次在上列程序中調(diào)用函數(shù)CSR_1_StartScan( )時(shí),均對(duì)Button1 的電容進(jìn)行測(cè)量。原始計(jì)數(shù)值被存儲(chǔ)于CSR_1_iaSwResult[]陣列中。用戶模塊還跟蹤一個(gè)用于原始計(jì)數(shù)的基線。每個(gè)按鈕的基線值均為一個(gè)由IIR濾波器采用軟件進(jìn)行周期性計(jì)算的平均原始計(jì)數(shù)值。IIR 濾波器的更新速率是可編程的?;€使得系統(tǒng)能夠適應(yīng)由于溫度和其他環(huán)境影響而在系統(tǒng)中引起的漂移。開關(guān)差分陣列CSR_1_iaSwDiff[]包含消除了基線偏移的原始計(jì)數(shù)值。按鈕目前的ON/OFF 狀態(tài)采用開關(guān)差值來決定。這可使系統(tǒng)的性能保持恒定,即便在基線有可能隨著時(shí)間的推移而發(fā)生漂移的情況下也是如此。
圖6 示出了采用固件來實(shí)現(xiàn)的差分計(jì)數(shù)與按鈕狀態(tài)之間的轉(zhuǎn)移函數(shù)。該轉(zhuǎn)移函數(shù)中的遲滯提供了ON 和OFF 狀態(tài)之間的干凈轉(zhuǎn)換,即使計(jì)數(shù)是有噪的也不例外。這提供了一種針對(duì)按鈕的除跳功能。較低的閾值被稱為“噪聲閾值”,而較高的閾值則被稱為“手指閾值”。閾值水平的設(shè)定決定了系統(tǒng)的性能。在覆蓋物非常厚的場(chǎng)合,信噪比很低。在此類系統(tǒng)中設(shè)定閾值水平是一項(xiàng)具有挑戰(zhàn)性的工作,而這恰好是電容式觸摸感應(yīng)技巧的一
部分。
圖7 示出了一個(gè)持續(xù)時(shí)間為3 秒的按鈕觸壓操作的理想化原始計(jì)數(shù)波形。針對(duì)本項(xiàng)目的閾值水平示于此圖。噪聲閾值被設(shè)定為10 個(gè)計(jì)數(shù),而手指閾值被設(shè)定為60 個(gè)計(jì)數(shù)。為了清晰地顯示閾值水平,圖8 并未示出始終存在于實(shí)際計(jì)數(shù)數(shù)據(jù)之中的噪聲分量。
評(píng)論