电容式触摸感应的技巧

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 并未示出始终存在于实际计数数据之中的噪声分量。
评论