kinetis的触摸按键TSI

2024-02-03 16:38
文章标签 按键 触摸 kinetis tsi

本文主要是介绍kinetis的触摸按键TSI,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文来自:http://blog.chinaaet.com/detail/29774.html

使用硬件触摸感应接口之前,我们先看看软件通过GPIO实现触摸的方法:

image

如上图,GPIO接个上接电阻(可用内部的或外部的),PCB上画个触摸盘即可。触摸盘等效于一个对地的电容,手指也等效于一个对地的电容,手指按上时相当于2电容并联,不按时只有一个电容。程序先向IO口写0对电容放电,之后变为输入检测该IO口电平,卡拉电阻对电容充电,当充到阀值(一般为0.7VDD)时程序读到IO口状态为1。

image

从上图可以看出手指按上时电容变大,充电时间变长(图中的t2),不按时的时间短(图中的t1),程序根据此时间的长短判断是否有键按下。

上述方法有2点局限:

1、因元器件参数的离散性及环境因素多变,该方式有时会出现判断错误的情况。2009年笔者在大中电器买的格兰仕电磁炉在农村的一个房子里曾按键不灵,很可能就是用这种方式实现的触摸按键。

2、因是查询方式,程序必须不断查询触摸情况,不能进入低功耗模式。

为方便使用,kinetis内置触摸感应接口TSI,可以在主振荡器停振的时候继续工作。其框图如下:

image

因是硬件的TSI,对电容的充放电是由电流源来完成的,充放电是三角波而不是RC充放电式的指数波。如下图:

 

image

TSI有2路上述振荡器,一路是基于内部电容的(下图蓝线),其周期固定;一路是基于外部触摸盘电容的(下图黑线),其周期随是否有手指触摸变化。系统就是根据固定个数黑线周期有多少个蓝线周期的计数来识别触摸情况的。

image

 

下面看下几个寄存器:

TSIx_GENCS-通用控制和状态寄存器,各位含义如下:

image

TSIx_SCANC-扫描控制寄存器,各位含义如下:

image

TSIx_PEN-引脚使能寄存器,第19~16位选择低功耗模式下扫描的引脚,第15~0位控制相应通道的使能。

TSIx_WUCNTR-唤醒通道计数寄存器。

TSIx_CNTRn-通道n计数寄存器,高16位是通道n计数值,低16位是通道n-1计数值,n=1,3,5……15。

TSIx_THRESHOLD-通道n 阈值寄存器,高16位是高阀值,低16位是低阀值。当扫描得到的相应通道的计数值>高阀值或<低阀值时,就是超出范围,如果使能了超出范围中断,将产生TSI中断。(悲剧的是V2版的参考手册取消了STATUS寄存器,进中断后没有相应的标识位来判断是哪个脚产生的)

下面例程是用TSI0_CH0和TSI0_CH13做触摸按键,在扫描完成中断服务程序中读相应的计数寄存器,来判断哪个键被按下。下面是完整代码:

/*
* main implementation: use this 'C' sample to create your own application
*
*/

#include <stdio.h>

#include "derivative.h" /* include peripheral declarations */

void InitTSI()
{
    SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK;//打开PORTB、C时钟
    PORTB_PCR0 = 0;//PTB0用作TSI
    PORTC_PCR0 = 0;//PTC0用作TSI
    SIM_SCGC5 |= (SIM_SCGC5_TSI_MASK);//打开TSI模块时钟
    //设定TSI的工作参数,使能TSI中断,软件触发扫描
    TSI0_GENCS |= ((TSI_GENCS_NSCN(10))      //对每个TSI电极扫描次数的设定,此处设为10次
                  |(TSI_GENCS_PS(3)))      //对扫描频率的预分频设定,此处设为2^3
                  |(TSI_GENCS_TSIIE_MASK) //使能TSI中断
                  |(TSI_GENCS_ESOR_MASK)//扫描结束中断
                  |uq(TSI_GENCS_STM_MASK);     
    TSI0_SCANC |= ((TSI_SCANC_EXTCHRG(3))    //外部振荡器充电电流选择设定,此处设为4uA
                  |(TSI_SCANC_REFCHRG(31))   //参考时钟充电电路选择设定,此处设为32uA
                  |(TSI_SCANC_DELVOL(7))     //增量电压选择设定,此处设为600mV
                  |(TSI_SCANC_SMOD(0))       //设定扫描模数,此处设定为连续扫描
                  |(TSI_SCANC_AMPSC(0)));    //激活模式预分频,此处设定值为1,即不分频
    //引脚功能使能
    TSI0_PEN |= (1<<13) | (1<<0);//通道0和13使能
    //TSI功能使能
    TSI0_GENCS |= (TSI_GENCS_TSIEN_MASK);   
    NVICISER2 |= 1<<19;//使能NVIC的TSI对应中断
    nt main(void)
{
    int counter = 0;
    InitTSI();
    printf("Hello (Kinetis) World in 'C' from MK60DX256Z derivative! \n\r");

    for(;;) {      
           counter++;
    }
    return 0;
}
void TSI_ISR()
{
    unsigned int key1,key2;
    //TSI0_GENCS |= TSI_GENCS_OUTRGF_MASK;//清超出范围中断标识位
    TSI0_GENCS |= TSI_GENCS_EOSF_MASK;//清扫描完成中断标识位
    key1 = TSI0_CNTR1&0xFFFF;
    key2 = TSI0_CNTR13>>16;
}

运行上面程序,无按键按下时,key1和key2在4000左右,如下图:

image

某个key按下时,其值在8000多,如下图:

image image

我们选4000~8000之间的某值(如6000)作为阀值,认为大于阀值时有键按下。


这篇关于kinetis的触摸按键TSI的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/674752

相关文章

独立按键单击检测(延时消抖+定时器扫描)

目录 独立按键简介 按键抖动 模块接线 延时消抖 Key.h Key.c 定时器扫描按键代码 Key.h Key.c main.c 思考  MultiButton按键驱动 独立按键简介 ​ 轻触按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通与断开。  ​ 按键抖动 由于按键内部使用的是机

3.门锁_STM32_矩阵按键设备实现

概述 需求来源: 门锁肯定是要输入密码,这个门锁提供了两个输入密码的方式:一个是蓝牙输入,一个是按键输入。对于按键输入,采用矩阵按键来实现。矩阵按键是为了模拟触摸屏的按键输入,后续如果项目结束前还有时间就更新为触摸屏按键输入。 矩阵按键开发整体思路: 由于矩阵按键就是GPIO的控制,所以不进行芯片和设备的分层编写,控制写在同一个文件中,最终向应用层提供一个接口。 代码层级关系:

Android触摸事件处理机制之requestDisallowInterceptTouchEvent

一、触摸事件传递的规则 当手指触摸到屏幕时,系统就会调用相应的View的onTouchEvent,并传入一系列的action。当有多个层级的View时,在父层级允许的情况下,这个action会一直向下传递直到遇到最深层的View。所以touch事件最先调用的是最底层View的onTouchEvent,如果View的onTouchEvent接收到某个touchaction并做了相应处理,最后有两种

Android 自定义View控件,实现跟随手指触摸移动的小球

Android UI组件是通过继承View类,然后绘制内容,比如ImageView,TextView等组件都是继承View类。 当Android系统提供的组件功能不能满足需求时,可以通过继承View类重写一个或多个方法,派生自定义的组件,View类常用重写方法: 1.构造器:View子类最基本的重写方法 protected voidonDraw(Canvas canvas) public

STM32F4按键状态机--单击、双击、长按

STM32F4按键状态机--单击、双击、长按 一、状态机的三要素二、使用状态机原因2.1资源占用方面2.2 执行效率方面:2.3 按键抖动方面: 三、状态机实现3.1 状态机分析3.1 程序实现 百度解析的状态机概念如下 状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(

JS触发按键事件

<script type="text/javascript" language=JavaScript charset="UTF-8">document.onkeydown=function(event){var e = event || window.event || arguments.callee.caller.arguments[0];if(e && e.keyCode==27){ // 按

学习记录-Qt按键单击后延迟一段时间触发下一个函数执行

<span style="font-family: Arial, Helvetica, sans-serif;">QTimer::singleShot(1000, this, SLOT(on_pushButton_pcba_readfilename_clicked()));</span>项目中,需要按键单击后发送一条指令,等待一段时间后在发另一条指令,看文档发现使用如上方式可以实现

Cocos2dx 3.0 过渡篇(三) 触摸机制

尊重原创,转载请注明来自:star特530的CSDN博客 http://blog.csdn.net/start530/article/details/18325493 本来在中午休息时间打算大展拳脚,好好写一篇新触摸机制相关的博文,结果,等真正下手的时候才发现无从下手,很多地方自己都说不清,赶紧看了下testCpp,才发现原来是这样,还可以这样,哦?这样都行?哎,我还是太年轻了。   咱也只能

(素材源码)猫猫学IOS(九)UI之UIScrollView代理触摸实现_图片缩放

猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8531273 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果 ps:新建iOS交流学习群:304570962 ps:猫猫的文章竟然被好多地方转载了,受宠若惊啊,不过转的时候请转的全一点,别

猫猫学IOS(九)UI之UIScrollView代理触摸实现_图片缩放

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44619193 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果 代码 //// NYViewController.m// 05-放大缩小图片UIScrollView//