工程师们经常为了节省一两个IO口想各种方案想到抠脑壳,今天给大家整点活儿,介绍一种超级节省IO口的LED灯控制方案。
5个IO口控制20个LED灯,而且可以对每个LED灯实现单独控制。电路结构如下:
注意一下这种电路网络,其中有交点的地方才代表两根线之间是相交的,如果在画PCB的时候,这种交点是需要单独放置的。
以这种电路结构为基础,IO通过输出高电平,低电平,或者高阻态,可以实现5个IO口控制20个LED灯。首先先来理解一下单个LED灯的导通状态:
在三种IO状态下LED灯两端的IO口状态有六种情况,只有阳极高电平,阴极低电平的情况下,LED灯可以正常导通。
回到上述的LED网络中,我们可以采用动态扫描的方式,实现对每一颗LED灯的单独控制,先将LED网络按照扫描顺序划分组别:
首先,在一个周期的时间内,保证所有的LED灯都有被点亮的可能性,上述扫描方式将20颗LED灯分为了12组,再按照特定时序进行扫描,保证了一个周期内所有LED灯都可以被点亮,扫描顺序如下:
我们在看扫描时序时,用低电平作为参考,在一个周期内,当处于第一个相位时, IO2为低,IO1为高,其他的IO处于高阻态,此时,只有第一个LED灯被点亮,而第二个周期内,IO1为低,IO2和IO3为高,此时第二个和第三个LED灯被点亮,以此类推,按照上述时序,在一个周期内,所有的LED灯都可被单独控制点亮或熄灭。如果按上述时序进行动态扫描,在一秒中之内,扫描速度够快,由于LED灯的余晖效应,看起来所有的灯都会呈现点亮状态。这种扫描方案下,单片机IO口的源电流和灌电流都不会太大,同一时刻单个IO口承受的灌电流不会超过两个LED灯的总电流值。
上述扫描方式某国内芯片厂商利用单片机IO口所实现的LED阵列扫描方案,已经实现在某款单片机内部逻辑上,且无任何外加的电路结构。但是我在研究这种扫描方式时,想到了另一种扫描方式:
同样是以每个IO口低电平作为扫描参考:
此时IO1在第一相位处于低电平时,其他IO拉高表示点亮对应LED,高阻表示不点亮对应LED,以此类推,这种扫描方案看起来也可以实现对每个LED灯的单独控制。
在这种扫描方式下,时序会简单很多,只是同一时刻,IO的灌电流会增大,不过IO灌电流由于是接到地的,个人认为稍大一点也无妨,且由于是动态扫描,其平均电流完全达不到LED常导通时的水平。
关于上述LED电路的结构,换种方式画出来可能大家更清晰一点:
从上面的电路可以看得出来,五个IO并非是这种控制方案的极限,6个IO可以控制30个LED,7个IO可以控制42个LED等等,在动态扫描的时序上也需要相应增加相位,第一种控制方案的话,在8个IO控制56个LED灯时,单个周期内需要32个低电平进行控制,而第二种方案则只需要8个相位,但是相应源电流会进一步增大。大家可以一起探究一下两种方案的优劣,欢迎大家在评论区留言讨论。
如果大家对于文中关于IO或者LED灯的概念有模糊的地方,可以看看我以前写的关于GPIO和LED的文章~