电容按键就是酷,但据我使用过电容按键版的洗澡计费机子后,一生黑(湿手优化没做好的电容按键简直稀碎)。
大部分图片来源:正点原子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。