电容触摸按键原理

硬件连接讲解

实验程序讲解

#ifndef __TPAD_H#define __TPAD_H
#include "sys.h"//空载的时候(没有手按下),计数器需要的时间
//这个值应该在每次开机的时候被初始化一次
extern vu16 tpad_default_val;void TPAD_Reset(void);
u16  TPAD_Get_Val(void);
u16 TPAD_Get_MaxVal(u8 n);
u8   TPAD_Init(u8 systick);
u8   TPAD_Scan(u8 mode);
void TIM2_CH1_Cap_Init(u32 arr,u16 psc);    #endif
#include "tpad.h"
#include "delay.h"
#include "usart.h"#define TPAD_ARR_MAX_VAL  0XFFFFFFFF    //最大的ARR值(TIM2是32位定时器)
vu16 tpad_default_val=0;               //空载的时候(没有手按下),计数器需要的时间
//初始化触摸按键
//获得空载的时候触摸按键的取值.
//psc:分频系数,越小,灵敏度越高.
//返回值:0,初始化成功;1,初始化失败
u8 TPAD_Init(u8 psc)
{u16 buf[10];u16 temp;u8 j,i;TIM2_CH1_Cap_Init(TPAD_ARR_MAX_VAL,psc-1);//设置分频系数for(i=0;i<10;i++)//连续读取10次{                 buf[i]=TPAD_Get_Val();delay_ms(10);       }                   for(i=0;i<9;i++)//排序{for(j=i+1;j<10;j++){if(buf[i]>buf[j])//升序排列{temp=buf[i];buf[i]=buf[j];buf[j]=temp;}}}temp=0;for(i=2;i<8;i++)temp+=buf[i];//取中间的8个数据进行平均tpad_default_val=temp/6;printf("tpad_default_val:%d\r\n",tpad_default_val);  if(tpad_default_val>TPAD_ARR_MAX_VAL/2)return 1;//初始化遇到超过TPAD_ARR_MAX_VAL/2的数值,不正常!return 0;
}
//复位一次
//释放电容电量,并清除定时器的计数值
void TPAD_Reset(void)
{       GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  //PA5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA5GPIO_ResetBits(GPIOA,GPIO_Pin_5);//输出0,放电delay_ms(5);TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志TIM_SetCounter(TIM2,0);        //归0GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PA5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不带上下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA5}
//得到定时器捕获值
//如果超时,则直接返回定时器的计数值.
//返回值:捕获值/计数值(超时的情况下返回)
u16 TPAD_Get_Val(void)
{                  TPAD_Reset();while(TIM_GetFlagStatus(TIM2, TIM_IT_CC1) == RESET)//等待捕获上升沿{if(TIM_GetCounter(TIM2)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM2);//超时了,直接返回CNT的值};    return TIM_GetCapture1(TIM2);
}
//读取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   100 //触摸的门限值,也就是必须大于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)&&rval<(10*tpad_default_val))//大于tpad_default_val+TPAD_GATE_VAL,且小于10倍tpad_default_val,则有效{                            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=3;                //至少要再过3次之后才能按键有效   } if(keyen)keyen--;                                                                            return res;
}
//定时器2通道2输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void TIM2_CH1_Cap_Init(u32 arr,u16 psc)
{GPIO_InitTypeDef  GPIO_InitStructure; TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_ICInitTypeDef  TIM2_ICInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);     //TIM2时钟使能    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);   //使能PORTA时钟 GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_TIM2); //GPIOA5复用位定时器2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //GPIOA5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不带上下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA5//初始化TIM2  TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值   TIM_TimeBaseStructure.TIM_Prescaler =psc;  //预分频器     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化通道1TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01    选择输入端 IC1映射到TIM2上TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕获TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;     //配置输入分频,不分频 TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC2F=0000 配置输入滤波器 不滤波TIM_ICInit(TIM2, &TIM2_ICInitStructure);//初始化TIM2 IC1TIM_Cmd(TIM2,ENABLE );     //使能定时器2
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "tpad.h"int main(void)
{ u8 t=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);     //初始化延时函数uart_init(115200);     //初始化串口波特率为115200LED_Init();                    //初始化LEDTPAD_Init(8);              //初始化触摸按键,以84/4=21Mhz频率计数while(1){                                                  if(TPAD_Scan(0))   //成功捕获到了一次上升沿(此函数执行时间至少15ms){LED1=!LED1;       //LED1取反}t++;if(t==15)       {t=0;LED0=!LED0;     //LED0取反,提示程序正在运行}delay_ms(10);}
}

23. 电容触摸按键实验相关推荐

  1. 判断按键值_「正点原子NANO STM32开发板资料连载」第十六章电容触摸按键实验...

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十六章电容 ...

  2. STM32精英版(正点原子STM32F103ZET6开发板)学习篇12——电容触摸按键实验

    电容触摸按键原理 RC充放电电路原理:   RC充放电原理,其实就是电(R)和电容(C)组成的串联电路.   按键开关未按下时,电路两端电压都是0V,无法形成电势差,也就无法形成电流.但当按键开关按下 ...

  3. 正点原子stm32f429 pcb_正点原子【STM32-F407探索者】第十六章 电容触摸按键实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 http://weixin.qq.com/r/hEhUT ...

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

    记录一下,方便以后翻阅~ 主要内容 1) 电容触摸按键原理: 2)部分实验代码解读. 实验内容 手触摸按键后,LED1灯翻转. 硬件原理图 上图,TPAD与STM_ADC用跳线帽相连,即TPAD与PA ...

  5. stm32按键矩阵代码_STM32学习日志——电容触摸按键实验(20-06-27)

    昨天在公司值班学习的,敲完代码笔记本没电了,没更新日志,今天补更新.学习应持之以恒,谁都会有惰性,应尽力克服. 这次的代码很有意思,可以学到很多编程的思想. 首先,电容触摸按键是基于模电的RC充放电电 ...

  6. 【STM32】(10) 电容触摸按键实验(含代码)、电容触摸按键过程和相关函数介绍

    一.电容触摸按键简介 我们只要能够区分Tcs和Tcs+Tcx,就已经可以实现触摸检测了,当充电时间在Tcs附近,就可以认为没有触摸,而当充电时间大于Tcs+Tx时,就认为有触摸按下(Tx为检测阀值). ...

  7. 基于stm32f10x(原子)的电容触摸实验的个人解读 (16)

    首先,我先介绍电容触摸按键的原理. 一个电容充满电的时候是需要一定时间,当两个电容并联的时候,此时,总电容大小就变成两个电容之和.导致充电的时间变成.电容触摸实验就是基于此,来根据时间的长短变换来确定 ...

  8. 基于STM32F103ZET6主控平台实现电容触摸按键 [基于TIM5_CH2(PA1)的输入捕获]

    一个热爱代码的工程师,唯有凭借双手不断敲打,才可以快速提升实力! 本文谨以记录,日后相忘时再作复习,代码没有贵贱,既来之则安之. 本次实验中我们将用 TIM5 的通道 2( PA1)来做输入捕获,并实 ...

  9. 实现电容触摸按键控制LED(基于STM32F103ZET6)

    依然采用输入捕获的原理来采集是否产生电容触摸. 实验目的: 我们将用 TIM5 的通道 2(PA1)来做输入捕获,并实现一个简单的电容触摸按键,通过该按键控制 DS1 的亮灭. 实验原理 电容式触摸按 ...

  10. 【正点原子Linux连载】第六十四章 Linux 多点电容触摸屏实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. 005_Button按钮
  2. opencv 报错:Error: Assertion failed (data) in cv::Mat::at, file ... mat.inl.hpp, line 897(访问了不存在矩阵的像素)
  3. 克隆人不只出现在科幻电影里?阿里虚拟美女“俪知”亮相
  4. 详细讲述STP过程【转自56cto.com】
  5. js 判断 undefined,单选 以及下拉框选中状态
  6. wepy学习笔记之环境搭建
  7. oracle查看存储过程最近编译,Oracle恢复被误编译覆盖的存储过程
  8. listview 通用模版
  9. PostScript —— 一种编程语言
  10. WinForm实现只打开一个窗口的代码
  11. SpringMVC全局异常处理机制常见问题及底层实现分析
  12. 韦东山Linux嵌入式学习——硬件复习
  13. linux支持hd610显卡吗,HD610和UHD630区别大吗 UHD630对比HD610的区别
  14. 港股通换汇、红利、交易费用、资金清算规则
  15. sd卡数据丢失怎么恢复?
  16. VS2019离线安装包下载方法
  17. 阿拉尔市谷歌高清卫星地图下载
  18. 2022.10.10 英语背诵
  19. FIDO2.0 认证注册流程
  20. 【语篇标记练习题】What are we doing?

热门文章

  1. 入门必看,51单片机学习三步走
  2. eXosip认证头域authentication
  3. 大地测量学白塞尔大地主题解算
  4. 《TensorFlow技术解析与实战》——3.3 可视化的例子
  5. 中兴代工移动光猫GM620开启telnet
  6. 安卓psp模拟器哪个好_psp模拟器安卓完美版下载_psp模拟器完美版手机版下载_玩游戏网...
  7. 许可证加密的WMV文件破解
  8. Android MIDI音乐播放/生成相关总结
  9. JavaScript对话框
  10. php jquery alert 美化,jquery插件hiAlert实现网页对话框美化_jquery