如上图为一个电容按键结构图,由绝缘材料、金属感应片以及FR-4板材构成,金属感应片和接地的金属片形成一个等效电容Cx,当手指触摸时金属感应片和手指会形成一个Cs等效电容。
工作原理:
在电路板未上电时,可以认为电容Cx是没有电荷的,在上电时,在电阻作用下,电容Cx就会有一个充电过程,直到电容充满, 即Vc电压值为3.3V,这个充电过程的时间长短受到电阻R阻值和电容Cx容值的直接影响。但是在我们选择合适电阻R并焊接固定到电路板上后,这个充电时间就基本.上不会变了,因为此时电阻R已经是固定的,电容Cx在无外界明显干扰情况下基本上也是保持不变的。
当手指触摸时,相同的电阻R情况下,电容容值=Cx+Cs,电容容值增大了,这就导致需要更长的充电时间,通过判断充电时间就可以判断电容按键是否被按下。
测量充电时间:
我们可以利用定时器输入捕获功能计算充电时间,即设置TIMx_CH为定时器输入捕获模式通道。这样先测量得到无触摸时的充电时间作为比较基准,然后再定时循环测量充电时间与无触摸时的充电时间作比较,如果超过一定的阈值就认为是有手指触摸。
图33-4 为Vc跟随时间变化情况,可以看出在无触摸情况下,电压变化较快;而在有触摸时,总的电容量增大了,电压变化缓慢一些。
为测量充电时间,我们需要设置定时器输入捕获功能为上升沿触发,图33-4中Vq就是被触发_上升沿的电压值,也是STM32认为是高电平的最低电压值,大约为1.8V。 tl和t2可以通过定时器捕获/比较寄存器获取得到。
不过,在测量充电时间之前,我们必须想办法制作这个充电过程。之前的分析是在电路板上电时会有充电过程,现在我们要求在程序运行中循环检测按键,所以必须可以控制充电过程的生成。我们可以控制TIMx_ CH引脚作为普通的GPIO使用,使其输出一小段时间的低电平,为电容Cx放电,即Vc为0V。当我们重新配置TIMx_ _CH 为输入捕获时电容Cx在电阻R的作用下就可以产生充电过程。