浅析五向按键的硬件设计思想

五向按键简介

五向键是一种多功能按键,除了具备普通按键的PUSH功能外,他还具备四个朝向的指向。因为他具备了五种按键动作,故名五向键!

它有6个引脚,其中一只引脚是公共端,一般是第5脚,而和第5脚对称的是第2脚,第2脚就代表了PUSH功能。按键正上面有一个三角缺口,代表着按键的一种朝向关系。对于封装设计者要对此内容特别注意。

不过好在立创商城已经绘制好了封装,可以很方便的知道各个引脚的走向。根据摆放关系,稍加旋转就能找出上下左右和引脚的对应关系。

五向按键原理图分析

下面这张图纸采用了CC2541开发板的一种五向键原理,这个也是我今天重点想分析的电路。

输出电压电路分析

为了方便分析,首先对此原理图做一下变型,因为LTspice中没加入LM258D,所以用AD8032暂时替代。这个电路主要应用了运放的虚接虚短原理和基尔霍夫电流定律,就能一步步的推导出不同按键按下时候VO的输出值。

具体分析过程:

第一步: 求参考点电位1。

根据分压原理,很容易计算出1点电位1.03V,那么根据运放虚短,所以正相输入引脚电位1.03V。

第二步:求运放2点的电位。

现在是UP按下,所以Up与VCC接通,R6两端的压差为3.3-1.03=2.27V,那么流过R6的电流预计22.7uA。其他之路电流关系如下,R6支路已经求出,那么R7,R8,R9之路很容易计算出总电流

I支=3.54+2.125+1.398=7.063uA;根据流入电流等于流出电流,那么R12和R13合并的电流应该为

(22.7uA-7.063uA)=15.637uA,进一步可以推导出压降为0.7818,所以2点电位=1.03-0.7818=0.248V

第二步:求运放3点的电位。

(0.248/47)*67=0.353V,与设计仿真结果相差30mV。因为这个实际仿真中用到的器件模型并不是理想模型,他计算出来的1点电位是1.06V,R12两端的压降是0.7882V,所以2点电位是0.2718V(1.06V-0.7882V),根据这个值推导出3点电位是0.38V.

举一反三,DN,LT,RT 三个方向按下时候,也能求出一个固定的数值。 这样运放加电阻网络的电路实现了不同按键不同的输出电压效果。

中断电路分析

上图是一个或门电路,实现的效果就是见1则1,这些电位都是100K电阻拉低,当有按键按下后,电位与3.3V接通,所以是逻辑1,这样P2.0有一个从0到1的跳变过程,MCU发生中断,之后调用ADC读取此时的ADC电压,这样就可以实现了中断加ADC的多个按键判断。好处是ADC可以不用实时轮询,节省CPU开支,同时也能节省设备的功耗。 缺点是器件多,成本高。

但是这种电路还有另外一个变型,是馒头科技设计的一个电路。

这个电路Vref的电位是0.33V,其他按键按下的电压通过LMV358的一路运放用作电压跟随器与ADC相连,另一路运放作为比较器使用,也能实现JOY_CHK的0到1的跳变。挺巧秒的。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ThreadLocal 是 Java 中的一个类,它提供了一种线程局部变量的机制。线程局部变量是指每个线程都有自己的变量副本,每个线程对该变量的访问都是独立的,互不影响。 ThreadLocal 主要用于解决多线程并发访问共享变量时的线程安全问题。在多线程环境下,如果多个线程共同访问同一个变量,可能会出现竞争条件,导致数据不一致或者出现线程安全问题。通过使用 ThreadLocal,可以为每个线程提供独立的副本,从而避免了线程安全问题。 ThreadLocal 的工作原理是,每个 Thread 对象内部都维护了一个 ThreadLocalMap 对象,ThreadLocalMap 是一个 key-value 结构,其中 key 是 ThreadLocal 对象,value 是该线程对应的变量副本。当访问 ThreadLocal 的 get() 方法时,会根据当前线程获取到对应的 ThreadLocalMap 对象,并从中查找到与 ThreadLocal 对象对应的值。如果当前线程尚未设置该 ThreadLocal 对象的值,则会通过 initialValue() 方法初始化一个值,并将其存入 ThreadLocalMap 中。当访问 ThreadLocal 的 set() 方法时,会将指定的值存入当前线程对应的 ThreadLocalMap 中。 需要注意的是,ThreadLocal 并不能解决共享资源的并发访问问题,它只是提供了一种线程内部的隔离机制。在使用 ThreadLocal 时,需要注意合理地使用,避免出现内存泄漏或者数据不一致的情况。另外,由于 ThreadLocal 使用了线程的 ThreadLocalMap,因此在使用完 ThreadLocal 后,需要手动调用 remove() 方法清理对应的变量副本,以防止内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬件老搬张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值