0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

电容触摸实验

汽车电子技术 来源:滑小稽笔记 作者:电子技术园地 2023-03-01 15:57 次阅读

8.1 电容触摸简介

8.1.1 电容触摸概述

随着科技的发展,传统的机械按键正在逐步从设备上面消失,这个原因主要有机械按键由于是采用机械接触的方式,寿命比较短,从用户体验上看,机械按键也显得操作复杂,对比现在的电容按键,电容按键具有寿命长,因为不存在机械接触,占用空间少,以前的机械按键在设计外壳的时候需要考虑尺寸,现在换成电容按键后这个问题不再需要考虑。

8.1.2 检测原理

常规的检测方式一般是通过计算电容放电时间来判断是否有手指按下,这是因为手指会与线路板的铜箔接触面上产生电容效应,当手指没有放在铜箔上的时候,铜箔与PCB之间存在杂散电容,这两个状态的电容值差别很大,检测原理如下图所示。

图片

在检测之前首先用开关将电容Cs里面的电荷放尽,然后此时CPU开始计算Cs的充电时间,这一部分是采用捕捉信号来测量,尽管单片机属于数字电路,但是数字电路的逻辑电平也是有电压限制的,比如在3.3V供电环境下,当电压大于2.4V则被认为是逻辑电平1,当电压小于0.4V则被认为是逻辑电平0,单片机的输入捕获功能来判断输入信号的电平是否为逻辑电平1,如果检测到逻辑电平1,则认为电容此时充电达到了2.4V以上,将这个时间记录下来,当手指放在铜箔上的时候,相当于增加了Cs的容值,此时我们继续进行输入捕获采样,将这个捕获的时间记录下来,两个时间求差值,这个差值高于某个阈值的时候就可以认为此时手指按下了电容按键,用这种方式就可以实现虚拟按键的使用了。这种检测原理实际是采用了在电路分析中学习到的RC电路的零状态响应来实现的。根据RC电路的零状态响应可以得出电容的充电公式为

图片

其中Vc表示电容的充电电压,VDDRC电路的输入电压,R电阻的阻值,C为充电电容的容值,通过这个公式我们可以反推得到充点电容的容值。也就是说我们可以利用这个公式实现电容的测量。

8.1.3 预备知识

首先我们在进行电容触摸检测的时候需要用到STM32的输入捕获功能,从这一章开始,关于寄存器文件的添加,驱动文件的添加不再作为重点,重点开始转为程序的编写及小算法的编写。

   输入捕获的工作原理如下图所示。

图片

首先设置定时器的输入通道为上升沿捕获,检测到上升沿之后,将计数寄存器CNT中的数据存储在CCRx1中并清空CNT的数据,然后设置定时器的输入通道为下降沿捕获,检测到下降沿后将计数寄存器CNT中的数据存储在CCRx2中并清空CNT的数据,此时将CCRx2的值与CCRx1的值做差值就可以得到1个波形中高电平的时间,由于这两个数值获取的过程中,会由于高电平时间过长导致定时器产生多次中断,这个多次中断的值记为N,此时高电平的时间计算公式如下所示:

图片

其中M为定时器的计数周期,N为定时器的溢出次数,ARR为自动重装载计数器的值,CCRx2为捕获到的数据。

8.2 常用寄存器

8.2.1 捕获/比较寄存器1:TIMx_CCMR1

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IC2F[3:0] IC2PSC[1:0] CC2S[1:0] IC1F[3:0] IC1PSC[1:0] CC1S[1:0]

ICxF[3:0]:输入捕获x滤波器(定义输入采样频率及数字滤波器长度)

图片

ICxPSC[1:0]:输入/捕获x预分频器(一旦CCxE=0,则预分频器复位)

00:每1个事件触发一次捕获

   01:每2个事件触发一次捕获

   10:每4个事件触发一次捕获

   11:每8个事件触发一次捕获

CCxS[1:0]:捕获/比较x选择(用于定义通道x输入还是输出)

00:输出模式

   01:输入模式,映射在TI110:输入模式,映射在TI211:输入模式,映射在TRC上,此模式引用于内部触发器输入被选中时

8.2.2 捕获/比较使能寄存器:TIMx_CCER

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- CC4P CC4E - CC3P CC3E - CC2P CC2E - CC1P CC1E

CCxP:输入/捕获x输入/输出极性

通道在输出模式下

0:高电平有效

   1:低电平有效

通道在输入模式下

0:不反相,上升沿触发

   1:反相,下降沿触发

CCxE:输入/捕获x输入/输出使能

通道在输出模式下

0:关闭输出

   1:开启输出

通道在输入模式下

0:禁止捕获

   1:使能捕获

8.3 电容触摸例程

现在PA1端口接一个触摸按键(一块铜箔),利用PA1的触摸按键控制PA0端口的LED状态,按下时LED点亮,抬起时LED熄灭。

(1)新建基础工程,并创建tpad.c,tpad.h,led.c和led.h文件,并导入工程,如下图所示。

图片

(2)在tpad.h文件内添加以下代码。

图片

(3)在led.h文件内添加以下代码

图片

(4)在led.c文件中添加以下代码

图片

(5)在tpad.c文件内添加以下代码

#include "tpad.h"
#include "delay.h"
/***************************************************
Name    :TPAD_Get_Value
Function  :触摸按键值获取
Paramater  :None
Return    :获取的充电时间
***************************************************/
u16 TPAD_Get_Value()
{
  //电容放电
  GPIOA->CRL &= 0xFFFFFF0F ;          //PA1输入
  GPIOA->CRL |= 0x00000030 ;          //推挽输出
  GPIOA->ODR &= ~( 1<<1 ) ;          //输出低电平放电
  delay_ms( 5 ) ;
  TIM5->SR = 0 ;                //清除标记
  TIM5->CNT = 0 ;                //归零
  GPIOA->CRL &= 0xFFFFFF0F ;          //PA1输入
  GPIOA->CRL |= 0x00000040 ;          //浮空输入
  //等待捕获上升沿
  while( ( TIM5->SR&0x04 )==0 )
  {
    if( TIM5->CNT>( 65535-500 ) )
      return TIM5->CNT ;
  }
  return TIM5->CCMR2 ;
}
/***************************************************
Name    :TPAD_Get_MaxVal
Function  :触摸按键最大值获取
Paramater  :None
Return    :获取的最大充电时间
***************************************************/
u16 TPAD_Get_MaxVal( u8 n )
{
  u16 temp=0;
  u16 res=0;
  while( n-- )
  {
    temp = TPAD_Get_Value() ;
    if( temp>res )
      res = temp ;
  }
  return res ;
}
/***************************************************
Name    :TPAD_Init
Function  :触摸按键初始化
Paramater  :None
Return    :None
***************************************************/
TPADData TPAD_Data ;
void TPAD_Init()
{
  u16 buff[ 10 ], temp ;
  u8 i, j ;
  RCC->APB2ENR |= 1<<2 ;
  GPIOA->CRL &= 0xFFFFFF0F ;            //PA1 输入
  GPIOA->CRL |= 0x00000040 ;            //浮空输入
  RCC->APB1ENR |= 1<<3 ;              //TIM5时钟开启
  TIM5->ARR = 65535 ;
  TIM5->PSC = 5 ;
  TIM5->CCMR1 |= 1<<8 ;              //选择输入端IC2映射到TI2上
  TIM5->CCMR1 &= ~( 1<<12 ) ;            //采样频率8分频
  TIM1->CCMR1 &= ~( 1<<10 ) ;            //配置输入不分频
  TIM5->CCER &= ~( 1<<5 ) ;            //上升沿捕获
  TIM5->CCER |= 1<<4 ;                //允许捕获功能
  TIM5->CR1 |= 1<<0 ;                //开启定时器5
  //连续采样10次
  for( i=0; i<10; i++ )
  {
    buff[ i ] = TPAD_Get_Value() ;
    delay_ms( 10 ) ;
  }
  //排序
  for( i=0; i<9; i++ )
  {
    for( j=i+1; j<10; j++ )
    {
      //升序排列
      if( buff[ i ]>buff[ j ] )
      {
        temp= buff[ i ] ;
        buff[ i ] = buff[ j ] ;
        buff[ j ] = temp ;
      }
    }
  }
  temp = 0 ;
  //获取中间数据的均值
  for( i=2; i<8; i++ )
    temp += buff[ i ] ;
  TPAD_Data.value = temp/6 ;
}
/***************************************************
Name    :TPAD_Scan
Function  :触摸按键扫描
Paramater  :None
Return    :None
***************************************************/
void TPAD_Scan()
{
  u16 rval ;
  rval = TPAD_Get_MaxVal( 3 ) ;
  if( rval>( TPAD_Data.value+100 ) )
    TPAD_Data.State = 1 ;              //手指按下
}

(6)在1.c文件内添加主函数

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "led.h"
#include "tpad.h"
int main()
{
  STM32_Clock_Init( 9 ) ;                  //STM32时钟初始化
  SysTick_Init( 72 ) ;                    //SysTick初始化
  USART1_Init( 72, 115200 ) ;                //初始化串口1波特率115200
  LED_Init() ;                      //LED初始化
  TPAD_Init() ;                      //触摸按键初始化
  while( 1 )
  {
    TPAD_Scan() ;                    //触摸按键扫描
    if( TPAD_Data.State==1 )
    {
      LED = 0 ;
      TPAD_Data.State = 0 ;
    }
    else
      LED = 1 ;
  }
}

——————————————分割线——————————————

8.4 STM32工程管理

这里的总结是针对与之前所学的所有嵌入式内容进行总结,随着后续代码越来越多,对于工程的管理显得格外重要,不仅仅是采用本章节介绍的方法管理工程代码,对于后续的Linux开发和操作系统移植也最好是按照固定的工程格式进行管理。

   对于STM32的工程可以划分为以下几个部分:

(1)过程文件以及最终生成的hex文件:这些文件通通放置在工程1级目录下的OBJECT文件中,文件中的内容如下图所示。

图片

图中标注部分就是最终生成的hex文件,其他的文件均属于过程文件,集成开发系统IDE编译的实质其实就是采用gcc交叉编译器将我们编写的代码转换成对应的机器代码的过程,具体的步骤会在Linux系统移植中描述,这里只需要知道利用交叉编译器进行编译的时候会产生大量的链接文件和过程文件,这些文件统统放置在OBJECT目录下。将工程文件中的过程文件放置在该目录下的设置方式如下图所示。

图片

图片

(2)主函数文件及主工程文件:在Keil中创建的工程,以及包括main函数的c文件都位于这个目录内。

图片

图中标注的3个文件都是必不可少的文件,带有Keil图标的文件就是工程文件,里面包含了整个工程所需的头文件,文件路径以及编译器位置,文本文件图标的则是c文件,main函数就放在这个位置,.s后缀的为汇编启动文件,用于帮助芯片创建C代码运行环境,初始化堆栈等功能,为了达到最快效率,所以采用汇编语言来编写这个文件。

(3)自定义系统文件:自定义的系统文件位于SYSTEM目录中,目录内有3个子目录,分别是sys,delay和usart1,如下图所示。

图片

delay目录:是利用SysTick时钟来实现的延时功能,主要有毫秒级延时和微秒级延时;

usart1目录:则是利用串口1来实现printf打印输出的功能,主要用于调试数据的输出;

sys目录:是最基础的工程文件,这个目录内有1个c文件和2个h文件,c文件主要实现STM32时钟树的配置和中断系统的设置功能,是C函数中最重要的一个文件,stmxx.h文件则是最底层的寄存器定义文件,里面定义了STM32芯片内部所有寄存器的地址和结构,通过C语言来调用这里面的寄存器实现芯片的控制功能。

(4)驱动文件:驱动文件位于HEADERWARE目录中,用于存放项目所用到的驱动,比如之前实验所用到的LED,KEY,TIM这些外设都属于驱动文件内容。

至此整个工程的目录结构如下图所示。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机械
    +关注

    关注

    8

    文章

    1580

    浏览量

    40564
  • 按键
    +关注

    关注

    4

    文章

    223

    浏览量

    57602
  • 电容按键
    +关注

    关注

    0

    文章

    5

    浏览量

    1419
收藏 人收藏

    评论

    相关推荐

    瑞萨电容触摸技术之低功耗应用—RX140实验环节(1)

    接下来,我们将着眼于实际操作,依托几个具体的实验环节,从基本的RX140触摸应用工程创建、使用QE for Cap touch监控触摸数据和调试触摸运行参数开始,循序渐进的增加并调试以
    的头像 发表于 10-11 16:34 1534次阅读
    瑞萨<b class='flag-5'>电容</b><b class='flag-5'>触摸</b>技术之低功耗应用—RX140<b class='flag-5'>实验</b>环节(1)

    迅为IMX6ULL开发板Linux下电容触摸实验程序编写

    迅为IMX6ULL开发板Linux下电容触摸实验程序编写
    发表于 12-28 07:00

    迅为IMX6ULL开发板SRTC 电容触摸实验编译及运行

    切换回启动模式,等待程序正常运行,我们可以看到 LCD 屏幕如图 25.4.5 显示:当我们按下触摸屏的时候,就会在屏幕上显示出当前的触摸点个数,以及每个触摸点的坐标信息,如图 25.4.6 所示:
    发表于 05-28 10:41

    什么是电容触摸

    什么是电容触摸电容触摸屏图片 电容触摸屏的英文名称the introduction
    发表于 04-30 08:54 2400次阅读

    电容式触摸屏参数_电容式触摸屏分类

    电容式触摸屏的类型分为表面式电容触摸屏和投射式电容触摸屏两种。
    发表于 10-01 09:51 1.5w次阅读

    电容触摸屏和触摸面板应用的意义

    随着我们的科技,在不断的发展,在不断的改善,导致我们的产品,在行业之中的使用,也都还是比较可以的,电容触摸屏也是一样,那么电容触摸屏、触摸
    发表于 07-19 11:27 1438次阅读

    ATK-7 TFT LCD电容触摸屏模块测试实验的工程文件免费下载

    本文档的主要内容详细介绍的是ATK-7 TFT LCD电容触摸屏模块测试实验的工程文件免费下载。
    发表于 03-19 10:26 16次下载

    电容触摸的工作原理及应用设计方式

    ME32F030系列芯片的电容触摸功能,可以对多达 22 管脚的电容进行测量,利用一个 RC 震荡电路频率的改变来检测手指触摸引起的电容 C
    的头像 发表于 05-01 16:15 7182次阅读
    <b class='flag-5'>电容</b><b class='flag-5'>触摸</b>的工作原理及应用设计方式

    电容触摸按键实验”实例解析

    目录电容触摸按键实验电容触摸按键的基本原理(原理图层面)新电容的产生与作用充放电性能的变化脉冲如
    发表于 11-30 11:36 15次下载
    “<b class='flag-5'>电容</b><b class='flag-5'>触摸</b>按键<b class='flag-5'>实验</b>”实例解析

    STM32学习心得十九:电容触摸按键实验及相关代码解读

    记录一下,方便以后翻阅~主要内容:1) 电容触摸按键原理;2)部分实验代码解读。实验内容:手触摸按键后,LED1灯翻转。
    发表于 11-30 12:51 15次下载
    STM32学习心得十九:<b class='flag-5'>电容</b><b class='flag-5'>触摸</b>按键<b class='flag-5'>实验</b>及相关代码解读

    STM32入门(二十一)----电容触摸

    电容触摸电容触摸原理硬件连接实验程序程序思路电容触摸
    发表于 01-17 11:25 4次下载
    STM32入门(二十一)----<b class='flag-5'>电容</b><b class='flag-5'>触摸</b>

    STM32入门学习笔记之电容触摸实验(上)

    随着科技的发展,传统的机械按键正在逐步从设备上面消失,这个原因主要有机械按键由于是采用机械接触的方式,寿命比较短,从用户体验上看,机械按键也显得操作复杂,对比现在的电容按键,电容按键具有寿命长,因为
    的头像 发表于 02-16 10:22 1305次阅读
    STM32入门学习笔记之<b class='flag-5'>电容</b><b class='flag-5'>触摸</b><b class='flag-5'>实验</b>(上)

    STM32入门学习笔记之电容触摸实验(下)

    随着科技的发展,传统的机械按键正在逐步从设备上面消失,这个原因主要有机械按键由于是采用机械接触的方式,寿命比较短,从用户体验上看,机械按键也显得操作复杂,对比现在的电容按键,电容按键具有寿命长,因为
    的头像 发表于 02-16 10:22 705次阅读
    STM32入门学习笔记之<b class='flag-5'>电容</b><b class='flag-5'>触摸</b><b class='flag-5'>实验</b>(下)

    电容触摸屏原理 电容触摸屏和电阻触摸屏有什么区别

    电容触摸屏和电阻触摸屏是两种常见的触摸屏技术,它们在原理、结构和应用方面都有很大的区别。下面将详细介绍电容
    的头像 发表于 01-22 16:13 4626次阅读

    触摸电容屏原理 触摸电容屏划线出现断线怎么回事

    触摸电容屏原理及触摸电容屏划线出现断线的原因 一、触摸电容屏原理
    的头像 发表于 01-24 15:12 1216次阅读