Qtouch技术是Atmel发明的,比较常见的就是电磁炉上的触摸按键。如下图所示。
只要手指靠近上面那些感应区域,就可以触发某种功能了,相当于实体的按键一样。
如果你用万用表是测上面那些区域,是绝缘的。
1、那么它是如何实现感应的呢?答:利用电场。
给上图中方框的闭合导体(这个导体就是感应器)施加电压,那么在导体四周会形成电场,手指靠近这个电场,就会影响到电场的分布,从而使得这个导体的分布电容发生变化。
上图中,感应器在顶层,而底层是没有地平面的,这样的设计灵敏度是非常高的,如果不想它灵敏度那么高,可以在底层铺层地。但是不能铺实习的地平面,因为那样感应器和地平面之间会产生较大的寄生电容,从而影响了感应器的灵敏度。所以只能用50%~75%的网格铺铜。
由上图可以很明显地看到手指如何干涉感应器的电场。
如果你还不能理解这个现象的话,可以用手捉住收音机的天线,看看收音机是不是受到干扰。
此外,用这样的感应方式的话,两个感应器之间的距离不能太近,否则容易受到干扰。
感应区域设置为手指头大小就可以了,一般是个圆圈。
2、如何用单片机测到电场的变化,也就是如何测到感应器的分布电容?
有两种方法,第一种是充放电。
利用一个IO口,送高低电平,就可以让感应器的分布电容充放电了。
那么先让它充电,再打开定时器计数,再放电,然后一直放电使得分布电容两端的电压,达到外部中断的触发电平(大概是1V左右吧),就让定时器停止计数,利用这个计数值就能大概地推算出分布电容的容值。但是我们其实不需要知道它具体的容值,我们只需要知道定时器的计数值跟容值有个对应关系就可以了。
打个比方,如果没有手指靠近感应器时,计数出来是50;有手指靠近时,计数出来是200,那么就能知道有手指靠近了。我们只需要知道计数出来的差值,关于它是50还是60,200还是220,这都不影响我们的判断。
第二种就是张弛振荡器。这需要单片机内部有比较器,如:MSP430等。
张弛振荡器最经典的就是文氏桥。为什么叫张弛振荡?
张就是张开弓,表示紧张,而弛就是松开弓,表示松懈。那么把电容比喻成弓的话,那么张就充电,而弛就是放电。这就跟第一种方法的原理差不多,关键是这里利用了比较器来构成振荡器。
由上图,可以很清晰地看到,单片机的比较器产生方波,使得电容充放电,如果容值变化,那么比较器输出的方波周期会发生变化。
这就需要两个定时器了,一个用来计数比较器输出的脉冲个数,而另一个则设定为一个阈值时间(类似于频率计的闸门时间)。
比如:定时器1设置阈值时间为10us,而定时器2在容值不变,而且在10us内计数出来是80,而在容值变化时,计数出来是200,那么就可以判断为有手指靠近。
这种方法跟充放电一样,我们只需要知道计数出来的差值,关于它是80还是60,200还是400,这都不影响我们的判断。
显然用张弛振荡的方式要复杂一些。
需要注意的地方:
感应器要设计得合理,尽量让它的容值变化量大一些。
如果用柔性板来设计感应器,那么在组装时,要贴紧面板,不能有气泡。
感应器的分布电容不是固定不变的(在手指没靠近的情况下),它会受到环境的影响,如:温度之类的。所以每隔一段时间,就要校正一下这个容值,大概1分钟校正一次就够了。
你可以用Altium Designer 13里面的Qtouch库(如果没装插件是用不了这个功能的),来设计感应器的形状,具体操作Altium的官网有视频。
旧版本的Altium Designer是没有这个库的。
很多单片机都有现成的触摸按键库,如:AVR,MSP430,STM8等。你可以轻松实现这个很酷的功能,当然Atmel还提供更贴心的开发工具,详情请参见官网。