
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









