当前位置: 首页 > web >正文

【外围电路】按键电路设计外接信号输入设计

按键电路设计

简单电路

在开始设计按键电路时,选择合适的按键至关重要。按键的选择应基于其工作时的极限条件,尤其是电压和电流的限制。一些开关适用于大电流、高电压场景,但单片机通常不需要考虑这些极端参数。因为大多数开关的耐压值在几十伏特,额定电流在1安培左右,所以在为单片机挑选按键时,选择相对灵活,主要考虑封装形式(贴片或直插)和尺寸规格。

接下来进入电路设计阶段。单片机按键电路中最常见的问题是按键抖动,这种抖动通常发生在按键按下和释放的瞬间,持续约20毫秒,容易导致误触发。为消除抖动,可采用硬件或软件两种方案。由于当前设计侧重硬件实现,因此选择硬件消抖方式。

下面一幅图是最简单的一种电路,两个电路就是触发电平不同而已,一个按下为低电平,一个按下为高电平,但没有消除硬件抖动,若采用这种电路那势必要在单片机软件编程里面进行设置。下面将从硬件层面对这部分电路进行改进。
在这里插入图片描述
抖动一般产生在前后按下和释放时候,而且多为毛刺,这就好比是一个高频成分,那通过加电容进行滤波就可以实现,本质上是利用了电容充放电的原理。

那下面就是电容怎么加和取值的问题了。

抖动是按键产生的,那电容就应该加在按键所在的回路中。又由于其抖动大约为20ms,所以要确保电容充放电时间大于20ms.

在这里插入图片描述该电路中充放电时间为t=RCIn[(3.3-0)/(3.3-3.3*0.7)]=RCIn(10/3)=1.2RC>20ms,

这里取R为200K,C取0.1uF RC=20ms

在实际应用中,通常采用软件消抖方法,因为软件延时判断按键状态可避免增加硬件成本。但在某些特定场景下,硬件消抖仍具有其独特优势。

升级电路

这个电路适用于需要通过物理开关控制信号输出的应用场景,例如按键控制模块。
在这里插入图片描述
以下是对该电路的详细分析:

电路组成

  • 输入端 :VCC(电源输入)、GND(地)。
  • 输出端 :KEY_IO(按键信号输出)。
  • 元件 :SW2(按键开关)、R1(10KΩ电阻)、R2(1KΩ电阻)、C1(100nF电容)、D1(ESD保护二极管)。

工作原理

  • 当开关SW2断开时

    • R1(10KΩ电阻)将VCC与KEY_IO连接,使KEY_IO输出高电平(接近VCC电压)。此时,R2(1KΩ电阻)和C1(100nF电容)形成一个简单的RC滤波电路,用于平滑KEY_IO的输出信号,防止由于开关断开导致的电压波动。
    • D1(ESD保护二极管)反向连接在KEY_IO输出线上,用于防止静电放电对电路造成损坏。
  • 当开关SW2闭合时

    • KEY_IO直接与地(GND)连接,输出低电平(0V)。此时,R1(10KΩ电阻)和R2(1KΩ电阻)形成一个分压网络,但主要作用是确保KEY_IO输出稳定,防止由于开关动作引起的电压波动。
    • D1(ESD保护二极管)依然起到保护作用,防止静电放电对电路造成损坏。

电路功能

  • 该电路主要用于通过开关SW2控制KEY_IO的输出电平,实现简单的高低电平切换功能。

电路特点 | 元件作用

  • R1 上拉电阻 : 将不确定的信号通过一个电阻钳位在高电平,维持在不被触发的状态或是触发后回到原状态。上拉电阻的阻值较大,可以减少功耗,同时保证信号的稳定性。
  • R2 限流电阻 :当开关SW2闭合时,KEY_IO直接与地连接,输出低电平。R2(1KΩ电阻)在一定程度上限制了电流,保护电路。
  • 滤波功能 :C1(100nF电容)与R2(1KΩ电阻)形成一个简单的RC滤波电路,用于平滑KEY_IO的输出信号,减小按键抖动及高频信号干扰。
  • 静电保护 :D1(ESD保护二极管)反向连接在KEY_IO输出线上,用于防止静电放电对电路造成损坏,提高电路的可靠性。(这个根据PCB的成本及防护级别要求来决定添加与否)

可能存在的问题及改进建议

  • 信号稳定性和抗干扰能力 :如果电路对信号稳定性和抗干扰能力有较高要求,可以考虑增加一个抗干扰电容(如在KEY_IO输出线上添加一个10nF的电容)或使用施密特触发器来提高信号的稳定性。
  • ESD保护二极管的选择 :D1的选取决定了电路的静电保护能力。如果应用环境对静电防护要求较高,可以选择具有更高静电防护能力的ESD保护二极管。

外接信号输入设计

在这里插入图片描述
有以下事项注意点:
1、R3上拉电阻 将不确定的信号通过一个电阻钳位在高电平,维持在不被触发的状态或是触发后回到原状态。(如果外接的连接线比较长,芯片内部上拉能力比较弱,则建议加上。平时通信距离不长,有内部上拉则可以省略)

2、C2电容 防止高频信号干扰。(注意,如果输入频率信号比较大,C2容值要对应减少,或者直接省略C2)

嵌入式设备按键消抖笔记

按键抖动效应

按键抖动是指在按键按下和释放的瞬间,由于机械开关的弹性作用,会产生多次短路与开路之间的切换,导致电平变化不稳定,产生毛刺信号。这种抖动效应对电路的正常工作产生干扰,可能导致误触发等问题。抖动时间通常在20毫秒左右,但具体时间因按键类型和使用环境而异。

硬件消抖方法

RC滤波电路

  • 原理 :利用电阻和电容的充放电特性,对按键产生的毛刺信号进行滤波。将电容并联在按键两端,电阻串联在按键电路中。

  • 计算 :根据截止频率公式 f L P = 1 2 π R C = 0.1 ⋅ f b o u n c e f_{LP} =\frac{1}{2\pi RC} =0.1\cdot f_{bounce} fLP=2πRC1=0.1fbounce,其中 f L P f_{LP} fLP为低通滤波器的截止频率, f b o u n c e f_{bounce} fbounce为抖动频率,
    选择合适的电阻和电容值。常见的组合有:

    • 低通频率设为 10KHz,对应 160Ω 电阻和 100nF 电容,或 1KΩ 电阻和 16nF 电容。
    • 低通频率设为 1KHz,对应 1KΩ 电阻和 160nF 电容。
    • 低通频率设为 100Hz,对应 10KΩ 电阻和 160nF 电容。
  • 示例 :使用 10KΩ 电阻和 100nF(104)电容作为硬件防抖处理。

  • 局限性 :RC滤波电路可能会带来阻尼振荡现象,导致超量电压对电路造成伤害。

其他硬件消抖方法

  • RS触发器 :利用RS触发器吸收按键的抖动,一旦有键按下,触发器立即翻转,触点的抖动便不会再对输出产生影响。
  • 专用消抖芯片 :使用专门的消抖芯片来处理按键输入信号,内部已经实现了高效的消抖算法。

软件消抖方法

软件处理分两种情况, 如果仅仅需要检测短按, 是比较简单的, 声明一个volatile static a变量用于表示按键状态, 声明一个static uint8_t b变量用于计数, 每个循环的检测中, 低电平(假定按下为低电平)b加1, 当b值计数到达一个阈值时表示按钮按下, 将a置位, 当循环中检测到高电平时将a和b都清零.

如果需要检测短按和长按, 就需要三个变量, 除了上面的a和b以外, 再增加一个循环计数c. 检测的每个循环中, 先按检测短按的方式, 做短按判断, 另外再通过第三个变量记录短按的次数, 当达到预设的长按判断的次数阈值时, 判断为长按. 要注意的是

  1. 短按的置位要由按钮释放触发
  2. 长按的置位由按钮按下触发
  3. 长按释放时, 要避免判断为短按

下面是一段实际应用中的代码, 会在一个间隔10ms的定时器中调用, 其中

  • KEY1 为按键对应的IO口, 例如P01
  • debounce[0] 为按键1对应的防抖延时计数器
  • k1_pressed 当判断按键1为按下时置位, 全局使用
  • switchcount[0] 按键1对应的长按键计数器,SW_CNTMAX为判断阈值
  • k1_long_pressed 当判断按键1为长按时置位, 全局使用
  • event 按键事件, 全局使用
void read_key1(void)
{//未按下时, KEY1处于高电平, 因此debounce为0xFFdebounce[0] = (debounce[0] << 1) | KEY1;if (debounce[0] == 0x00) { // 8次检测都为0, 按下置位k1_pressed = 1;if (!k1_long_pressed) { // 如果长按未置位, 计数加1switchcount[0]++;}} else { // 按键已松开或未按下if (k1_pressed) {if (!k1_long_pressed) {// 如果短按已置位, 但是长按未置位, 按短按发出系统消息event = EV_K1_SHORT;}// 清理状态和计数器k1_pressed = 0;k1_long_pressed = 0;switchcount[0] = 0;}}if (switchcount[0] > SW_CNTMAX) {// 如果长按计数器已经达到阈值, 长按置位(避免松开时发出短按消息), 发出长按系统消息k1_long_pressed = 1;switchcount[0] = 0;event = EV_K1_LONG;}
}

按键消息处理

按键的系统消息通常通过状态机模型进行处理。在每个按键处理循环中:

  1. 清除全局消息。
  2. 根据当前的按键状态,判断长按和短按对应的下一个状态。
  3. 下一个循环,跳到对应的按键状态,再去判断下一个状态。
  4. 根据按键状态决定当前的显示模式。
void main(void)
{//...while (true){while (!loop_gate); // wait for open every 100msloop_gate = 0; // close gateev = event;event = EV_NONE;switch (kmode){case K_DISP_SEC:dmode = D_DISP_SEC;if (ev == EV_K2_SHORT) {kmode = K_DISP_ALARM;m_timeout = TIMEOUT_SHORT;}break;//...case K_NORMAL:default:dmode = D_NORMAL;if (ev == EV_K1_SHORT) {kmode = K_DISP_DATE;m_timeout = TIMEOUT_SHORT;} else if (ev == EV_ALARM) {kmode = K_BUZZ_ALARM;m_timeout = TIMEOUT_LONG;}else if (ev == EV_K1_LONG)kmode = K_SET_MINUTE;else if (ev == EV_K2_SHORT)kmode = K_DISP_SEC;else if (ev == EV_K2_LONG)kmode = K_SET_ALARM_MINUTE;}
//...}
}

总结

  • 硬件消抖 :适用于对实时性要求较高的场景,能够有效地滤除按键抖动信号,但可能会带来阻尼振荡等问题。RC滤波电路是最常用的硬件消抖方法之一,其参数选择需要根据具体的抖动时间和电路要求进行计算。
  • 软件消抖 :具有灵活性高、成本低等优点,但对处理器的性能有一定要求,且可能会增加软件的复杂度。在实际应用中,可以根据具体的项目需求和资源限制,选择合适的消抖方法或结合硬件和软件消抖的方法,以实现最佳的按键处理效果。
    参考链接:

RC电路计算应用

要使用RC滤波电路对按键抖动进行硬件消抖,假设按键抖动时间一般为20ms,以下是详细的计算过程和实际应用中的建议:

1. RC滤波电路的基本原理

RC滤波电路利用电阻(R)和电容(C)的充放电特性,对按键产生的毛刺信号进行滤波,从而实现消抖。电容并联在按键两端,电阻串联在按键电路中。当按键按下或释放时,电容会根据按键状态进行充放电,形成平滑的上升或下降沿。

2. 截止频率的计算

RC低通滤波器的截止频率公式为: f c = 1 2 π R C = 0.1 ⋅ f b o u n c e f_{c} =\frac{1}{2\pi RC} =0.1\cdot f_{bounce} fc=2πRC1=0.1fbounce,其中:

  • (f_c) 是截止频率;
  • (R) 是电阻的阻值(单位:Ω);
  • (C) 是电容的容值(单位:F)。

截止频率决定了滤波器对信号的过滤能力。通常,按键抖动产生的毛刺信号主要包含高频成分,因此需要选择合适的截止频率来滤除这些高频噪声,同时保留按键的有效信号。

3. 时间常数的计算

时间常数 τ \tau τ 是RC电路充放电时间的度量,公式为: τ = R C \tau =RC τ=RC。时间常数 τ \tau τ 决定了电容充放电的速度。为了有效滤除按键抖动,时间常数 τ \tau τ 应大于抖动持续时间,即20ms。

4. 具体计算

假设按键抖动时间为20ms,我们需要选择合适的R和C值,使得时间常数 τ \tau τ 大于20ms。

示例1:选择电阻值

如果选择电阻值R=10KΩ,则根据时间常数公式,电容值C应满足:
在这里插入图片描述

示例2:选择电容值

如果选择电容值C=100nF,则根据时间常数公式,电阻值R应满足:
在这里插入图片描述

5. 常见组合

根据实际应用经验,以下是一些常见的RC组合,适用于按键消抖:

  • R=10KΩ,C=1μF(时间常数τ=10ms);
  • R=1KΩ,C=22μF(时间常数τ=22ms);
  • R=100Ω,C=470μF(时间常数τ=47ms)。

6. 实际应用中的建议

  • 响应速度与消抖效果的平衡:时间常数τ越大,消抖效果越好,但按键响应速度会稍有延迟。通常,τ设置在20ms左右既能有效消抖,又能保证较快的响应速度。
  • 阻抗匹配:RC滤波电路的阻抗会影响信号的传输,应确保滤波器的阻抗与其他电路部分匹配,避免信号衰减。
  • 元件选择:选择标准值的电阻和电容,便于采购和焊接。例如,常用的电阻值有100Ω、1KΩ、10KΩ等,电容值有100nF、1μF、10μF等。

通过以上计算和建议,可以根据具体的按键抖动时间和电路要求,选择合适的RC值,实现有效的硬件消抖。


按键电路
硬件消抖——开关并联电容的那点事儿
嵌入式设备中按键的硬件消抖, 软件消抖和按键消息处理

http://www.xdnf.cn/news/3979.html

相关文章:

  • Go小技巧易错点100例(二十九)
  • rollout 是什么:机器学习(强化学习)领域
  • 【Vue】Vue3源码解析与实现原理
  • 关于 dex2oat 以及 vdex、cdex、dex 格式转换
  • VLA算法总结对比——RT1 / RT2 / Pi0 / Octo/ RDT / OpenVLA
  • 钩子函数和参数:Vue组件生命周期中的自定义逻辑
  • 2.3 向量组
  • Linux电源管理(6)_Generic PM之挂起功能
  • Ubuntu K8S(1.28.2) 节点/etc/kubernetes/manifests 不存在
  • n8n工作流自动化平台:生成图文并茂的分析报告之Merge节点详细说明
  • labelimg快捷键
  • DXFViewer进行中 : ->封装OpenGL -> 解析DXF直线
  • SpringMVC框架详解与实践指南
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.3 数据脱敏与安全(模糊处理/掩码技术)
  • 力扣119题解
  • 六、shell脚本--正则表达式:玩转文本匹配的“万能钥匙”
  • Java使用JDBC操作数据库
  • OpenCV进阶操作:图像直方图、直方图均衡化
  • 2.CFD 计算过程概述:Fluent在散热计算中的优势
  • 【Linux】linux入门——基本指令
  • Qt 信号槽机制底层原理学习
  • C++笔记之模板与可变参数模板
  • 动态链接库(DLL)
  • 网狐飞云娱乐三端源码深度实测:组件结构拆解与部署Bug复盘指南(附代码分析)
  • LeetCode 热题 100 17. 电话号码的字母组合
  • 分布式事物
  • VTK 系统架构
  • 【NLP】33. Pinecone + OpenAI :构建自定义语义搜索系统
  • 五一作业-day04
  • 解决跨域的4种方法