嵌入式单片机高级篇(一)Stm32F103电容触摸按键

Stm32F103电容触摸按键

一、电容触摸按键原理:
1、电容触摸按键电路是如何组成的?
回答:电容触摸按键的电路由一个上拉电阻、一个开关以及杂散电容组成,开关断开时,杂散电容充电,开关闭合时,杂散电容放电
2、电容触摸按键如何判别按键是否被触摸?
回答:根据电容的充电时间,当按键没有触摸时,电源只给杂散电容充电,充电时间较短,记为tcs,当按键被触摸时,相当于与杂散电容并联了一个额外的电容,此时电容充电时间变长,记为ts+tx,由电路里的总电容的充电时间的长短来判别按键是否被触摸。
当充电时间在tcs附近时,认为按键没有被触摸,当充电时间大于ts+tx时,认为按键被触摸
二、编程思路:
(1)电容的充电完成会产生一个上升沿
(2)用IO口代替开关,当IO口的状态配置成推挽输出低电平时放电,当IO口的状态配置成浮空输入时充电
(3)利用定时器的输入捕获功能捕捉到上升沿代表电容充电完成
(4)MCU 每次复位重启的时候,利用定时器捕捉上升沿,同时记录从开始到捕获到上升沿的时间,这个时间多次记录取平均值,也就是ts
三、程序实现:
第一步,配置定时器的输入捕获(定时器5通道2):

void TIM5_CH2_Cap_Init(u16 arr,u16 psc)
{
   
GPIO_InitTypeDef GPIO_InitStructure; 
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM5_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能 TIM5 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 PA 时钟
//设置 GPIOA.1 为浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 端口配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.1
 //初始化 TIM5 
TIM_TimeBaseStructure.TIM_Period = arr; //设定

你可能感兴趣的:(嵌入式,嵌入式单片机高级篇,电容触摸按键,单片机,stm32,电容触摸按键)