电容触摸的工作原理及应用设计方式

电子说

1.2w人已加入

描述

1、电容触摸简介

ME32F030系列芯片的电容触摸功能,可以对多达22管脚的电容进行测量,利用一个RC震荡电路频率的改变来检测手指触摸引起的电容C的变化,从而实现电容触摸按键。其中的RC在芯片内部有4挡可以通过软件选择,从而实现从350K/600K/1.4M/3.6M的一个基本频率。在ME32F030封装下面,RC也可以使用外部电阻,用户可以任意调节基本频率。其基本原理如下图:

电容触摸

图1基本原理图

•支持多达22电容触摸按键

•可配置RC振荡计数频率和单位时间,最大限度去适应不同的应用要求。

•硬件自动扫描,节省CPU资源。

触摸按键相关管脚的映射关系如下表:

电容触摸

图2管脚映射

2、应用设计方式

在简介中介绍到触摸电容是通过测量RC振荡器频率变化,才而判断是否手指触摸到按键。针对不同的应用环境,为提高系统抗干扰能力,增强检测灵敏度,触摸按键模块提供多种方法:

1.利用内部电阻改变基本频率

触摸按键模块通过4种电阻组合,从而产生4种不同频率去满足大多数应用需求。用户可以选择最适合应用的一个频率,通过这个选择,用户可以只通过软件就解决像EMI,灵敏度之类的问题。

2.使用外部电阻改变模块基本频率

在一些特殊情况下,内部电阻产生的频率不足以满足应用要求,ME32F030R8T6还提供了另一个选择外部电阻来产生用户自己的一个频率。当外部电阻被采用时,TOUCH_OUT和TOUCH_IN必须被设定并连接到电阻的两端。该频率可以使用下列公式来估算:

fOSC=1/(1.386×R×CSENSOR)

3.配置频率计数周期时间

采用较长的周期计数时间,用户可以得到相对准确的触摸检测。但是这也会减慢应用对手指按键的反应。选择一个适当的检测时间,是取得一个好的用户触摸体验的关键。

举例:在大多数情况下,300ms的按键反应时间还算是一个不错的用户体验。如应用采用4个触摸按键,那么最长的频率计数周期时间可以是300ms/4=85ms。按外设时钟PCLK等于20MHz计算,寄存器SENSTM值应配置20000*85=1700000。

4.使用门限寄存器判断触摸状态

在一些无干扰,并且触摸按键电容一致性好的应用中,用户可以使用门限寄存器去设置手指触摸的界限,这样可最大限度降低CPU时间和简化应用程序。

3、触摸应用函数

在简化触摸硬件开发的基础上,ME32F030也提供了库函数来降低软件开发门槛,在Lib/common/Drives/source中提供了touch.c和touchme.c两个库函数C文件。

我们先做一个应用例程,然后我们顺着标准例程的应用步骤,对库函数的使用做解释说明。历程的源代码如下。

externtouchitouch;//触摸信息结构体itouch

intmain(void)

{

uint16_tupdatefreq=0xfff;

PA_12_INIT(PA_12_TOUCH5);//PA12引脚复用为TOUCH5引脚

itouch_init(TOUCH5);//初始化TOUCH5引脚

GPIO_ConfigPinsAsOutput(PB,IO_PIN9);//PB9设置为输出方向

GPIO_SetPin(PB,IO_PIN9);////PB9设置为输出高电平

while(1)

{

if(!updatefreq)//减计数至0后,更新触摸电容基准

{

updatefreq=0xfff;//计数重置

itouch_update();//更新触摸电容基准

}

//检查是否有触摸按键按下

if(itouch.status)

updatefreq=0xfff;//计数重置

else

updatefreq--;//计数自减

//判断触摸按键发生的引脚

if(itouch.status&TOUCH5)

GPIO_ResetPin(PB,IO_PIN9);//灯亮

else

GPIO_SetPin(PB,IO_PIN9);//灯灭

}

}

首先我们说下touch结构体,它定义在touchme.h头文件中,它包含了所有的触摸

信息和参数,后面的库函数基本都有用到它,而开发者直接使用这个结构体就可以了。(笔者对这个结构体参数的详细配置也不是很掌握,如果有感兴趣的开发者,还是建议向原厂的技术人员做详细的了解)。

①、PA_12_INIT(PA_12_TOUCH5);使用前先将IO口复用为TOUCH功能。

②、itouch_init(TOUCH5);调用touchme.c中的库函数来初始化TOUCH功能,这个库函数只用我们把需要使能的触摸引脚,作为参数传递给函数即可。库函数来帮我们做详细的初始化工作。

③、While(1)循环中做了一个倒计时,当计时自减为0时,调用touchme.c文件中的库函数itouch_update()来更新触摸电容基准。

④、当有触摸按键按下时在touchme.c中有voidTOUCH_IRQHandler(void)中断服务程序,它来进行硬件中断实时监测触摸状态,当检测到有触摸按键按下后,会将状态变量itouch.status相对应的位置1。

⑤、有硬件中断的实时监测,这就简化了主函数while(1)内的函数流程,我们只需要进行if(itouch.status&TOUCH5)来判断下对应按键是否按下,根据状态来执行相应的操作即可,这里是通过按键点亮小灯来做示范。

从上面流程可以看出,我们接触最多的还是touchme.c文件中的函数,它来帮助参数配置和模式的初始化流程。而真正进行底层寄存器操作的还是touch.c文件中的函数。开发者可以通过仿真来更加实际的了解详细的底层操作。

4、下载验证

程序编译无误后,便可以下载仿真测试。程序下载完成后,点击全速运行即可。在这里为了方便演示,所以还是采用直观的点灯方式。(有兴趣的开发者,可以做个按键触摸门铃之类的小应用。)

当我们没有去触摸按键的时候,开发板上的小灯会处于熄灭状态,如图所示:

图3按键未触摸状态

接下来触摸下开发板左上角的触摸板,会观察到LED点亮,松手后又继续熄灭。

图4按键触摸状态
责任编辑人:CC

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分