依然采用输入捕获的原理来采集是否产生电容触摸。

实验目的:

我们将用 TIM5 的通道 2(PA1)来做输入捕获,并实现一个简单的电容触摸按键,通过该按键控制 DS1 的亮灭。

实验原理

电容式触摸按键。

如图为内部结构图,我们是通过充放电时间(到达一个固定电压值)来判定是否有触摸电容按键,当开关打开时,电容CX为触摸按键的平面,里面包含一定量的散杂(本身存在)电容,这时,电容处于放电状态,当放电完毕,关闭开关,这时电容CX开始充电,充电时间遵从公式Vc=V0*(1-e^(-t/RC)),算出T,可以得到未触摸时的充电时间值,可以作为初始化的步骤。

如图为有触摸(B)和无触摸(A)到达固定电压的时间值,只要我们通过分析实际测量的值,做一个门槛值,就可以准确判断是否存在触摸情况。

流程

说了实验原理,想要实现我们的功能,少不了的是梳理实验流程。
想要实时的实现我们的输入捕获,需要经历一个不断充放电的过程,检测充放电时间来判定是否有按下电容触摸按键,一直循环方可实现触摸按键的扫描,实现led灯反转。
解释及补充
led能否反转,关键在于充电的时间,我们在(mcu重启)初始化时,就将未触摸时的充电时间算出来,保存在一个十六位的变量中,与后面触摸时的充电时间作比较判断。
我们使用 PA1(TIM5_CH2)来检测 TPAD 是否有触摸,在每次检测之前,我们先配置PA1 为推挽输出,将电容 Cx放电,然后配置 PA1 为浮空输入,利用外部上拉电阻给电容 Cx充电,同时开启 TIM5_CH2 的输入捕获,检测上升沿,当检测到上升沿的时候,就认为电容充电完成了,完成一次捕获检测。

硬件配置

精英版的用跳线帽短接

算法梳理

我们需要的:
(1):需要未触摸时的充电时间,取多次求平均值,定义为static变量
(2):需要时刻采集电容触摸按键上的充电时间,多次采集,取最大值与未触摸的做比较,
(3):支持连续触摸(持续采集)还是非连续(按下去必须松开才会进行下一次采集)

程序初始化流程

(1):GPIO,定时器时钟开启
(2):定时器初始化,初始化GPIO为开漏输出
(3):开启定时器捕获,不开启中断,采用循环检测标志位判断是否成功采集捕获脉冲
(4):编写充电放电过程函数,从推挽输出放电到浮空输入
(5):循环检测标志位,获取触摸时的充电时间值
(6):采集数据的准确度处理,算法自行编写,取出最大值,对采集到的合理值进行支持连按和非连按处理
(7):在主函数main.c里循环检测调用数据采集函数

电容触摸按键头文件tpad.h

#ifndef TPAD_H
#define TPAD_H
#include "sys.h"
extern void tpad_init(u16 arr,u16 prer);
extern void tapd_reset();
extern int value_get(void);
extern int scan_max(int );
extern int scan(int );
extern int tapd_initvalue();
#endif

电容触摸按键源文件tapd.c

#include "tpad.h"
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "timepwm.h"
#define TPAD_GATE_VAL 30
short int basevalue;void tpad_init(u16 arr,u16 prer)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_InitStructure;TIM_ICInitTypeDef  TIM_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_1);TIM_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_InitStructure.TIM_Period=arr;TIM_InitStructure.TIM_Prescaler=prer;TIM_TimeBaseInit(TIM5, &TIM_InitStructure);TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;TIM_ICInitStructure.TIM_ICFilter=0x00;TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICPrescaler= TIM_ICPSC_DIV1;TIM_ICInitStructure.TIM_ICSelection= TIM_ICSelection_DirectTI;TIM_ICInit(TIM5, &TIM_ICInitStructure);TIM_ITConfig( TIM5,TIM_IT_CC1,ENABLE);TIM_Cmd(TIM5,ENABLE );
}
void tpad_reset(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_ResetBits(GPIOA,GPIO_Pin_1); delay_ms(5);TIM_SetCounter(TIM5,0);TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);
}
int value_get(void)
{tpad_reset();while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2)==0){if(TIM_GetCounter(TIM5)>(65536-500))return TIM_GetCounter(TIM5);}return TIM_GetCapture2(TIM5);
}
int scan_max(int n)
{u16 temp=0;u16 res=0;while(n--){temp=value_get();if(temp>res)res=temp;};return res;
}
int tapd_initvalue(void)
{int buf[10];int temp;int i;int j;int d;tpad_init(0xffff,71);for( d=0;d<10;d++){buf[d]=value_get();}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];basevalue=temp/6;if(basevalue>0xffff/2)return 1;return 0;
}
int scan(int a)
{static unsigned char  flag=0;int b;int e=0;b=scan_max(a);if(b<(TPAD_GATE_VAL+basevalue)){flag++;}if((flag>=3)&&(b>TPAD_GATE_VAL+basevalue)){e=1;flag=0;}else {e=0;}return e;
}

电容触摸按键主函数main.c

#include "delay.h"
#include "sys.h"
#include "tpad.h"
#include "led.h"
int main(void)
{delay_init();LED_Init();tapd_initvalue();while(1){delay_ms(10);if(scan(10)){LED1=!LED1;}}
}

连按与非连按

我们定义有效数据定义为采集时间大于某一个设定值如:b>TPAD_GATE_VAL+basevalue
我们把采集到的有效数据视为高电平,无效的视为低电平。
**非连按:**初始化后到采集第一次数据成功经历了电平从低到高,想要不连续,下一次的有效数据采集一定是低电平,才能进行下一次有效数据的采集,这样就实现了非连按
连按:不必经过从低电平到高电平阶段,在一定时间内,手为松开电容触摸按键,则自动视为采集下一次有效数据开始

细节问题

关于门槛值的定义,一定要先采集自己板子上的实际值再开始数据判断,每个开发板的实际值有差异,否则可能导致一直不成功反复修改代码

实现电容触摸按键控制LED(基于STM32F103ZET6)相关推荐

  1. FPGA之触摸按键控制LED灯实验

    一.背景介绍 简介:触摸按键在稳定性.使用寿命.抗干扰能力等方面都优于传统的机械按键,被广泛应用于遥控器,便携式电子设备,楼道开关和各种智能控制等方面. 分类 电阻式触摸按键:是由多块导电薄膜按照按键 ...

  2. 【FPGA基础快速入门6】实战-----触摸按键控制LED灯的学习

    [FPGA基础快速入门6]实战-----触摸按键控制LED灯的学习 触摸按键的种类 触摸按键主要可以分为四大类: 电阻式.电容式.红外感应式以及表面声波式. 1.电阻式触摸按键又多块导电薄膜按照按键的 ...

  3. 【正点原子FPGA连载】第十一章 触摸按键控制LED灯实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  4. verilog学习笔记- 12)触摸按键控制LED灯实验

    目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 简介: 触摸按键主要可分为四大类:电阻式.电容式.红外感应式以及表面声波式.根据其属性的不同,每种触摸按键都有其合适的使用领域. 电阻式触 ...

  5. FPGA-04 触摸按键控制LED灯

    (1)实验任务 使用触摸按键控制LED灯亮灭,开发板上电后LED为点亮状态,手指触摸后LED熄灭,再次触摸,LED点亮 (2)硬件设计 引脚分配 当OP2拉低时,触摸IC工作在同步模式(类似于非自锁的 ...

  6. 触摸按键控制LED灯

    这里采用电容式触摸按键,电容式触摸按键主要由按键IC部分和电容部分构成:按键IC用于将电容的变化转换为电信号:电容部分指的是由电容极板.地.隔离区等组成触摸按键的电容环境.电容式触摸按键主要是为了弥补 ...

  7. FPGA触摸按键控制LED——拓展:按下之后LED闪烁,再次按下停止闪烁

    实现触摸按键触摸后 led 灯闪烁,再次触摸时 led 灯停止闪烁. (野火ALTERA FPGA 教程作业训练题) 基本思路是:两个part并行嘛,一个part实现LED闪烁的部分,一直运行,另一个 ...

  8. 触摸按键控制 LED 灯实验

    1 触摸按键简介 触摸按键主要可分为四大类:电阻式.电容式.红外感应式以及表面声波式.根据其属性的不同,每 种触摸按键都有其合适的使用领域. 电阻式触摸按键由多块导电薄膜按照按键的位置印制而成,但由于 ...

  9. OpenHarmony HDF Input框架模块 按键控制LED基于小熊派micro

    文章目录 摘要 开发环境 KEY驱动程序 KeyConfigInstance: RegisterKeyDevice 中断处理函数 KeyIrqHandle RegisterInputDevice:注册 ...

最新文章

  1. j2ee与mysql乱码过滤_mysql 在 j2ee中配置的乱码问题处理
  2. 小朋友的视频直播之 nginx-rtmp
  3. 阿里大规模应用Flink踩过的坑:如何大幅降低HDFS压力?
  4. 树莓派使用python+继电器控制220V灯泡
  5. 关于java自动生成一个tostring-json,解决hibernate框架,每次全属性输出,的数据动态且限制对象的属性书写到前端,使用模板!
  6. Codeforces Round #720 (Div. 2) C. Nastia and a Hidden Permutation 交互
  7. Linux epoll 笔记(高并发事件处理机制)
  8. 【华为云技术分享】【昇腾】【玩转Atlas200DK系列】Atlas 200 DK安装python的hiai库以及opencv
  9. 瞬时极性法对正负反馈的判断方法_何为反馈?如何判断?统统告诉你
  10. 敏捷开发团队管理系列之一:序言与出发点
  11. dns、网关、IP地址,主要是配置resolv.conf\network\ifcfg-eth0
  12. sas入门之(三)条件语句,循环语句,input语句
  13. 北大青鸟汉字注释机内码_众海常用汉字机内码表
  14. “程序已停止工作”问题的解决方法,停止解决方法
  15. 开发人员的linux操作系统Tips
  16. python高清图片合成_Python用PIL合成图片
  17. 聚焦存储即平台,浪潮存储迎来发展新机遇
  18. java代码实现流程中的会签_一个简单的会签实例
  19. 国际金融统计 (IFS) 数据库1978-2020
  20. RB-tree深度探索

热门文章

  1. 治愈系好声线:唱见散搭
  2. 清华计算机系必考科目,清华大学选考科目要求
  3. Ubuntu20.04更换系统默认启动内核
  4. 高速接口中的PRBS的设计
  5. Ceph Calamari软件包介绍
  6. Python17_项目实操关卡-人机PK
  7. 前端获取当前服务器时间,不使用客户端电脑时间
  8. 台式计算机如何安装摄像头,台式机如何使用摄像头
  9. css页面一些动态效果展示
  10. VirtualBox中虚拟机的克隆方法