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

    文章

    190

    浏览量

    14759
  • 电阻
    +关注

    关注

    86

    文章

    5464

    浏览量

    171613
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632689
  • TVS
    TVS
    +关注

    关注

    8

    文章

    773

    浏览量

    60497
  • adc
    adc
    +关注

    关注

    98

    文章

    6429

    浏览量

    544034
  • 按键电路
    +关注

    关注

    1

    文章

    35

    浏览量

    21753
  • 分压电阻
    +关注

    关注

    0

    文章

    18

    浏览量

    11578

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    怎么通过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次下载

    如何采用一根微控制器的端口引线驱动多个LED

    微控制器的端口引线通常可被激励为高电平或低电平,要么被置于一种“输入”或高阻抗状态。本电路采用这三种状态实现用一根
    发表于 10-04 16:30 960次阅读
    如何<b class='flag-5'>采用</b>一根微控制器的<b class='flag-5'>端口</b>引线<b class='flag-5'>来</b>驱动<b class='flag-5'>多个</b>LED

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

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

    【GD32】GD32读取ADC数据

    读取ADC值4.将ADC值转换成电压值我这里采用PA5进行ADC的channel_5通道1.初始IO引脚/*初始化时钟*/rcu_perip
    发表于 12-02 15:06 28次下载
    【GD32】GD32<b class='flag-5'>读取</b><b class='flag-5'>ADC</b>数据

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

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

    多个ADC的基准电压

    要求您将此路径中的误差降至最低。单个ADC基准电压精度差会降低整个系统的性能,分布式负载也是如此,分布式负载由许多单独的阻性和容性负载组成。有几种方法可以为此类ADC阵列提供基准电压:
    的头像 发表于 02-25 10:51 2501次阅读
    <b class='flag-5'>多个</b><b class='flag-5'>ADC</b>的基准电压

    用GPIO读取按钮状态

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

    Windows IoT和Raspberry Pi:读取按钮

    电子发烧友网站提供《Windows IoT和Raspberry Pi:读取按钮.zip》资料免费下载
    发表于 07-10 11:13 0次下载
    Windows IoT和Raspberry Pi:<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 1589次阅读
    通过SFC 51<b class='flag-5'>读取</b>CPU的指示灯<b class='flag-5'>状态</b>