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

关键词MCUADC按键

#mermaid-svg-oLUHkDZa4YVBoajD .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-oLUHkDZa4YVBoajD .label text{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .node rect,#mermaid-svg-oLUHkDZa4YVBoajD .node circle,#mermaid-svg-oLUHkDZa4YVBoajD .node ellipse,#mermaid-svg-oLUHkDZa4YVBoajD .node polygon,#mermaid-svg-oLUHkDZa4YVBoajD .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-oLUHkDZa4YVBoajD .node .label{text-align:center;fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .node.clickable{cursor:pointer}#mermaid-svg-oLUHkDZa4YVBoajD .arrowheadPath{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-oLUHkDZa4YVBoajD .flowchart-link{stroke:#333;fill:none}#mermaid-svg-oLUHkDZa4YVBoajD .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-oLUHkDZa4YVBoajD .edgeLabel rect{opacity:0.9}#mermaid-svg-oLUHkDZa4YVBoajD .edgeLabel span{color:#333}#mermaid-svg-oLUHkDZa4YVBoajD .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-oLUHkDZa4YVBoajD .cluster text{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-oLUHkDZa4YVBoajD .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-oLUHkDZa4YVBoajD text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-oLUHkDZa4YVBoajD .actor-line{stroke:grey}#mermaid-svg-oLUHkDZa4YVBoajD .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-oLUHkDZa4YVBoajD .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-oLUHkDZa4YVBoajD #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-oLUHkDZa4YVBoajD .sequenceNumber{fill:#fff}#mermaid-svg-oLUHkDZa4YVBoajD #sequencenumber{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD #crosshead path{fill:#333;stroke:#333}#mermaid-svg-oLUHkDZa4YVBoajD .messageText{fill:#333;stroke:#333}#mermaid-svg-oLUHkDZa4YVBoajD .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-oLUHkDZa4YVBoajD .labelText,#mermaid-svg-oLUHkDZa4YVBoajD .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-oLUHkDZa4YVBoajD .loopText,#mermaid-svg-oLUHkDZa4YVBoajD .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-oLUHkDZa4YVBoajD .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-oLUHkDZa4YVBoajD .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-oLUHkDZa4YVBoajD .noteText,#mermaid-svg-oLUHkDZa4YVBoajD .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-oLUHkDZa4YVBoajD .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-oLUHkDZa4YVBoajD .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-oLUHkDZa4YVBoajD .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-oLUHkDZa4YVBoajD .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .section{stroke:none;opacity:0.2}#mermaid-svg-oLUHkDZa4YVBoajD .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-oLUHkDZa4YVBoajD .section2{fill:#fff400}#mermaid-svg-oLUHkDZa4YVBoajD .section1,#mermaid-svg-oLUHkDZa4YVBoajD .section3{fill:#fff;opacity:0.2}#mermaid-svg-oLUHkDZa4YVBoajD .sectionTitle0{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .sectionTitle1{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .sectionTitle2{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .sectionTitle3{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-oLUHkDZa4YVBoajD .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .grid path{stroke-width:0}#mermaid-svg-oLUHkDZa4YVBoajD .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-oLUHkDZa4YVBoajD .task{stroke-width:2}#mermaid-svg-oLUHkDZa4YVBoajD .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .taskText:not([font-size]){font-size:11px}#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-oLUHkDZa4YVBoajD .task.clickable{cursor:pointer}#mermaid-svg-oLUHkDZa4YVBoajD .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-oLUHkDZa4YVBoajD .taskText0,#mermaid-svg-oLUHkDZa4YVBoajD .taskText1,#mermaid-svg-oLUHkDZa4YVBoajD .taskText2,#mermaid-svg-oLUHkDZa4YVBoajD .taskText3{fill:#fff}#mermaid-svg-oLUHkDZa4YVBoajD .task0,#mermaid-svg-oLUHkDZa4YVBoajD .task1,#mermaid-svg-oLUHkDZa4YVBoajD .task2,#mermaid-svg-oLUHkDZa4YVBoajD .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutside0,#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutside2{fill:#000}#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutside1,#mermaid-svg-oLUHkDZa4YVBoajD .taskTextOutside3{fill:#000}#mermaid-svg-oLUHkDZa4YVBoajD .active0,#mermaid-svg-oLUHkDZa4YVBoajD .active1,#mermaid-svg-oLUHkDZa4YVBoajD .active2,#mermaid-svg-oLUHkDZa4YVBoajD .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-oLUHkDZa4YVBoajD .activeText0,#mermaid-svg-oLUHkDZa4YVBoajD .activeText1,#mermaid-svg-oLUHkDZa4YVBoajD .activeText2,#mermaid-svg-oLUHkDZa4YVBoajD .activeText3{fill:#000 !important}#mermaid-svg-oLUHkDZa4YVBoajD .done0,#mermaid-svg-oLUHkDZa4YVBoajD .done1,#mermaid-svg-oLUHkDZa4YVBoajD .done2,#mermaid-svg-oLUHkDZa4YVBoajD .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-oLUHkDZa4YVBoajD .doneText0,#mermaid-svg-oLUHkDZa4YVBoajD .doneText1,#mermaid-svg-oLUHkDZa4YVBoajD .doneText2,#mermaid-svg-oLUHkDZa4YVBoajD .doneText3{fill:#000 !important}#mermaid-svg-oLUHkDZa4YVBoajD .crit0,#mermaid-svg-oLUHkDZa4YVBoajD .crit1,#mermaid-svg-oLUHkDZa4YVBoajD .crit2,#mermaid-svg-oLUHkDZa4YVBoajD .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-oLUHkDZa4YVBoajD .activeCrit0,#mermaid-svg-oLUHkDZa4YVBoajD .activeCrit1,#mermaid-svg-oLUHkDZa4YVBoajD .activeCrit2,#mermaid-svg-oLUHkDZa4YVBoajD .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-oLUHkDZa4YVBoajD .doneCrit0,#mermaid-svg-oLUHkDZa4YVBoajD .doneCrit1,#mermaid-svg-oLUHkDZa4YVBoajD .doneCrit2,#mermaid-svg-oLUHkDZa4YVBoajD .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-oLUHkDZa4YVBoajD .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-oLUHkDZa4YVBoajD .milestoneText{font-style:italic}#mermaid-svg-oLUHkDZa4YVBoajD .doneCritText0,#mermaid-svg-oLUHkDZa4YVBoajD .doneCritText1,#mermaid-svg-oLUHkDZa4YVBoajD .doneCritText2,#mermaid-svg-oLUHkDZa4YVBoajD .doneCritText3{fill:#000 !important}#mermaid-svg-oLUHkDZa4YVBoajD .activeCritText0,#mermaid-svg-oLUHkDZa4YVBoajD .activeCritText1,#mermaid-svg-oLUHkDZa4YVBoajD .activeCritText2,#mermaid-svg-oLUHkDZa4YVBoajD .activeCritText3{fill:#000 !important}#mermaid-svg-oLUHkDZa4YVBoajD .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-oLUHkDZa4YVBoajD g.classGroup text .title{font-weight:bolder}#mermaid-svg-oLUHkDZa4YVBoajD g.clickable{cursor:pointer}#mermaid-svg-oLUHkDZa4YVBoajD g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-oLUHkDZa4YVBoajD g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-oLUHkDZa4YVBoajD .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-oLUHkDZa4YVBoajD .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-oLUHkDZa4YVBoajD .dashed-line{stroke-dasharray:3}#mermaid-svg-oLUHkDZa4YVBoajD #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD .commit-id,#mermaid-svg-oLUHkDZa4YVBoajD .commit-msg,#mermaid-svg-oLUHkDZa4YVBoajD .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-oLUHkDZa4YVBoajD g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-oLUHkDZa4YVBoajD g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-oLUHkDZa4YVBoajD g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-oLUHkDZa4YVBoajD .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-oLUHkDZa4YVBoajD .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-oLUHkDZa4YVBoajD .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-oLUHkDZa4YVBoajD .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-oLUHkDZa4YVBoajD .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-oLUHkDZa4YVBoajD .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-oLUHkDZa4YVBoajD .edgeLabel text{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-oLUHkDZa4YVBoajD .node circle.state-start{fill:black;stroke:black}#mermaid-svg-oLUHkDZa4YVBoajD .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-oLUHkDZa4YVBoajD #statediagram-barbEnd{fill:#9370db}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-state .divider{stroke:#9370db}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-oLUHkDZa4YVBoajD .note-edge{stroke-dasharray:5}#mermaid-svg-oLUHkDZa4YVBoajD .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-oLUHkDZa4YVBoajD .error-icon{fill:#522}#mermaid-svg-oLUHkDZa4YVBoajD .error-text{fill:#522;stroke:#522}#mermaid-svg-oLUHkDZa4YVBoajD .edge-thickness-normal{stroke-width:2px}#mermaid-svg-oLUHkDZa4YVBoajD .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-oLUHkDZa4YVBoajD .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-oLUHkDZa4YVBoajD .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-oLUHkDZa4YVBoajD .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-oLUHkDZa4YVBoajD .marker{fill:#333}#mermaid-svg-oLUHkDZa4YVBoajD .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-oLUHkDZa4YVBoajD {color: rgba(0, 0, 0, 0.75);font: ;}

读取按键
文章目录
电路原理
电路改进
更多按键
八个按键
组合按键
总 结

§01 读取按键


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

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

▲ 图1.1 电视机控制面板上的七个按钮,接口线只有三条线

一、电路原理

1、电路原理图

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

▲ 图1.1.1 工作原理说明图

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

【表1-1-1 不同按键对应的电压】
SW1 SW2 SW3 SW4
75 ohm 1000 ohm 3300 ohm 6800 ohm
0.07 V 0.77 V 1.65 V 2.22 V

2、按键个数

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

  • 单片机ADC分辨率;
  • 分压信号的稳定性和噪声范围;
  • 机械按键接触电阻;
  • 分压电阻偏差与稳定性等。

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

▲ 图1.1.2 利用Arduino测试上述方案

二、电路改进

1、增加接口可靠性

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

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

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

§02 更多按键


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

一、八个按键

1、电路原理图

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

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

2、按键对应的电压值

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

【表2-1-1 八个按键对应的信号电压】
SW1 SW2 SW3 SW4 SW5 SW6 SW7 SW8
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

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

from headm import *                 # =
from tqdm import tqdmR0 = 4.7e3                          # ohm
Rdim = [0, 510, 680, 1e3, 1.2e3, 2.2e3, 4.7e3, 15e3]
U0 = 3.3                            # VVdim = [sum(Rdim[:r+1])/(R0+sum(Rdim[:r+1]))*U0 for r in range(len(Rdim))]
Rstr = ['%4d ohm'%r for r in Rdim]
Vstr = ['%.2f V'%v for v in Vdim]printt('|'.join(['SW%d'%(d+1) for d in range(len(Rstr))]))
printt('|'.join(["--"]*len(Rstr)))
printt('|'.join(Rstr))
printt('|'.join(Vstr))plt.figure(figsize=(10,6))
plt.plot(Vdim)
plt.xlabel("Swn")
plt.ylabel("Voltage")
plt.grid(True)
plt.tight_layout()
plt.show()

3、方案特点

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

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

二、组合按键

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

1、三个按键组合输入

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

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

  需要通过适当选择R1,R2,R3R_1 ,R_2 ,R_3R1​,R2​,R3​的阻值,使得八种SW1,2,3SW_{1,2,3}SW1,2,3​不同的按键组合,所得到的八个电压之间的间隔最大,这样才能够保证ADC通过分压数值确定状态时更加可靠。

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

R1=1250Ω,R2=1650Ω,R3=2800ΩR_1 = 1250\Omega ,\,R_2 = 1650\Omega ,\,R_3 = 2800\OmegaR1​=1250Ω,R2​=1650Ω,R3​=2800Ω

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

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

['1.19V', '1.37V', '1.53V', '1.68V', '1.83V', '2.05V', '2.43V', '3.30V']
vdiffmin:
0.15112480559591712
vr123:
[1250.0, 1650.0, 2800.0]
from headm import *                 # =
from tqdm import tqdmR0                     = 1e3
U0                     = 3.3
searchStep             = 199
searchRange = [[0.1*R0, 10*R0], [0.1*R0, 10*R0], [0.1*R0, 10*R0]]
searchDim = [linspace(r[0],r[1], searchStep) for r in searchRange]def minVoltage(r1,r2,r3):rdim = [10e10, r1, r2, r3,1/(1/r1 + 1/r2),1/(1/r1 + 1/r3),1/(1/r2 + 1/r3),1/(1/r1 + 1/r2 + 1/r3)]vdim = sorted([r/(r+R0)*U0 for r in rdim])vdiff = [b-a for a,b in zip(vdim[:-1], vdim[1:])]vdiff.append(vdim[0])return min(vdiff)vdiffmin = 0
vr123 = []for id1,r1 in tqdm(enumerate(searchDim[0])):for id2,r2 in enumerate(searchDim[1][id1+1:]):for r3 in searchDim[2][id2+1:]:vdiff = minVoltage(r1,r2,r3)if vdiff > vdiffmin:vdiffmin = vdiffvr123 = [r1,r2,r3]printt(vdiffmin\, vr123\)

※ 总  结 ※


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


■ 相关文献链接:

  • 电视机的按键功能是用什么电路实现的?经典ADC按键电路

● 相关图表链接:

  • 图1.1 电视机控制面板上的七个按钮,接口线只有三条线
  • 图1.1.1 工作原理说明图
  • 表1-1-1 不同按键对应的电压
  • 图1.1.2 利用Arduino测试上述方案
  • 图1.2.1 增加有提高EMC接口电路
  • 图2.1.1 被批量使用的八个按键方案
  • 表2-1-1 八个按键对应的信号电压
  • 图2.1.2 八个按键对应的信号电压
  • 图2.2.1 利用电阻组合完成多个多个按钮输入

公众号(TSINGHUAZHUOQING)留言

  • 37.5 :卓老师 什么时候出视觉组的数据集啊,就等交通工具了

    • 作者: 这个工作委托 SeekFree帮助搜集。应该下周就可以了。
  • 瘸子逛街 :数据集逐飞在准备了,除了增加交通工具,另外的动物水果内容也会增加,节后就可以出了
  • @ :难怪老式电视用时间久了,按键功能会变一样。
  • 小圣 :卓大,整合别人的内容不能标原创的哦
    • 作者: 谢谢提醒。非常感谢。
    • 小圣 :有新增组合键的部分,感谢卓大整理分享
  • 佟超 :按键用久了磨损了接触电阻变大就会出现漂移的现象,所以这个方案可靠性并不高,只能用于设计了计划报废时限的设备
  • SZU DSP :在资源匮乏的年代这是个好东西
  • 言身寸木杉 :这个我干过,芯片的io实在不够用了,并且如果可以,说一下led复用的吧,利用中断实现led显示复用。现在很多出了学校几年的都不知道可以这么做,要求一个io控制一个led,甚至某些干了十几年的还说io复用控制led没可靠性,简直大无语
  • 狗子 :索尼相机按键也是这种远离,只不过用的是碳膜pcb
  • gradientZero :其实可以理解成多个按键构成了一个手动控制的DAC,比如R2R DAC,然后再通过单片机的ADC重新转换成数字信号,读取按键输入组合
  • HHoP :卓老师,关于极速越野组,市面上有些惯性导航模块自带处理器,可以选用吗?
    • 作者: 室外极速越野组可以选用自带处理器的GPS。
  • 风帆 :请问多车编队组可以使用TF-mini检测坡道吗?多车保持距离可以使用你来我去吗?
    • 作者: 都是可以的。
  • kiwwa :所以有时候按任意一个键都能给电视机整关机
  • Quanyi :卓大,请问全模组巡线部分是必须用深度学习还是用传统的也可以呀?
    • 作者: 根据现在测试结果来看,如果达到高速运行,需要使用传统的图像处理的方式进行赛道的检测与跟踪。
    • Quanyi :卓老师,规则说全模组别摄像头只允许接到edgeboard上,所以单片机不能用原来的摄像头处理对吗
    • 作者: 1. 对的。 从公布的规则来看,单片机上不允许连接摄像头,所以也无法通过单片机来完成对摄像头数据的处理。
  • 恓杻 :卓大卓大,自带解算的测距模块能用吗
    • 作者: 按照今年规则中,对于传感器中带有MCU是有限制的。
  • 氢氦团月 :同时按下俩按键不就会出问题?
  • 王亚 :卓老师,比赛通知出来了吗?
    • 作者: 现在还没有在竞赛网站正式公布。应该在明后天就正式公布了。
  • WonderBoy :卓老师,请问室外越野组可以用毫米波雷达吗?
    • 作者: 是可以的。

通过一个端口读取多个按钮相关推荐

  1. pcb可以给用户进程读吗_「TCP/UDP」一个端口号可以同时被两个进程绑定吗? - 一口Linux...

    一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...

  2. storm spout读取mysql_java – Storm:用于从端口读取数据的Spout

    我需要写一个风暴喷口来从端口读取数据.想知道这在逻辑上是否可行. 考虑到这一点,我设计了一个简单的拓扑结构,设计用于一个喷嘴和一个螺栓. spout会收集使用wget发送的HTTP请求,而bolt会显 ...

  3. 端口复用·一个端口多个进程使用

    在Linux当中,我们知道,每一个进程都有自己唯一的PID.而这个唯一的PID可以标识一个主机当中的唯一一个进程,今天在用modbus写通信期间遇见一个很有意思的问题. 说是有意思讲来简单,就是简单的 ...

  4. 怎样查看一个端口有无开启

    有时候我们需要确定一下某个端口有无开启,有两种方法. 方法 1:查看一个端口有无开启的最简单方法 查看端口有无开启,需要在dos里使用命令来完成.这个命令就是: netstat -ano 这个命令能显 ...

  5. 如何查看服务器一个端口的占用情况(netstat -an)

    用以下命令就可以得到一个端口的占用情况. 以下是以110端口为例: netstat -an|findstr :110

  6. plc以太网端口号虚拟服务器,plc能像pc那样,一个端口号处理多个连接吗?

    比如服务器的一个80端口处理几万个连接.TCP协议允许,但不知道plc有没有这个功能. 项目要求多台上位机使用ModbusTCP连接PLC采集数据,想问一下 问题补充: 能不能仔细看我的问题啊,我就是 ...

  7. button按钮onclick触发不了_手把手教你深入CSS实现一个粒子动效的按钮

    按钮(button)可能是网页中最常见的组件之一了,大部分都平淡无奇,如果你碰到的是一个这样的按钮,会不会忍不住多点几次呢? 转载链接: https://github.com/XboxYan/note ...

  8. MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠

    请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图? 我想到的是: JavaScr ...

  9. 工业交换机单纤或双纤都只是占用一个端口吗?

    相信很多朋友在购买工业交换机的时候,都会考虑使用现场的传输距离,然后再选择单模还是多模,是单纤还是双纤,那么,这个是占用一个端口的吗?接下来我们就跟随飞畅科技的小编一起来详细了解下吧! 首先在购买的时 ...

最新文章

  1. Visual Studio 中文显示乱码问题
  2. ISA三向外围网络模板说明
  3. android的横竖屏切换,Android横竖屏切换 初步探究
  4. CNCF宣布Envoy项目正式毕业
  5. SQL中cross join,left join,right join ,full join,inner join 的区别
  6. NoSQL学习笔记(二)之CAP理论
  7. python 根据父子信息 还原成json树
  8. Linux 任务控制的几个技巧( , [ctrl]-z, jobs, fg, bg, kill)
  9. SPSS作业-检验两组数据有无显著
  10. 【STM8】STM8在STVD平台生成HEX和S19文件的方法
  11. 医院计算机管理办法试行,医院信息工作制度七、计算机中心机房管理制度
  12. unity 生成和识别二维码
  13. python:使用 PythonMagick 生成 icon 图标
  14. 3D Touch大法
  15. 除了独热编码,你需要了解将分类特征转换为数字特征的17种方法--较详细说明各方法的优点
  16. 项目经验教训总结(教育软件)
  17. Debian网卡配置
  18. Python——生成激活码并存入MySQL
  19. AS/400 初级培训课程
  20. unity urp 实现遮挡显示角色轮廓

热门文章

  1. 画原型时需要注意什么?
  2. Window Mobile SmartPhone智能手机软件开发vs2005 简体中文版 设置指南!
  3. 梭子鱼推出Microsoft Office 365 邮件威胁扫描服务
  4. 《Adobe Flash CS5中文版经典教程》——1.5 在“时间轴”中组织图层
  5. CSS的一些基础知识
  6. 【java】【转】Java之classpath
  7. TFTP、RAM、NVRAM之间的关系
  8. [Codeforces1137D]Cooperative Game
  9. 文件处理(如果文件存在则追加,不存在则生成多级文件夹以及txt目录)
  10. var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo