电子说
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
全部0条评论
快来发表一下你的评论吧 !