1、电容式触摸简介

ME32F030系列芯片的电容触摸功能可以测量多达22个引脚的电容,通过改变一个RC振荡电路的频率,可以检测到手指触摸引起的电容C的变化,从而实现电容触摸按键。RC在芯片中有四个档位,可以通过软件选择,从而实现一个基频从350k/600k/1.4m/3.6m,在ME32F030封装下,RC还可以使用外接电阻,用户可以随意调节基频。基本原理如下:

图1基本示意图

支持多达22个电容式触摸键。

RC振荡计数频率和单位时间可配置,最大限度满足不同的应用需求。

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

触摸键相关引脚的映射关系如下:

图2引脚映射

2、应用程序设计模式

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

1.使用内阻改变基频

触摸按键模块结合了四种电阻来产生四种不同的频率,以满足大多数应用的需要。用户可以选择最适合应用的频率。通过这种选择,用户可以只通过软件解决EMI、灵敏度等问题。

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

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

fOSC=1/(1.386RCSENSOR)

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

长周期计数时间,用户可以得到相对准确的触摸检测。但它也会降低应用程序的速度对手指按键的反应。选择合适的检测时间是实现良好用户触摸体验的关键。

例如,在大多数情况下,300ms的响应时间是一个很好的用户体验。如果应用使用四个触摸键,最长的频率计数周期时间可以是300ms/4=85ms。根据外设时钟PCLK等于20MHz,寄存器SENSTM的值应配置为20000*85=1700000。

4.使用阈值寄存器判断触摸状态。

在一些没有干扰、触摸键电容一致的应用中,用户可以使用阈值寄存器来设置手指触摸的极限,这样可以最大限度地减少CPU时间,简化应用程序。

3、触摸应用功能

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

让先做一个应用例程,然后按照标准例程的应用步骤来讲解库函数的使用。历史的源代码如下。

externatouchitouch;//触摸信息结构itouch

intmain(void)

{

uint16 _ tupdatefreq=0xfff

PA _ 12 _ INIT(PA _ 12 _ touch 5);//PA12引脚复用到TOUCH5引脚。

itouch _ init(touch 5);//初始化TOUCH5引脚

GPIO_ConfigPinsAsOutput(PB,IO _ pin 9);//PB9设置为输出方向。

GPIO_SetPin(PB,IO _ pin 9);////PB9设置为输出高电平。

while(1)

{

如果(!Updatefreq)//倒数到0后,更新触摸电容参考。

{

updatefreq=0xfff//计数复位

itouch _ update();//更新触摸电容参考

}

//检查是否按下了触摸键。

if(itouch.status)

updatefreq=0xfff//计数复位

其他

update freq-;//计数递减。

//确定触摸键出现的引脚。

if(itouch.statusTOUCH5)

GPIO_ResetPin(PB,IO _ pin 9);//灯亮了

其他

GPIO_SetPin(PB,IO _ pin 9);//灯灭了

}

}

首先,让我们来谈谈touch结构,它在touchme.h的头文件中定义,包含了所有的触摸。

和信息参数,基本都是后面库函数用的,开发者直接用这个结构就可以了。(我不我不太了解这个结构的参数的详细配置。有兴趣的开发者有兴趣的话,建议多向原厂技术人员学习。).

、PA _ 12 _ INIT(PA _ 12 _ touch 5);使用前重复使用IO口作为触摸功能。

、itouch _ init(touch 5);调用TOUCHme.c中的库函数初始化触控功能。这个库函数只需要我们把需要启用的touch pin作为参数传递给函数。库来帮助我们做详细的初始化工作。

在While(1)循环中进行倒计时。当定时器递减到0时,调用touchme.c文件中的库函数itouch_update()更新触摸电容基准。

当触摸键被按下时,touchme.c中有一个voidTOUCH_IRQHandler(void)中断服务程序,用于通过硬件中断实时监控触摸状态。当检测到触摸键被按下时,对应于状态变量itouch.status的位置将被设置为1。

实时监控硬件中断,简化了主函数while(1)中的函数流程。我们只需要做出if(itouch.statusTOUCH5)来判断对应的按键是否被按下,然后根据状态进行相应的操作。这里,钥匙点亮了一盏小灯,用于演示。

从上面的过程可以看出,我们接触最多的是touchme.c文件中的函数,这些函数有助于参数配置和模式的初始化过程。touch.c文件中的函数是实际操作底层寄存器的函数。开发人员可以通过模拟了解更多详细的底层操作。

4、下载验证

程序编译正确后,即可下载模拟测试。下载程序后,单击全速运行。这里为了演示方便,还是采用直观的照明方式。(有兴趣的开发者可以做一个按键触摸门铃之类的小应用。)

当我们不触摸该键,开发板上的小灯将熄灭,如图所示:

图3未触摸按键的状态

接下来触摸开发板左上角的触摸面板,会看到LED亮了,然后又灭了。

图4按键触摸状态编辑器:CC