普通按键电路原理:
一般使用的按键原理图如下图所示,由按键、上拉电阻和消抖滤波电容组成。按键断开时KeyIin1处电压被上拉到+5V,当按键闭合时把KeyIin1电压拉到0V,与按键并联的电容起到滤除按键按下与弹起时的高频信号。
如果在电路中需要使用多个按钮时,以上的电路缺点是占用单片机的多个接口,在单片机的管脚资源紧张的情况下可以使用以下的模拟按钮方案,仅仅需要占用一个模拟接口。
模拟多路共用按键
使用以上电路,当某个按键按下时,按键对应的电阻与R36串联构成分压电路,C12作为滤波电容,滤除干扰信号,提高ADC检测的稳定性。ADC采集R36上的电压,可以使用查表或者计算的方式得到被按下按键的序号。
这种方案优点是只需要一个模拟管脚即可识别多个按键的动作,还可以检测多个按键同时按下的动作,对模拟的精度也没有很高的要求;缺点是不能提供中断触发信号。
在分压电阻取值时应当注意不同按键按下时对应的电压差不能小于ADC的检测精度,否则无法识别到底是哪个按键按下。
Arduino UNO的内置ADC精度是十位,用二进制表达就是十个二进制位,总信息量就是2的10次方(2^10==1024),从0开始就是0~1023了。
而我们需要电压值,所以做个运算把0~1023转换为0~5V。5÷1024=0.00488伏。也就是说uno板的精度可以检测到小数点后三位,这是一个精确度很高的精确度了。如果你使用的是esp32那么内置精确度是12位,也就是2^12=4098,5伏÷4098=0.00122伏,精确度就更高了。
另外,模拟接口检测到的值并不是精确稳定的,而是会在某个电压范围内抖动,在编写程序时可以采用判断电压范围的方式来避免误判。