你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 1869|回复: 2

【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第十六章 电容触摸按键实验

[复制链接]

50

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-1-21 16:46:47 | 显示全部楼层 |阅读模式
<span class="postbody" id="post_body_64888">第十六章电容触摸按键实验

上一章,我们介绍了STM32的输入捕获功能及其使用。这一章,我们将向大家介绍如何通过输入捕获功能,来做一个电容触摸按键。在本章中,我们将用TIM5的通道2PA1)来做输入捕获,并实现一个简单的电容触摸按键,通过该按键控制DS1的亮灭。从本章分为如下几个部分:
16.1 电容触摸按键简介
16.2 硬件设计
16.3 软件设计
16.4 下载验证
16.1 电容触摸按键简介

触摸按键相对于传统的机械按键有寿命长、占用空间少、易于操作等诸多优点。大家看看如今的手机,触摸屏、触摸按键大行其道,而传统的机械按键,正在逐步从手机上面消失。本章,我们将给大家介绍一种简单的触摸按键:电容式触摸按键。
我们将利用战舰STM32开发板上的触摸按键(TPAD),来实现对DS1的亮灭控制。这里TPAD其实就是战舰STM32开发板上的一小块覆铜区域,实现原理如图16.1.1所示:
 


 
 
16.1.1 电容触摸按键原理

       这里我们使用的是检测电容充放电时间的方法来判断是否有触摸,图中R是外接的电容充电电阻,Cs是没有触摸按下时TPADPCB之间的杂散电容。而Cx则是有手指按下的时候,手指与TPAD之间形成的电容。图中的开关是电容放电开关(由实际使用时,由STM32IO代替)。
       先用开关将Cs(或Cs+Cx)上的电放尽,然后断开开关,让RCs(或Cs+Cx)充电,当没有手指触摸的时候,Cs的充电曲线如图中的A曲线。而当有手指触摸的时候,手指和TPAD之间引入了新的电容Cx,此时Cs+Cx的充电曲线如图中的B曲线。从上图可以看出,AB两种情况下,Vc达到Vth的时间分别为TcsTcs+Tcx
       其中,除了CsCx我们需要计算,其他都是已知的,根据电容充放电公式:
Vc=V0*(1-e^(-t/RC))

       其中Vc为电容电压,V0为充电电压,R为充电电阻,C为电容容值,e为自然底数,t为充电时间。根据这个公式,我们就可以计算出CsCx。利用这个公式,我们还可以把战舰开发板作为一个简单的电容计,直接可以测电容容量了,有兴趣的朋友可以捣鼓下。
       在本章中,其实我们只要能够区分TcsTcs+Tcx,就已经可以实现触摸检测了,当充电时间在Tcs附近,就可以认为没有触摸,而当充电时间大于Tcs+Tx时,就认为有触摸按下(Tx为检测阀值)。
       本章,我们使用PA1(TIM5_CH2)来检测TPAD是否有触摸,在每次检测之前,我们先配置PA1为推挽输出,将电容Cs(或Cs+Cx)放电,然后配置PA1为浮空输入,利用外部上拉电阻给电容Cs(Cs+Cx)充电,同时开启TIM5_CH2的输入捕获,检测上升沿,当检测到上升沿的时候,就认为电容充电完成了,完成一次捕获检测。
MCU每次复位重启的时候,我们执行一次捕获检测(可以认为没触摸),记录此时的值,记为tpad_default_val,作为判断的依据。在后续的捕获检测,我们就通过与tpad_default_val的对比,来判断是不是有触摸发生。
关于输入捕获的配置,在上一章我们已经有详细介绍了,这里我们就不再介绍。至此,电容触摸按键的原理介绍完毕。
16.2 硬件设计

本实验用到的硬件资源有:
1)  指示灯DS0DS1
2)  定时器TIM5
3)  触摸按键TPAD
前面两个之前均有介绍,我们需要通过TIM5_CH2PA1)采集TPAD的信号,所以本实验需要用跳线帽短接多功能端口(P14)的TPADADC,以实现TPAD连接到PA1。如图16.2.1所示:
 


 
 
16.2.1 TPADSTM32连接原理图

       硬件设置(用跳线帽短接多功能端口的ADCTPAD即可)好之后,下面我们开始软件设计。
 
16.3 软件设计

软件设计我们在之前的工程上面增加,首先在HARDWARE文件夹下新建TPAD的文件夹。然后打开USER文件夹下的工程,新建一个tpad.c的文件和tpad.h的头文件,保存在TAPD文件夹下,并将TPAD文件夹加入头文件包含路径。
我们在tpad.c里输入如下代码:
#define TPAD_ARR_MAX_VAL 0XFFFF  //最大的ARR     
vu16 tpad_default_val=0;//空载的时候(没有手按下),计数器需要的时间
//初始化触摸按键
//获得空载的时候触摸按键的取值.
//systick:系统时钟频率
//返回值:0,初始化成功;1,初始化失败
u8 TPAD_Init(u8 systick)
{
       u16 buf[10];
       u16 temp;
       u8 j,i;
       TIM5_CH2_Cap_Init(TPAD_ARR_MAX_VAL,systick-1);//1Mhz的频率计数
       for(i=0;iCRL|=0X00000030;       //复用功能输出      
       GPIOA->ODR&=~(1CNT=0;                          //归零    
       GPIOA->CRL&=0XFFFFFF0F;   //PA1  输入 
       GPIOA->CRL|=0X00000040;       //复用功能输出      
}
//得到定时器捕获值
//如果超时,则直接返回定时器的计数值.
//返回值:捕获值/计数值(超时的情况下返回)
u16 TPAD_Get_Val(void)
{                            
       TPAD_Reset();
       while((TIM5->SR&0X04)==0)//等待捕获上升沿
       {
              if(TIM5->CNT>TPAD_ARR_MAX_VAL-500)return TIM5->CNT;
//超时了,直接返回CNT的值
       };   
       return TIM5->CCR2;      
}       
//读取n,取最大值
//n:连续获取的次数
//返回值:n次读数里面读到的最大读数值
u16 TPAD_Get_MaxVal(u8 n)
{
       u16 temp=0;
       u16 res=0;
       while(n--)
       {
              temp=TPAD_Get_Val();//得到一次值
              if(temp>res)res=temp;
       };
       return res;

//扫描触摸按键
//mode:0,不支持连续触发(按下一次必须松开才能按下一次);1,支持连续触发(可以一直按下)
//返回值:0,没有按下;1,有按下;                                                                    
#define TPAD_GATE_VAL   80   
//触摸的门限值,也就是必须大于tpad_default_val+TPAD_GATE_VAL,才认为是有效触摸.
u8 TPAD_Scan(u8 mode)
{
       static u8 keyen=0;  //0,可以开始检测;>0,还不能开始检测      
       u8 res=0;
       u8 sample=3;         //默认采样次数为3 
       u16 rval;
       if(mode)
       {
              sample=6;       //支持连按的时候,设置采样次数为6
              keyen=0; //支持连按      
       }
       rval=TPAD_Get_MaxVal(sample);
       if(rval>(tpad_default_val+TPAD_GATE_VAL))
//大于tpad_default_val+TPAD_GATE_VAL,有效
       {                                       
             rval=TPAD_Get_MaxVal(sample);             
              if((keyen==0)&&(rval>(tpad_default_val+TPAD_GATE_VAL)))
//大于tpad_default_val+TPAD_GATE_VAL,有效
              {
                     res=1;
              }       
              //printf("r:%d\r\n",rval);                                                                         
              keyen=5;                      //至少要再过5次之后才能按键有效  
       }else if(keyen>2)keyen=2;   
//如果检测到按键松开,则直接将次数将为2,以提高响应速度
       if(keyen)keyen--;         
       return res;
}
//定时器2通道2输入捕获配置 
//arr:自动重装值
//psc:时钟预分频数
void TIM5_CH2_Cap_Init(u16 arr,u16 psc)
{
       //此部分需手动修改 IO口设置 
      RCC->APB1ENR|=1ARR=arr;               //设定计数器自动重装值//刚好1ms   
       TIM5-&gtSC=psc;                //预分频器,1M的计数频率

<span lang="EN-US">       TIM5->CCMR1|=1

《STM32开发指南》第十六章 电容触摸按键实验.rar

下载

657.6 KB, 下载次数: 16, 下载积分: ST金币 -1

实验11 电容触摸按键实验.rar

下载

40.02 KB, 下载次数: 12, 下载积分: ST金币 -1

<
回复

使用道具 举报

24

主题

591

回帖

0

蝴蝶豆

中级会员

最后登录
2020-12-2
发表于 2013-1-21 21:18:08 | 显示全部楼层

RE:【连载】【ALIENTEK 战舰STM32开发板】STM32开发指南--第十六章 电容触摸按键实验

不错。
回复 支持 反对

使用道具 举报

2

主题

32

回帖

0

蝴蝶豆

高级会员

最后登录
2018-1-16
发表于 2015-9-8 11:25:16 | 显示全部楼层
学习了!!!谢谢!
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版