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文件。
我们先做一个应用例程,然后我们顺着标准例程的应用步骤,对库函数的使用做解释说明。历程的源代码如下。
extern touch itouch;//触摸信息结构体itouchint main(void) { uint16_t updatefreq=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); //灯灭 } }
复制代码信息和参数,后面的库函数基本都有用到它,而开发者直接使用这个结构体就可以了。(笔者对这个结构体参数的详细配置也不是很掌握,如果有感兴趣的开发者,还是建议向原厂的技术人员做详细的了解)。
①、PA_12_INIT(PA_12_TOUCH5);使用前先将IO口复用为TOUCH功能。
②、itouch_init(TOUCH5); 调用touchme.c中的库函数来初始化TOUCH功能,这个库函数只用我们把需要使能的触摸引脚,作为参数传递给函数即可。库函数来帮我们做详细的初始化工作。
③、While(1)循环中做了一个倒计时,当计时自减为0时,调用touchme.c文件中的库函数itouch_update()来更新触摸电容基准。
④、当有触摸按键按下时在touchme.c中有void TOUCH_IRQHandler(void)中断服务程序,它来进行硬件中断实时监测触摸状态,当检测到有触摸按键按下后,会将状态变量itouch.status相对应的位置1。
⑤、有硬件中断的实时监测,这就简化了主函数while(1)内的函数流程,我们只需要进行if (itouch.status&TOUCH5)来判断下对应按键是否按下,根据状态来执行相应的操作即可,这里是通过按键点亮小灯来做示范。
从上面流程可以看出,我们接触最多的还是touchme.c文件中的函数,它来帮助参数配置和模式的初始化流程。而真正进行底层寄存器操作的还是touch.c文件中的函数。开发者可以通过仿真来更加实际的了解详细的底层操作。
4、下载验证
程序编译无误后,便可以下载仿真测试。程序下载完成后,点击全速运行即可。在这里为了方便演示,所以还是采用直观的点灯方式。(有兴趣的开发者,可以做个按键触摸门铃之类的小应用。)
当我们没有去触摸按键的时候,开发板上的小灯会处于熄灭状态,如图所示:
图3 按键未触摸状态
接下来触摸下开发板左上角的触摸板,会观察到LED点亮,松手后又继续熄灭。
图4 按键触摸状态
来源:老马识途单片机