上面我们聊到了数字输出型驱动电路设计,这里我们来聊聊数字输入型驱动电路设计。

​ 我们通过三极管实现了输出的驱动电路,通过IO来控制三极管的基极来实现电路的开闭,这里我们来分析下数字输入型电路的设计需要注意哪些内容。

​ 机械开关是我们常用的一个器件,它们所有的原理都是实现来个金属片的触碰、实现对电路的开闭控制。比如按键、自锁开关、碰撞开关、干簧管、旋转编码器等等。其中按键开关是我们最常用的一个传感器模块,在这个模块的电路基础上,我们可以扩展出更多的相关电路设计。

我们可以控制单片机的IO输出高低电平,这就是数字输出模式,通过输出的高低电平我们可以来控制灯的亮和不亮、电机的转和不转。同样我们也可以控制单片机的IO读取,看看当前的IO是高电平还是低电平。假如现在IO连接的是一个按键模块,那么我们可以通过IO的高低电平来判定这个按键有没有按下。至于高电平是按下还是低电平是按下,这个就看驱动电路是怎么设计了的。

这里以我常用的按键电路为例,电路原理图如下。

这是一个抖动开关(机械开关的一种)的驱动电路,电路由一个10K电阻、一个100nF电容和一个按键开关组成。其中信号引脚接在单片机的D4引脚(我这里是Arduino Nano单片机)。

当按键按下的时候,电流从正极流经R1电阻、流经闭合的按键到到GND。电容的部位,根据电容通交流、阻直流的特性可以得知,电容没有电流流过。

当按键未按下的时候,电流从正极流经R1电阻到达单片机引脚。电容的部位,根据电容通交流、阻直流的特性可以得知,电容没有电流流过。按键的部位,由于按键没有按下,该部分处于断路状态,无电流流过。

那么怎么通过单片机的引脚得知按键的状态呢?开关按下时,D4处于低电平;开关未按下时,D4处于高电平。

开关按下的时候,其实是将单片机的IO引脚和GND进行了短接,另一部分电路是一个10K电阻,5V或者3V3的电压在流经10K电阻的情况下,可以认为是断路(因为电阻过大导致断路);另外一种理解是将D4看作选择点,一侧是电阻、一侧是导线,所以D4是处于低电平。其实两种说法都没有问题。

那么我们来想一下,这个电路能否简化呢?我能不能只要一个按键,接在单片机的IO引脚和GND之间呢?是可以的,但是我不建议你这么做。

如果你没有对IO引脚进行初始化状态设置,那么就会出现浮空状态,导致IO口测量的数值无效。

如果你对IO引脚进行低电平初始化,那按下和没按下还有区别吗?

如果你对IO印件进行低电平初始化,第一次确实是可以,那么往后的几次呢?

这里我们需要将这个引脚一直处于高电平的状态,当按键按下它处于低电平;按键松开要立即恢复高电平。这就是上拉电阻的作用。

关于上拉电阻的选值问题,5V驱动电路基本上拉电阻、下拉电阻我选择10K,3V3驱动电路基本上拉电阻、下拉电阻我选择3K3。没啥依据,也没必要算。很多时候设计电路尽量都是使用手上有的器件。

这个电路能不能只保留上拉电阻和按键开关呢?可以!

电容是可以去除的,但是我不建议去除电容。所有的机械开关在闭合和断开的瞬间,都会出现因为接触不良引起的抖动(断开、闭合两种状态在跳动变换),这个时间很小,可能10ms都不到。但它对单片机的程序却是存在影响的。单片机程序执行的速度很高,这部分抖动是可以被检测到的,这就是错误信号。

关于抖动的消除,现在基本是两种方案。

方案一,读取按键之后隔一段时间(超过抖动时间即可,10ms足够),再读取一次,以第二次读取的数据为准。按键刚按下的时候存在抖动,但在一定时间后将处于稳定状态,这个时候读取是没有任何问题的,这个方案需要都单片机的程序进行改动。

方案二,按键部位并联一个104电容(100nF)来消除抖动。这里大家可以根据电容的特性自己来理解,不再过多描述。

上面这个电路属于数字输入型驱动电路,在这个电路的基础上我们可以做出更多的扩展。

最好,我们来实现将两个电路的结合,如下。‘

我们将按键驱动电路的信号端、蜂鸣器驱动电路的信号端连接在一起,就可以实现按键控制蜂鸣器的效果。值得注意的是,按键部分的电路按键未按下的情况下,输出的是高电平信号,三极管的基极触发后导通集电极和发射极,蜂鸣器发出声音;按键部分的电路按键按下的情况下,输出的是低电平信号,三极管基极无法使集电极和发射极导通,蜂鸣器无法发出声音。

如果你手上有按键模块和蜂鸣器模块的情况下,可以来试试看!

这种使用方法可以映射在很多应用场景,比如声音传感器+继电器=声控灯、光敏传感器+继电器=光控灯、人体红外热释传感器+继电器=感应灯等。大家可以发挥自己的Idea进行组合创造。