[转贴]使用MCU普通I/O口实现电容触摸感应方案(RC方式)

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [转贴]使用MCU普通I/O口实现电容触摸感应方案(RC方式)

转自于:

http://blog.sina.com.cn/s/blog_b17c0990010177oz.html

使用MCU普通I/O口实现电容触摸感应方案  

技术背景
现在电子产品中,触摸感应技术日益受到更多关注和应用,不仅美观耐 用,而且较传统机械按键具有更大的灵敏度、稳定性、可靠性,同时可以大幅提高产品的品质。触摸感应解决方案受到越来越多的IC设计厂家的关注,不断有新的 技术和IC面世,国内的公司也纷纷上马类似方案。Cpress公司的CapSense?技术可以说是感应技术的先驱,走在了这一领域的前列,在高端产品中 有广泛应用,MCP推出了mTouch?,AT也推出了QTouch?技术,FSL推出的电场感应技术与MCP的电感触摸也别具特色,甚至ST也有QST 产品。
但是目前所有的触摸解决方案都使用专用IC,因而开发成本高,难度大,而本文介绍的基于RC充电检测 (RC Acquisition)的方案可以在任何MCU上实现,是触摸感应技术领域革命性的突破。首先介绍了RC充电基础原理,以及充电时间的测试及改 进方法,然后详细讨论了基于STM8S单片机实现的硬件、软件设计步骤,注意要点等。
一、RC充电检测基本原理
RC充电检测基本原理是对使用如PCB的电极式电容的充电放电时间进行测量,通过比较在人体接触时产生的微小变化来检测是否有'按下'动作产生,可选用于任何单独或多按键、滚轮、滑条。

 
如图1(a)所示,在RC网络施加周期性充电电压Vin,测量Vout会得到如(b)的时序,通过检测充电开始到Vout到达某一门限值的时间tc的变化,就可以判断出是否有人体接触。图2显示出有人体接触时充电时间会变长。

实现电路如图3,使用一个I/O口对PCB构成的电容充电,另一个I/O口测量电压,对于多个按键时使用同一个I/O口充电。R1通常为几百K到几M,人体与PCB构成的电极电容一般只有几个pF,R2用于降低噪声干扰,通常为10K。

二、充电时间测量方法
对充电时间的测量可以使用MCU中定时器的捕捉功能,对于多个按键一般MCU没有足够的定时器为每个按键分配一个,也可以使用软件计时的方法,这要求能 对MCU的时钟精确计数,并且保证每个周期的时钟个数保持一定。这种情况通常要求对按键使用一个独立的MCU,以保证不被其他任务中断。


为了提高系统的可靠性和稳定性,改进的测量方法是对Vout进行高和低两个门限进行测量。如图4所示,通过对t1和t2的测量,从而达到更可靠的效果。另外,多次测量也是有效的降低高频干扰的有效方法。
实际应用中可以使用数字信号的方式直接测量t1和t2,因为数字信号的'1'和'0'也都有最高与最低输入门限。使用软件查询方式测量,通过固定频率检 测输入脚,其中'0'的个数就是t1,'1'的个数就是t2,实际上就是输入信号上升到VIHmin和下降到VILmax的时间。
三、PCB设计注意事项
不论是单按键、多按键、滑条、滚轮设计,还是混合应用,都可以使用一个I/O进行充电,即可减少资源应用,又可以因使用同一定时标准从而简化软件设计。
用于传递按键信号的线一定要足够的细,以降低线路造成的电容的影响,信号线间距为两倍线宽,不同组的信号间距应保证3mm~5mm。同组的信号线长度应 尽量保持一致,不同组的信号线不可以交叉。独立按键的形状可设计为、圆、三角或正多边形,尺寸以10mm~15mm为宜。滑条的形状可以是长方形或锯齿 形,滚轮可以设计为幅射的扇形或环形,也可以是交错的齿轮,每个部分之间应保持0.2~0.5mm。按键PCB层不应该覆铜,否则会影响感觉的灵敏度,而 反面可以覆铜,可以减少干扰。

按键除设计为单通道模式,还可以设计为多通道模式,通过对附近按键的感应信号强度判断手指的位置,甚至可设计出'连续'的滑动效果。
LED经常在感应设计中用来指示按键是否有效按下,注意按键的地或电源线就尽量短,线路较长时宜增加1nF的滤波电容。
另外,建议电源电路使用线性电源而不是开关电源,这对提高感应灵敏度很重要。
四、软件设计流程
ST公司设计了完整的基于RC充电检测的电容式感应触摸方案的完整设计,包括PCB和完整的源程序,以及基于STM8S的标准触摸感应库 (Touch Sense Library:TSL)和应用API接口,采用易于移植的C设计,用户可以方便地应用于其他任何MCU系统中。因为RC充电 理论涉及的专利已经对公众开放,所以完全没有专利的限制。
图7是ST的触摸感应设计库TSL的架构示意。

ST的TSL内容包括滤波和校正算法,环境变化系统,自动根据环境温度、湿度、电压、灰尘等因素调整配置参数。提供了包括单通道和多通道的感应设计 API函数,层次驱动的项目工程。基于STM8Sxxx-TS1-EVAL演示板的软件在STVD开发平台下设计,使用COSMIC-C语言编译器,包括 完整的源代码,篇幅有限,不能详述。
结论:通过实验,我们使用STM8S的触摸感觉按键与CY的CAPSENSE触摸按键的效果进行了对比,结果证明二者在灵敏度与可靠性方面不相上下,在水浸、增加覆盖物情况下,本方案适应性更佳。

AVR单片机RC触摸  

RC电容触摸感应按键
1:RC感应原理
RC采样原理就是通过测量感应极电容的微小变化,来感知人体对电容式感应器(按键、轮键或者滑条)的感应。电极电容(C)通过一个固定的电阻(R)周期性地充放电。

(原文件名:image001.png)
固定电压施加在VIN,VOUT的电压随着电容值的变化而相应增加或者降低, 如图2所示。

(原文件名:image002.png)
通过计算VOUT的电压达到阀值VTH所需要的充电时间(tC),来得到电容值(C)。
在触摸感应应用中,电容值(C)由两部分组成:固定电容(电极电容,CX)和当人手接触或者靠近电极时,由人手带来的电容(感应电容,CT)。电极电容应该尽可能的小,以保证检测到人手触摸。因为通常人手触摸与否,带来的电容变化一般就是几个pF(通常5pF)。
利用该原理,就可以检测到手指是否触摸了电极。

(原文件名:image003.jpg)
2:硬件实现
图 4显示了一个实现的实例。由R1,R2以及电容电极(CX)和手指电容(CT)并联的电容(大约5pF)形成一个RC网络,通过对该RC网络充放电时间的 测量,可以检测到人手的触摸。 所有电极共用一个"负载I/O"引脚。电阻R1和R2尽量靠近MCU放置。电电R1(阻值在几百千欧到几兆欧之间)是主要电电阻,用于调节触摸检测的灵敏 度。电阻R2(10K?)是可选的,用于减少对噪声影响。

(原文件名:image004.jpg)
3:充放电时间测量原理
为了保证健壮的电容触摸感应的应用,充电时间的测量需要足够的精确。通常有两种方式来测量充电时间:
1.  第一种方法是采用输入捕获(IC)定时器,当电压达到阀值时,触发定时器开始工作。该方案中时间测量的精确度直接取决于定时器计数器的频率。但是,由于每个电极都需要一个输入捕获通道,普通的MCU就不适合这种类型的电容感应应用了。
2.  第 二种方法采用一个简单的定时器(无需IC功能)和一系列简单的软件操作,即定时地检查感应I/O端口上的电压是否达到阀值。这样的话,时间测量的精确度就 取决于执行一次完整软件查询需要的CPU周期数。这种测量方法会由于多次测量带来一些抖动,但是由于没有硬件限制,这种方法适用于需要很多电极的场合。
第二种方法修改一下,使用自适应的软件序列,就可以在测量时间时获得和CPU频率(fCPU)一样的精度。
目前ST触摸感应采用第二种方法。
使用普通定时器进行充电时间的测量。对电容充电开始之前,定时器的计数器数值被记录下来。当采样I/O端口上的电压达到某个阀值(VTH)时,再次记录定时器计数器的值。二者之差就是充电或者放电的时间。

(原文件名:image05.jpg)
为了提高在电压和温度变动情况下的稳定性,对电极会进行连续两次的测量:第一次测量对电容的充电时间,直到输入电压升至VIH。第二次测量电容的放电时间,直到输入电压降至VIL。下图以及以下的表格详细说明了对感应电极(感应I/O)和负载I/O引脚上的操作流程。

(原文件名:image06.jpg)
4:电容充放电测量步骤
由于是测量整个充电和放电为一个过程,因此在电容充电开始时候计时器开始计数,在电容放电完成时候才停止计数,同时保存计数值

(原文件名:biao1.jpg)
以上文字基本摘录至ST文献
5:数据处理
a:采样
由于我们在判断的时候是要花3个周期(while(PIND_X);),但是我们的计数器是1个周期的,这样判断采样值就会有误差。
举例说,在充电过程中比如在T=49点上好是VIH到达点。会出现以下三种情况:

(原文件名:调整大小 图形1.jpg)
1:在前一个判断点在46时间点上,刚好可以在49时间点判断采样到VIH
2:在前一个判断点在47时间点上,只能在50时间点判断采样到VIH,相差1个字
3:在前一个判断点在48时间点上,只能在51时间点判断采样到VIH,相差2个字
我们当然希望每次都是情况1出现,但是不可能啊!
采用软件方法测量3次,在3次中我们假设49,50,51点各出现一次。
第1次  49                        第2次 50                        第3次 51
第1次49                第2次 50-1=49                        第3次 51-2=49
但是我们怎么知道哪次测量是49或者50或者51呢?很简单我们每次测量比前一次延时1个周期,连续测量3次,这样就基本理论上跨越了3种可能出现的情况。但是如果三次都是一样的值,那就只有埋怨老天怨天了。
我们测量的是整个充放电过程,所以理论上要跨越3*3=9个延迟周期,同时我们还顺便把跨越的这9次测量当做1组多点测量的平均数据。
B手指同步
我们的程序一般都是采样多点,然后求平均。问题就出在这里,比如程序判断9个点,在前6个点手指没有触摸,后3个点手指按触摸,这样求出的平均值就偏小,和手指远离按键的效果一样了。特别是平均点越多越是会出现这样的问题。
因 此要求判断和手指触摸同步。比如程序判断9个点,在前3个点手指没有触摸,后三个点手指触摸,我们判断到第4个点有手指,从4-13扫描9个点。这样就包 含了手指的同步状态。当然有人说要是我在第7个点把手移开了不就变成后面几点没有按键吗?开玩笑的,CPU的速度那么快,也许CPU扫描完成9个点然后再 出去转悠一圈回来,你的手指状态还没有来的及改变呢。
当然然我们也可以采用连续扫描两次9个点,如果两次值相差在一定范围内,说明手指状态一样。笔者还是采用该种办法,虽说CPU速度快,但我怕他出去溜达的时候给什么大姨妈缠住不回来就惨了。
C:按键判别
经过以上处理假如我们得到触摸值为80,没有触摸时候的值是60,取一个按键开启值70,只要按键值大于70就表示有触摸。但是不是只要触摸值小于70就表示没有按键呢?当然不是,手指毕竟是抖动的,一会大于70,一会儿小于70。按键就抖动了。
我们采用一个按键释放值63,这样当触摸值大于70按键开启,一直到触摸值小于63才表示按键释放,就消除了按键抖动。
当然我们实际没有必要知道每次按键的扫描值,只要给每个通道设置一个差值,让CPU自己去做触摸值和基本值之间的差值比较就可以了。如差值大于10按键开启,差值小于3按键释放。
D:按键抑制和校准
按键抑制:我们把没有触摸时候的电容充放电值扫描纪录下来保存为基本按键值。然后把以后扫描道的触摸电容充放电值和基本值比较,在所有通道中差值最大那一组才开启。起到相邻按键抑制作用。不过笔者认为该功能真的作用不大,有时候还会起反作用。
按键校准:该步骤很重要,由于环境温度,电压等造成基本电容变大,这样如果不重新校准基本值的话,差值很小,会造成灵敏度降低,甚至检测不到按键。校准其实很简单,采用1个定时器,在2秒钟内如果没有检测到触摸状态就重新扫描保存基本值。
好了就这样基本上RC电容按键就完成了。
写在这里,不得不说一下,笔者用AT2313编译过6键的RC触摸按键,稳定性还是不错的,不过在实验室,为什么不在恶劣的环境下试验呢?
下面说一下RC电容感应的缺点,不谈优点,笔者认为基本没有。
1)        要求CPU速度要快,一般8M以上
2)        容易受干扰,输入检测是高阻态嘛
3)        该方法检测的手指电容变换不大(灵敏度和干扰相克,同时电容的穿透感应最强是在充放电的瞬间,而不是整个过程,RC原理恰恰是运用的整个过程)
4)        软件处理麻烦
建议玩玩,或者用在搞死人不偿命的设备上还是可以的,比如小玩具,手机等。严禁用在工业产品上啊。
笔者用2313做过RC电容感应按键6个,模仿ST的
PD1作为公共脚
PA1  PA0  PD2  PD3  PD4  PD5做K0-K5 6个按键
PB4  PB3  PB2  PB1  PB0  PD6接发光二极管来反映状态
本来还留有I2C口的,由于感觉该方案实在不能用于工业,所以就到此为止。(以后会提供工业上的触摸方案)
下面提供该方案的hex文件。和原代码供大家玩玩。
(顺便说一句,本人源代码写的垃圾,只供参考,还有用WINAVR编写的话,代码够呛,现在才发现AVR的代码空间好小哟,真的有点限制AVR单片机的发展啊)

采用Atmel QTouch技术的电容式触摸屏系统解决方案  

触摸屏广泛应用于我们日常生活各个领域,如手机、媒体播放器、导航系统、数码相机、数码相机、数码相框、PDA、游戏设备、显示器、电器控制、医疗设备等等。

  通用的触摸屏技术包括适用于移动设备和消费电子产品的电阻式触摸屏和投射电容式(projected capacitive)触摸屏以及用于其他应用的表面电容式(surface capacitive)触摸屏、表面声波(SAW)触摸屏和红外线触摸屏。

电阻式触摸屏

   应用比较多的电阻式触摸屏(图1)具有空气间隙和间隔层的两层ITO(Indium Tin Oxide,铟锡氧化物)。电阻式触摸屏是大批量应用、经过验证、低成本的技术。其缺点是:薄弱的机械性能;堆叠厚,相对较为复杂;不能检测多个手指的动 作;前面板实现方案易损坏;有限的工业设计选项;光学性能不良;需要用户校准。

 

图1 电阻式触摸屏

投射电容式触摸屏

   触摸屏的电容触摸控制采用一个用传导物质(如ITO)做涂层的表面来存储电荷。传导物质沿屏的X轴和Y轴传导电流。当传导(如手指)触摸时控制电场发生 变化,而且可以确定沿水平轴和垂直轴触摸的位置。在带按键触摸位置的应用中,把分立的传感器放置在特定按键位置的下面,当传感器的电场被干扰时系统记录触 摸和位置。投射电容式触摸屏示于图2。

 

 

图2 投射电容式触摸屏

  投射电容式触摸屏比其他触摸屏技术的优势是:

  ·出色的信噪比;

  ·整个触摸屏表面具有高精度;

  ·能够支持多个触摸;

  ·通过"厚的"电介质材料进行感应;

  ·无需用户校准。

QTouch技术

   QTouch技术是Atmel触摸技术部前身Quantum(量研科技)的专利。所开发的集成电路技术是基于电荷——传输电容式感测。QTouch IC检测用传感器芯片和简单按键电极之间单连接来检测触摸(图3)。QTouch器件对未知电容的感测电极充电到已知电位。电极通常是印刷电路板上的一块 铜区域。在1个或多个电荷——传输周期后测量电荷,就可以确定感测板的电容。在触摸表面按手指,导致在该点影响电荷流的外部电容。这做为一个触摸记录。也 可确定QTouch微控制器来检测手指的接近度,而不是绝对触摸。判断逻辑中的信号处理使QTouch健全和可靠。可以消除静电脉冲或瞬时无意识触摸或接近引起的假触发。

 

 

图3 Qtouch技术示意图

  QTouch传感器可以驱动单按键或多按键。在用多按键时,可以为每个按键设置1个单独的灵敏电平。可以用不同大小和形状的按键来满足功能和审美要求。

  QTouch技术可以采用两种模式:正常或"触摸"模式和高灵敏度或"接近"模式。用高灵敏电荷传输接近感测来检测末端用户接近的手指,用用户接口中断电子设备或电气装置来启动系统功能。

  为了优异的电磁兼容,QTouch传感器采用扩频调制和稀疏、随机充电脉冲(脉冲之间具有长延迟)。单个脉冲可以比内部串脉冲间隔短5%或更短。这种方法的优点是较低的交叉传感器干扰,降低了RF辐射和极化率,以及低功耗。

  QTouch器件对于慢变化(由于老化或环境条件改变)具有自动漂移补偿。这些器件具有几十的动态范围,它们不需要线圈、振荡器、RF元件、专门缆线、RC网络或大量的分立元件。QTouch做为一个工程方案,它是简单、耐用、精巧的方案。

   在几个触摸按键互相靠近时,接近的手指会导致多个按键的电容变化。Atmel专利的邻键抑制(AKS)采用迭代技术重复测量每个按键上的电容变化,比较 结果和确定哪个按键是用户想要的。AKS抑制或忽略来自所有其他按键的信号,提供所选择按键的信号。这可防止对邻键的假触摸检测。

触摸屏系统设计

  一个触摸屏系统包括:前面板、传感器薄膜、显示单元、控制器板和集成支持(图4)。

 

图4 触摸屏系统

  Atmel公司提供触摸控制器IC、控制电路板参考设计、传感器参考设计、集成支持和传感器测试设备设计,而合作伙伴提供传感器薄、传感器和前面板的集成和控制器电路板。

   Atmel提供用于1至10个按键和/或滑块/滑轮的器件——QTouch系列;用于多达48个按键和/或滑块/滑轮的器件——QMatrix系列;用 于Single Touch和Two Touch触摸屏的器件QFild和QTwo系列。其中采用QT5320/5480器件的简易系统示于图5,触摸屏、滑块、滑轮和/或按键可由主机通过 I2C兼容接口进行选择。

 

图5 触摸屏简易系统

 

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [转贴]使用MCU普通I/O口实现电容触摸感应方案(RC方式)

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: