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

按键电路设计

简单电路

在开始设计按键电路时,选择合适的按键至关重要。按键的选择应基于其工作时的极限条件,尤其是电压和电流的限制。一些开关适用于大电流、高电压场景,但单片机通常不需要考虑这些极端参数。因为大多数开关的耐压值在几十伏特,额定电流在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为0xFF
    debounce[0] = (debounce[0] << 1) | KEY1;
    if (debounce[0] == 0x00) { // 8次检测都为0, 按下置位
        k1_pressed = 1;
        if (!k1_long_pressed) { // 如果长按未置位, 计数加1
            switchcount[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 100ms
        loop_gate = 0; // close gate
 
        ev = 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值,实现有效的硬件消抖。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值