简 介: 利用单片机的ADC端口,可以读取多个按钮的状态。在设计过程中,需要综合考虑到按扭的个数与读取的可靠性,特别是对选择电阻的阻值进行优化,使得不同分压数值之间相差最大。如果按键面板需要通过长的引线与单片机电路相连,还需要对接口电路进行保护以提高电路的EMC特性。
关键词
: MCU,ADC,按键
#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 利用电阻组合完成多个多个按钮输入
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
:卓老师,请问室外越野组可以用毫米波雷达吗?
通过一个端口读取多个按钮相关推荐
- pcb可以给用户进程读吗_「TCP/UDP」一个端口号可以同时被两个进程绑定吗? - 一口Linux...
一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...
- storm spout读取mysql_java – Storm:用于从端口读取数据的Spout
我需要写一个风暴喷口来从端口读取数据.想知道这在逻辑上是否可行. 考虑到这一点,我设计了一个简单的拓扑结构,设计用于一个喷嘴和一个螺栓. spout会收集使用wget发送的HTTP请求,而bolt会显 ...
- 端口复用·一个端口多个进程使用
在Linux当中,我们知道,每一个进程都有自己唯一的PID.而这个唯一的PID可以标识一个主机当中的唯一一个进程,今天在用modbus写通信期间遇见一个很有意思的问题. 说是有意思讲来简单,就是简单的 ...
- 怎样查看一个端口有无开启
有时候我们需要确定一下某个端口有无开启,有两种方法. 方法 1:查看一个端口有无开启的最简单方法 查看端口有无开启,需要在dos里使用命令来完成.这个命令就是: netstat -ano 这个命令能显 ...
- 如何查看服务器一个端口的占用情况(netstat -an)
用以下命令就可以得到一个端口的占用情况. 以下是以110端口为例: netstat -an|findstr :110
- plc以太网端口号虚拟服务器,plc能像pc那样,一个端口号处理多个连接吗?
比如服务器的一个80端口处理几万个连接.TCP协议允许,但不知道plc有没有这个功能. 项目要求多台上位机使用ModbusTCP连接PLC采集数据,想问一下 问题补充: 能不能仔细看我的问题啊,我就是 ...
- button按钮onclick触发不了_手把手教你深入CSS实现一个粒子动效的按钮
按钮(button)可能是网页中最常见的组件之一了,大部分都平淡无奇,如果你碰到的是一个这样的按钮,会不会忍不住多点几次呢? 转载链接: https://github.com/XboxYan/note ...
- MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠
请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图? 我想到的是: JavaScr ...
- 工业交换机单纤或双纤都只是占用一个端口吗?
相信很多朋友在购买工业交换机的时候,都会考虑使用现场的传输距离,然后再选择单模还是多模,是单纤还是双纤,那么,这个是占用一个端口的吗?接下来我们就跟随飞畅科技的小编一起来详细了解下吧! 首先在购买的时 ...
最新文章
- Visual Studio 中文显示乱码问题
- ISA三向外围网络模板说明
- android的横竖屏切换,Android横竖屏切换 初步探究
- CNCF宣布Envoy项目正式毕业
- SQL中cross join,left join,right join ,full join,inner join 的区别
- NoSQL学习笔记(二)之CAP理论
- python 根据父子信息 还原成json树
- Linux 任务控制的几个技巧( , [ctrl]-z, jobs, fg, bg, kill)
- SPSS作业-检验两组数据有无显著
- 【STM8】STM8在STVD平台生成HEX和S19文件的方法
- 医院计算机管理办法试行,医院信息工作制度七、计算机中心机房管理制度
- unity 生成和识别二维码
- python:使用 PythonMagick 生成 icon 图标
- 3D Touch大法
- 除了独热编码,你需要了解将分类特征转换为数字特征的17种方法--较详细说明各方法的优点
- 项目经验教训总结(教育软件)
- Debian网卡配置
- Python——生成激活码并存入MySQL
- AS/400 初级培训课程
- unity urp 实现遮挡显示角色轮廓
热门文章
- 画原型时需要注意什么?
- Window Mobile SmartPhone智能手机软件开发vs2005 简体中文版 设置指南!
- 梭子鱼推出Microsoft Office 365 邮件威胁扫描服务
- 《Adobe Flash CS5中文版经典教程》——1.5 在“时间轴”中组织图层
- CSS的一些基础知识
- 【java】【转】Java之classpath
- TFTP、RAM、NVRAM之间的关系
- [Codeforces1137D]Cooperative Game
- 文件处理(如果文件存在则追加,不存在则生成多级文件夹以及txt目录)
- var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo