问: 开关与单片机 MCU接口的基本原理
本文引用地址:将单片机 (微控制器) 连接到双列直插式封装( ) 开关是一种常见的应用。俗称 “” 的开关可用于各种设计,从适合面包板原型设计的传统 DIP 到表面贴装“钢琴”型,再到易于读取十六进制值的。
在这篇文章中,我们将仔细研究,并探索如何将其集成到我们的中。本文中介绍的技术一般适用于所有。
从规则开始
让我们从一个简单的规则开始:不允许浮动输入 。当单片机引脚被配置为输入,但在其他情况下未连接时,就会出现浮动输入。这里展示了一个例子。当开关闭合时,关联引脚被绑在正轨上。当开关打开时,引脚是浮动的。
这是非常不希望的,因为浮动引脚可能被解释为逻辑高,或者在其他时候,逻辑低。从故障排除的角度来看,单片机的响应将没有任何韵律或原因。引脚容易受到噪声的影响,并且通常会松散地遵循相邻单片机引脚的值。
解决方法是增加一个下拉电阻,如下图所示。有了这个小小的变化,当开关闭合时,单片机的引脚就会向上拉到导轨上,或者当开关打开时,它就会向下拉到地上。暂时忽略开关弹跳,单片机将有一个干净的输入。
优化解决方案
现代单片机就是为这种类型的接口而设计的。几乎所有的单片机都具有 I/O 部分,其内部电阻可以向上拉或向下拉 I/O 引脚。这是可取的,因为开关可以直接连接到单片机,从而消除了外部电阻器的需要。
技术小贴士 :
一些单片机具有上拉和下拉电阻。其他将只有一种类型,与上拉配置更常见。这些外设通常被称为“弱上拉”,消耗数十到数百uA。这相当于连接一个值在15 kΩ到150 kΩ之间的外部拉电阻。
Arduino的一个例子是:
pinMode (SW_PIN_D0 INPUT_PULLUP);
该原理图给出了单片机与开关接口的一种方式。虽然本例采用旋转 DIP 开关,但该设计适用于所有开关。观察:
■ 内部上拉电阻使用单片机的特殊功能寄存器启用
■ 开关的公共元件连接到地
技术小贴士 :
原理图中显示了一个可选的串联电阻以及可选的多路复用部分。这允许 I/O 引脚执行双重任务。例如,这个小口宽的接口可以用来读取开关,也可以用来驱动 LCD 显示器的 D3 到 D0。这可能是可取的,因为它有可能以牺牲电路和代码复杂性为代价减少单片机引脚数和PCB的总体尺寸。
在我们结束之前,让我们看一下与旋转 DIP 开关相关的物理开关代码。代表性的HEX代码取自欧姆龙的数据手册。观察 A6A-16R 和 A6A-16C 型号对应的“BCD十六进制码” 和 “BCD十六进制补码” 两个开关配置。
回头看单片机原理图及其相关的上拉电阻,我们看到了一个反转。例如,当开关处于1位置时,在位置2 + 4 + 8上会有三个正逻辑输入。同时,如果安装了互补开关,则会有一个对应于1信号的正逻辑(有源高电平)输入。
从编程的角度来看,这个物理开关代码中的这种差异是无关紧要的。一个简单的 bit 反转指令就会使它们相等。从故障排除或教育的角度来看,互补版本可能更容易理解,因为它导致单片机引脚上存在正逻辑值。