基于单片机的触摸软件处理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2008MicrochipTechnologyInc.DS01103A_CN第1页AN1103介绍本应用笔记说明了使用电容触摸传感来检测按钮按压的各种方法。我们假定读者已掌握了触摸传感的基本知识并且建议在阅读本应用笔记之前,请先阅读AN1101《电容触摸传感简介》,以便理解硬件知识。目前市场上的一些电容触摸传感解决方案,提供的仅仅是“黑盒子”式的解决方案,你购买的是一块IC,IC发出信号表明是否有按钮按下,但可配置性有限。而Microchip的解决方案提供了昀大限度的灵活性,这是因为检测按钮按下的软件程序可以完全由用户编写。这并不是说用户必须开发自己的软件程序,Microchip有提供电容触摸传感程序,您马上就可以用在您的解决方案中。软件介绍所有的检测方法的工作基本原理都相同,将测量值与频率计数的滑动平均值进行比较,频率计数值下降就表明有按钮按下。扫描按钮的基本物理过程是要设置对电容变化敏感的振荡器,在按钮焊盘上以固定的时钟周期振荡。在固定周期之后,测量频率并检查与正常情况是否相同。然后,将振荡器移向下一个按钮焊盘并进行扫描。对众多按钮的扫描皆按顺序依次完成。用户必须创建两段主要代码。图1的流程图给出了电容触摸传感程序的基本流程。电容触摸传感代码的第一段是“电容的初始化”,初始化工作包括使能振荡器、设定端口引脚方向以及所有相应的初始化设置。第二段重要代码包含一系列程序处理代码块,称作“CapISR”,它们是在中断时(T0IF标志位位置位的话)将执行的代码块。这些代码块的功能是判断某个按钮是否按下,并且依次扫描所有的按钮。在后面的段落中将详细描述这些重要的代码块。初始化首先,必须恰当地对硬件进行初始化。如何正确地设置PIC16F88X系列器件,详见附录A:“PIC16F88X系列的寄存器设置”。不同系列的器件可能在寄存器设置值上有细微差别,但关键位和信号通道的设置都是相同的。因此如果使用其他系列的器件,寄存器存在差异的话,附录A:“PIC16F88X系列的寄存器设置”可作为设置寄存器位时的指导。以下是一个简短的清单,以确保一切都设置妥当:•引脚方向和模拟/数字选择•振荡器信号通道使能•使能定时器和设置Timer0预分频数•使能中断中断服务电容触摸传感是基于中断的,Timer0发生中断,置位标志位T0IF。中断服务程序(InterruptServiceRoutine,ISR)首先要检查中断标志是Timer0中断还是其他中断。如果是Timer0中断,那么必须提供电容触摸传感的中断响应服务。如果是其他中断,则ISR是由相应中断向量指向的程序,ISR响应该中断服务,但在中断程序结束时必须确认Timer0在ISR执行期间是否翻转。如果Timer0翻转了,那么T0IF标志位会被置位,但它代表的采样将被认为是失败采样,然后应清零T0IF标志位,并重新启动定时器,进行另一次采样。采样失败是因为基于Timer0的固定测量周期,如果不在中断时立刻响应那么之后情况可能会发生变化。下面各小节将依次对流程图中ISR的各程序段进行说明,首先是“读TMR1”。中断服务:进行一次读操作扫描刚好完成时,为了获得当前传感器的读数,就必须读取Timer1的值。需要一个无符号整型变量来储存原始值。获得读数的代码如例1所示:例1:读取频率作者:TomPermeMicrochipTechnologyInc.unsignedintvalue;value=TMR1L+(unsignedint)(TMR1H8);电容触摸传感的软件处理AN1103DS01103A_CN第2页2008MicrochipTechnologyInc.变量value的结果将是当前传感器的读数,当前传感器是在上一次电容触摸传感服务程序执行时设置为即将扫描的传感器。随即变量value的值将会与16个点的平均值进行比较,以确定频率计数是否有显著下降。图1:软件流程MainLoop中断T0IF==1?否是,执行电容触摸传感程序否ISR结束CapISRT0IF==1?是电容的初始化使能中断GIE=1主循环代码读TMR1确定按钮是否按下新的值设置下一个传感器重启定时器清零T0IF标志位丢弃所读数据,重新启动定时器调用其他外设中断服务2008MicrochipTechnologyInc.DS01103A_CN第3页AN1103中断服务:确定按钮是否按下本节将介绍一种非常简单的按钮按下检测算法,如例2所示。例2:简单的按钮检测变量trip存放用来衡量频率与平均值的差值,要判断按钮已按下,则raw下降的幅度必须至少是这一值。举个简单的例子,如果滑动平均值是9000,而trip设为800,那么在一个按钮被认为是按下之前,raw必须降为8200。所有的检测方法,其工作的基本原理都相同,将测量值与频率计数的滑动平均值进行比较,频率计数值下降表明有按钮按下。其他更为复杂方法详见“按钮检测算法”一节,其中还包括若干细节资料和可能需要的补偿。中断服务:求平均值对当前所读的数据求平均值是相当简单的一步。为了使平均算法更有效率,程序并不存储16个变量来做16点平均。而是对当前读取值取1/16的加权,而滑动平均值取15/16的加权。计算16点平均值的代码如例3所示,数组下标代表按钮的编号。例3:计算平均值求N点平均时,N取2的幂可以节省处理时间,因为右移可以取代软件除法。如果使用汇编的话,应该使用右移指令,但在使用像HI-TECHPICC™这样的智能C编译器时,编译器会识别出除数是2的情形,从而使用右移指令。中断服务:准备下一个要扫描的传感器一旦程序完成Timer0中断服务响应,就应设定下一个要检测的传感器。这包括设定index指向下个传感器以及为比较器输入设定适当的连接。1.设定index。2.设置比较器输入通道。3.(可选的)设定外部多路复用线选控制。index变量增一并在恰当的时候翻转归零。这是假设用了一个平均值数组来保存所有按钮的平均值。在例4中,假设使用了四个按钮,因为具有SR锁存的PIC®器件的标准按钮数量是四个。例4:INDEX顺序循环然后使用预定义的常量来配置比较器输入。这些常量都源自于正确的CM1CON0和CM2CON0寄存器设置。它们存放的是正确的信号设置,并在CMxCON01:0位上有不同的值对应内部多路复用器通道,这样可以确定使用的是哪个比较器的负输入端(C12INx-)。预定义的常量如例5所示:例5:预定义常量必须根据index变量把比较器的寄存器设置为下例所示常量之一。当使用某器件的四个固有按钮时,按钮的序号直接映射成比较器输入通道。例6:按钮下标的映射然而在处理多个按钮时需要小心地根据所扫描按钮的下标来正确设置比较器的输入通道。当采用外部MUX大量扩展按钮数量时这一点很重要,因为此时下标和它代表的比较器输入通道不再直接相关。关于这个问题的更多详细信息,请参阅AN1104《配置多个电容触摸传感按钮》。if(rawaverage-trip))//按钮按下else//按钮未按下average[index]=average[index]+\(raw–average[index])/16;注:当使用2的幂时,与(AND)运算可以简单地把2n–1翻转到零。对4个按钮的代码是:index=(++index)&0x03;if(index3)index++;elseindex=0;//C12INx-0123COMP1[4]={0x94,0x95,0x96,0x97};COMP2[4]={0xA0,0xA1,0xA2,0xA3};CM1CON0=COMP1[index];CM2CON0=COMP2[index];AN1103DS01103A_CN第4页2008MicrochipTechnologyInc.中断服务:重启定时器和清零T0IF标志位为了保持连续读数,Timer0和Timer1在每次读数据开始前都要清零。置位TMR1ON来重新使能Timer1。昀后,必须清零T0IF中断标志位,否则程序会立即返回到中断服务程序中。例7:中断服务此时下一个传感器已准备好,在下一次Timer0引发中断时,电容触摸传感服务程序将会再次运行,完成对该传感器的扫描。扫描速率现在将依次扫描每个按钮。此时的问题是:“扫描需要多久?”单个按钮的扫描速率主要是由以下公式确定:公式1:这是Timer0翻转归零并产生溢出中断所需要的时间。三个主要的参数是Timer0溢出的计数数值(256)、每条指令的指令周期(4xTOSC)和Timer0预分频数(PS)。如果预分频为1:4,则PS值就是4。这是理想情况下的公式,因为它假定不存在任何额外的时间损失。例如,当使用计算密集的方法(如下文所述的百分比方法)时,将添加额外的时间开销。按钮检测算法在编写固件之前要创建一个良好的系统,首先要做的就是要使检测更为容易,通过使用寄生电容小的传感器从而能够检测到较大的电容变化。这将使系统功能更容易实现并减少开发时间。对合理的系统而言,即使是非常小的变化也能被检测到。能够控制如何去检测出变化量是衡量应用系统表现的一个很好的观察点。我们所期望的系统是具有简单的按钮并能在一定距离内感应到人的触摸。Microchip已经开发了几项软件技术,能够透过窗户玻璃、Plexiglas®或其他绝缘材料表面检测到按钮按下。正如介绍中所述,算法总是要用到求平均值并且通常而言放慢求平均值的速度是有益的,因为微处理器能在手指靠近焊盘尚未接触之前就完成求平均值计算,这样的话按钮按下永远不能被检测到。放慢求平均值的速度可以在中断服务程序完成,比如可以每两次采样求一次平均值,或者每四次采样求一次平均值。做法是在每次按钮切换后,如果if语句判断通过,表明有按钮按下,但若还不到采样次数,就不进行计算而是继续检测。三种按钮检测算法是:•方法1:直接判断,固定滞后量•方法2:百分比判断•方法3:一次计算一个百分数,不断求平均方法1:直接判断,固定滞后量考虑到执行周期和直接处理raw值,这种按钮检测算法是昀快的。它依赖于三个关键因素:慢速计算平均值、在每次平均值计算停止之外提供一个小的滞后量以及找到并设置一个恰当的trip阈值。必须根据试验来找到恰当的阈值,不过对于已给定的系统,阈值变化不大。Microchip提供了mTouch诊断工具来辅助分析您的电容触摸传感系统。使用PICkit™串行分析器,诊断工具可以通过I2C™接口与系统进行通信,它还能显示实时数据来描述系统特征。由于显示更加直观,这将更有助于理解电容触摸传感系统的运行情况。为了确定trip阈值和可接受的滞后量,下面使用mTouch诊断工具的练习将演示如何为Microchip演示板挑选恰当的数值。图2显示传感器6有手指按在按钮上。接近16,400的金黄色条是平均值,位于16,000刻度下面一点的红色条是当前的raw值。尽管没有在诊断工具上表示出来,但平均值已停止跟踪raw值,因为它已经超过了trip阈值。传感器2和3上的蓝色和绿色条是信息条,用户可以通过设置它们来改变trip阈值的显示刻度,从而看得更清楚(设置信息条不会对单片机进行数据读写)。TMR1L=0;TMR1H=0;TMR1ON=1;TMR0=0;T0IF=0;TSCAN=256x(4xTOSC)xPS2008MicrochipTechnologyInc.DS01103A_CN第5页AN1103图2:mTouch诊断工具截图现在对于正在测试的系统,传感器6有一个正常的、未被按下的平均值,大约是Average=16397。这个值可以在图下方读到。按下时的值是Raw=15936,与平均值的差值是461。因此,恰当的trip阈值应该是差值的80%,大致为370。选择:trip=370若将trip准确地设为461,那么对于环境变化或未知变化就没有留下任何容许误差,这可能导致无法产生按压的判断。而trip设置得太小,将使得系统极为敏感,可能在实际接触按钮之前就认为按钮已经按下。如果设定过于敏感,也可能无意中触发相邻的按钮。现在只剩下一个重要问题的选择了,即提供多大滞后量。

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功