【STM32】电容触摸按键

电容按键就是酷,但据我使用过电容按键版的洗澡计费机子后,一生黑(湿手优化没做好的电容按键简直稀碎)。

大部分图片来源:正点原子HAL库课程

 专栏目录:记录自己的嵌入式学习之路-CSDN博客


目录

1    触摸按键原理

2    测量是否触摸的原理

3    关键点

3.1    充电时间测量

3.2    开机校准

3.3    轮询充电时间

3.4    阻止多次按下的响应


1    触摸按键原理

触摸按键可以理解为一个电容。


2    测量是否触摸的原理


3    关键点

3.1    充电时间测量

(1)    放电并进入充电状态:

        a)    GPIO设置为推挽输出,并输出低电平,延时个几毫秒让电容放电;

        b)    将输入捕获的标志位清空;

        c)    将计数器的值清空;

        d)    GPIO设置为浮空输入,这里注意上下拉一定要设置为无,否则默认是上拉输入,就不是浮空了。

(2)    获取充电上升沿产生时间:

        a)    循环检测输入捕获标志位;

        b)    若标志为RESET,则在循环中一次次获取计数器的值,若计数器的值快溢出了,就视为超时,返回计数器的值;

        c)    若标志位SET则不进入循环,直接输出输入捕获的比较值,该值则为充电过程中的计数次数。

3.2    开机校准

开发板上电的时候就需要测试一次没有触摸时的充电时间,可以在定时器初始化后调用测量。

校准时可以考虑多次测量,去掉最大值,去掉最小值,再平均,以获得较为准确的无触摸充电时间。

3.3    轮询充电时间

使用定时器或者在main函数while循环中定期调用充电时间测量函数进行测量,若测出来的充电时间大于初始的无触摸充电时间一定程度(注意⚠️!是大于一定程度,而不是仅仅大于,因为无触摸时充电时间也有一定的跳动,因此应该大于其一定程度才能算触摸了),则可以判定触摸按键被触摸。

此处,轮询的每一次都可以考虑多次测量,去掉最大值,去掉最小值,再平均,以获得较为准确的触摸充电时间。

3.4    阻止多次按下的响应

使用一个标志,在按下后置1,且每次按下后当且仅当该标志为0时才发生按键响应动作,而在检测到没按下的状态将该标志置0。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值