0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

采用单个ADC端口来读取多个按钮状态的方法

硬件攻城狮 来源:TsinghuaJoking 作者:TsinghuaJoking 2023-10-07 15:19 次阅读

利用单片机ADC端口,可以读取多个按钮的状态。在设计过程中,需要综合考虑到按扭的个数与读取的可靠性,特别是对选择电阻的阻值进行优化,使得不同分压数值之间相差最大。如果按键面板需要通过长的引线与单片机电路相连,还需要对接口电路进行保护以提高电路的EMC特性。

01 读取按键

按键是单片机系统中人机交互常用到的方法,通常情况下,通过普通的IO端口可以获得按键开关状态。在某些电子系统设计中,如果碰到按钮比较多,但单片机的IO口不够使用的时候,则需要通过端口扩展的方式来增加读取按钮的数量。比如通过并串转换芯片,8-3编码芯片等等。

今天看到 公众号电路啊中的一篇推文:电视机的按键功能是用什么电路实现的?经典ADC按键电路[1] 介绍了在一款电视机中,采用单个ADC端口来读取多个按钮状态的方法。

一、电路原理

1、电路原理图

按键面板中的三个引线中,其中一个是电路地线,另外两个是信号线,分别接入主板中MCU的两路ADC端口。这两条线在主板上都通过3.3kΩ的电阻接到电源(3.3V)。在面板上,有多个按钮与电阻的串联之后连接在信号线与地线之间。

1da6168a-64d8-11ee-939d-92fbcf53809c.png

▲ 图1.1.1 工作原理说明图

并联在 一起的按钮所串联的电阻不同,所以每个按钮按下之后,信号线的电压就是上拉电阻与按键串联电阻对电源的分压。由于每个按键串联电阻不同,所以对应信号线电压也就不同了。经过单片机ADC读取电压值之后,在与事先确定下的每个按键分压范围进行对比,从而可以确定是哪一个按钮被按下。

【表1-1-1 不同按键对应的电压】

75 ohm 1000 ohm 3300 ohm 6800 ohm
0.07 V 0.77 V 1.65 V 2.22 V
SW1 SW2 SW3 SW4

2、按键个数

根据上述原理,一条ADC端口可以读取按钮的个数是非常多的,它的上限受到以下因素影响:

单片机ADC分辨率;

分压信号的稳定性和噪声范围;

机械按键接触电阻;

分压电阻偏差与稳定性等。

为了可靠的通过ADC读取的模拟分压电压来确定按键,需要合理选择分压电阻,使得每个按键所对应的电压之间的间隔越大越好。在上述实际设计的电路中,每个ADC端口只读取了四个按钮的状态,总共采用了两个ADC端口读取了7个(< 8个)按键状态。

二、电路改进

1、增加接口可靠性

由于按键板与电路主板之间通过三根线连接,为了提高电路工作的可靠性,在按键电路接口中增加了R、C、TVS来消除静电、电磁干扰对主控板的影响。

1de39924-64d8-11ee-939d-92fbcf53809c.png

▲ 图1.2.1 增加有提高EMC接口电路

对于电路中的RC滤波器参数选择,需要综合考虑滤除噪声的频率范围以及电路稳定时间。不能够为了降低噪声一味增加RC时间常数,还需要考虑按键动作时,对应的分压信号达到稳定的过渡时间的大小。

02 更多按键

在前面案例中,每个ADC只读取四个按键,下面给出一些可以读取更多按键的方案。

一、八个按键

1、电路原理图

下面是在推文经典ADC按键电路[2]中给出的已经批量应用的八按键ADC读取电路配置方案。

1df9cfe6-64d8-11ee-939d-92fbcf53809c.png

▲ 图2.1.1 被批量使用的八个按键方案

2、按键对应的电压值

按照电路中的电阻参数,可以计算出每个按键对应的信号分压电压值:

【表2-1-1 八个按键对应的信号电压】

0 ohm 510 ohm 680 ohm 1000 ohm 1200 ohm 2200 ohm 4700 ohm 15000 ohm
0.00 V 0.32 V 0.67 V 1.05 V 1.38 V 1.79 V 2.27 V 2.78 V
SW1 SW2 SW3 SW4 SW5 SW6 SW7 SW8

1e1408ac-64d8-11ee-939d-92fbcf53809c.png

▲ 图2.1.2 八个按键对应的信号电压

3、方案特点

在这个电路中,后面按键对应的电阻值是由前面所有串联电阻累加和。

这个电路的巧妙之处在于,按键具有优先级之分。假设按下了按键SW1,那么再按下SW2-SW8中的任何一个都是不起作用的,即SW1的优先级最高,SW2次之,以此类推。

二、组合按键

上面电路中不允许使用组合按键,即通过两个或者两个 以上的按摩同时按下代表更多的功能。

1、三个按键组合输入

下面电路中,只使用3按钮便可以获得8个状态的输入。

1e1f6314-64d8-11ee-939d-92fbcf53809c.png

▲ 图2.2.1 利用电阻组合完成多个多个按钮输入

需要通过适当选择的阻值,使得八种不同的按键组合,所得到的八个电压之间的间隔最大,这样才能够保证ADC通过分压数值确定状态时更加可靠。

利用程序对进行搜索,搜索范围(100,10k),搜索步长:50欧姆。可以获得一组最优电阻取值:

最小的电压间隔为:0.152V。

下面是八种按键组合所得到的电压,从小到大的电压值。

['1.19V', '1.37V', '1.53V', '1.68V', '1.83V', '2.05V', '2.43V', '3.30V']

※ 总  结 ※

利用单片机的ADC端口,可以读取多个按钮的状态。在设计过程中,需要综合考虑到按扭的个数与读取的可靠性,特别是对选择电阻的阻值进行优化,使得不同分压数值之间相差最大。

如果按键面板需要通过长的引线与单片机电路相连,还需要对接口电路进行保护以提高电路的EMC特性。


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串联电阻
    +关注

    关注

    1

    文章

    173

    浏览量

    14607
  • 电阻
    +关注

    关注

    85

    文章

    5037

    浏览量

    169637
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620831
  • TVS
    TVS
    +关注

    关注

    8

    文章

    708

    浏览量

    59971
  • adc
    adc
    +关注

    关注

    95

    文章

    5651

    浏览量

    539460
  • 按键电路
    +关注

    关注

    1

    文章

    35

    浏览量

    21608
  • 分压电阻
    +关注

    关注

    0

    文章

    18

    浏览量

    11478

原文标题:单个端口读取多个按钮(ADC按键电路)

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    分享4个单个电源控制多个环路的案例

    用作参考(图1,D2)。这有助于将放大器的输出电压钳位到一个较低值,从而防止饱和并加快响应速度。需要添加的单独参考以及软性电路是采用多个外部放大器的方法又一缺点,因为这会增加系统的复杂性和成本。  第二个
    发表于 11-19 21:59

    请问有什么更好更简便的方法来测量ADC的静态参数?

    1000mV的DC量测试多个点,然后从中分析ADC的线性度参数。 网上说这种测试方法不能够完整反映出ADc的性能参数。而且,后期可能会改版为AC耦合,就更不能
    发表于 08-24 11:28

    分享4个单个电源控制多个环路的案例

    的输出端添加一个额外的二极管用作参考(图1,D2)。这有助于将放大器的输出电压钳位到一个较低值,从而防止饱和并加快响应速度。需要添加的单独参考以及软性电路是采用多个外部放大器的方法又一缺点,因为这会
    发表于 10-09 10:45

    单个电源可控制多个环路

    放大器的输出端添加一个额外的二极管用作参考(图1,D2)。这有助于将放大器的输出电压钳位到一个较低值,从而防止饱和并加快响应速度。需要添加的单独参考以及软性电路是采用多个外部放大器的方法又一缺点,因为
    发表于 11-30 17:14

    怎么通过ADC建议如何读取多个温度值?

    大家好,现在我可以通过ADC读取两个温度值(即60和90度),我通过计算NTC热敏电阻表中的值读取这个温度。但现在我看不到超过2个温度,我已经定义了至少5个温度,但能读懂2,就可以通
    发表于 09-20 15:45

    请问有什么更快的方法读取ADC通道吗?

    我的ADC运行在12MHz,采样5个通道,实际采样速率为100kHz。我只是注意到,使用ADCJGETRESULT16.()命令读取单个信道,以48 MHz的CPU速度获得一个叫声1US。阅读5个
    发表于 10-30 10:06

    怎样才能跨多个集线器从LPC5411x枚举多个串行端口

    由于 ES_LPC5411x 中的勘误表 USB.1,需要 TN00031 中的解决方法才能跨多个 USB 集线器实现无晶体 USB。我正在研究从单个设备支持多个串行
    发表于 05-06 07:03

    如何使用S32K146定期对单个ADC通道进行采样?

    ;PDB定时器在读取ADC转换后重新启动,但使用这种方法,采样周期略长于PDB延迟时间。最好的方法是什么?我在参考手册中读到 PDB 具有“背靠背”模式,但我相信这是为了按顺序
    发表于 05-30 12:30

    关于S32K144读取多个ADC频道的问题

    以下代码只读取一个频道, 读取多个频道 ADC 所需的配置 。 Adc_Ip_Init(ADC
    发表于 09-14 11:09

    单个PRM驱动多个VTMs

    单个PRM驱动多个VTMs 的有用PDF。
    发表于 01-06 17:58 0次下载

    多个ADC如何工作在级联模式中使用的详细资料概述

    许多应用需要系统中的多个模数转换器(ADC)。级联多个ADC允许使用单个数据接收器或小型FPGA,这提供更低的功耗和独立的
    发表于 05-18 16:44 22次下载
    <b class='flag-5'>多个</b><b class='flag-5'>ADC</b>如何工作在级联模式中使用的详细资料概述

    如何使用Arduino UNO创建简单的Modbus设备

    您可以按Modbustester中的“读取按钮。该命令将读取我们新的从设备的存储器的8个字节。在地址400008中,您可以找到按钮状态
    的头像 发表于 11-15 10:05 1.5w次阅读

    仅使用两根电线即可感应多个按钮

    对于只需要不到键盘或数字键盘的应用,这个简单的电路使用单个多通道1-Wire可寻址开关(DS2408)和几个外部元件来监视多个按钮开关。
    的头像 发表于 01-14 12:00 929次阅读
    仅使用两根电线即可感应<b class='flag-5'>多个</b><b class='flag-5'>按钮</b>

    用GPIO读取按钮状态

    树莓派的GPIO可以控制发光二极管,这是GPIO的Output(输出)能力,它也具有input(读取)的能力,所以才能叫做I/O(输入/输出)端口。今天我们就来用GPIO的引脚来读取按钮
    的头像 发表于 07-02 15:06 905次阅读
    用GPIO<b class='flag-5'>读取</b><b class='flag-5'>按钮</b><b class='flag-5'>状态</b>

    通过SFC 51读取CPU的指示灯状态

    可以通过SFC 51读取CPU的指示灯状态,使用的SSL_ID参数为16#74(16#19)读取全部指示灯状态 或者16#174(16#119)读取
    的头像 发表于 07-24 16:34 864次阅读
    通过SFC 51<b class='flag-5'>读取</b>CPU的指示灯<b class='flag-5'>状态</b>