编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

敏矽微电子Cortex-M0学习笔记12-电容触摸按键实例

wxchong 2024-10-19 15:52:43 开源技术 11 ℃ 0 评论



1、电容触摸简介

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


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

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

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

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


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;//触摸信息结构体itouch

int 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);  //灯灭
  }
}

首先我们说下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中有void TOUCH_IRQHandler(void)中断服务程序,它来进行硬件中断实时监测触摸状态,当检测到有触摸按键按下后,会将状态变量itouch.status相对应的位置1。

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

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

4、下载验证

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

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


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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表