§01 单片机IO控制LED
使用单片机的IO端口控制LED点亮是最最基本的单片机的人机界面(HMI),它可以显示电子系统工作状态,参数设置等等。为了传递更多的信息,也可以控制LED不同的闪烁模式(频率,占空比,点亮长短组合)表示更多的信息,当然这会增加观察理解方面的难度。
最基本的方式还是通过单独LED分别表示不同的模式最为简洁,但这需要设置较多的LED以及相应的MCU控制IO端口。在有些电子产品设计中,可能会遇到单片机IO端口不足的情况。此时就需要考虑IO端口复用来控制更多的LED。
首先需要说明的是,这里是指不在增加辅助芯片的情况下完成少量IO口控制多个LED的方法。比如下面这个8×8 双色LED显示模块,其背板包括一颗 TM1640 LED驱动控制芯片[1] ,它只需要单片机两个IO端口便可以控制。这种扩展不在我们讨论范围之内。
曾经在博文 如何使用一个单片机的IO口控制两个LED?[2] 介绍了使用一个IO端口控制两个LED独立点亮熄灭的方法。因此可以使用N个IO口,控制2N个LED独立的点亮与熄灭,它们可以总共表示2{2N} = 4{N}种不同的状态。
如果不考虑LED独立点亮,而是在任何时刻只点亮一个LED,则可以使用 查理复用(Charlieplexing)
方法,它可以在N个IO端口,控制个LED。
§02 查理复用原理
在 微信公众号“电路啊” 近日的一篇推文 [3] 中,介绍了使用 查理复用
(Charlieplexing)方法。
1.电动牙刷中IO复用
有趣的是,他是从一款手头的电动牙刷的设计中看到了 查理复用
在实际产品中是如何解决单片机IO不足的问题。在电动牙刷内部控制板上使用了一颗8PIN的单片机,外部需控制六个LED,单片机只使用了其中三个IO控制拉个LED灯,表示电动牙刷不同运行速度设置。
下面是三个IO与六个LED之间的连接关系。三个IO口之间共有三对相互连接关系。在每一对连接IO之间,正反并联一对LED,总共六个LED。
▲ 三个IO端口控制六个LED单独点亮如果需要点亮某一个LED,首先确定它在哪一对IO之间,然后将其余IO设置成高阻状态,使其不参与控制。然后在根据该LED的极性,设置它所在两个IO的高低电平,来点亮它,与它并联的LED由于极性相反而熄灭。
▲ 任意挑选两个IO,设置他们不同高低电平可以分别控制它们之间连接的两个LED点亮 这个电路中使用的 查理复用
是在的情况下,控制个LED的点亮。
2.查理复用原理
查理复用
最基本单元是一对IO口可以单独控制两个背对背并联LED中某一个LED点亮。如下图所示,电路连接一对单片机IO口。随着左右两边不同的电平设置,可以控制LED1、LED2分别单独点亮。
对于N个IO口,它们之间总共有个相互连接的边。比如下面所示的三个IO口,它们之间有三个连接边。每一个边对应的两个IO口,可以连接一个上面的LED并联电路。这样总共有个LED。
工作时,任选两个IO,将其余的IO口设置为高阻状态。比如下图中将C对应的IO口设置为高阻,剩下A,B两个IO口完成对于0,1两个LED的控制。
▲ 三个IO口,可以形成三个相互连接的边由于A,B两点的电位始终被0,1LED钳位,使其在单个LED导通电压,而小于两个LED串联的导通电压,所以A,B两点之间的电位差不会引起(2,3)、(4,5)两边LED串联导通。
▲ 三个IO口(分别用黄、绿、蓝表示)不同状态点亮不同LED(0 至 7)§03 多路查理复用
在前面介绍的 查理复用
中,每一时刻基本只能点亮一颗LED,如果希望同时点亮多个LED,则可以通过顺次点亮这些LED,只要重复频率足够快(比如大于50Hz),则可以看起来它们是同时点亮。这样,就可以使用 查理复用
控制LED矩阵了。
在 Charplexing-HACKADAY[4] 中展示了一颗ATiny24单片机(PIN14)控制 5 ×18(90个LED)矩阵工作。通过前面可知控制90个LED,如果使用 查理复用
则至少需要10个LED,对于14个管脚的ATiny24单片机来讲,几乎它所有IO都用于控制LED矩阵了。
在 Adafruit Charlieplex LED Matrix Bonnet[5] 给出了一款8×16 LED阵列,利用专用的一颗I2C接口控制器,使用 查理复用
驱动LED矩阵。
下面LED模块被称为“LED矩阵羽毛”,它外观看起来就像一片贴满鳞片的羽毛。它外部具有I2C 总线接口。它可以通过PWM控制LED亮度(256级别)
▲ CharpliePlex LED 矩阵显示不同图案LED矩阵羽毛核心的IC为IS31FL3731芯片,它可以通过PWM波形控制多大16×9个LED组成的矩阵,可以工作在 2.7V~5.5V 电压。
特别,在 PythonY&CircuitPython[6] 还有它专用驱动库文件。
▲ IS31FL3731控制板可以控制16×9LED 矩阵560 那么问题回来了,这颗IS31FL3731芯片与 查理复用
有什么关系呢?其实就是查理复用的接法:
※ 总结 ※
查理复用
在单片机IO端口复用应用比较广泛。应用在一些管脚很少的单片机在需要多路显示的情况下,可以控制更多的LED。
最后也非常感谢卓老师引用”电路啊“的文章!
▲ 实验中突然电路着火了参考资料
[1]TM1640 LED驱动控制芯片: https://www.alldatasheet.com/datasheet-pdf/pdf/1133630/TITAN/TM1640.html
[2]如何使用一个单片机的IO口控制两个LED?: https://zhuoqing.blog.csdn.net/article/details/113698309
[3]用3个IO口控制6个LED灯,怎么做到的?查理复用!: https://mp.weixin.qq.com/s/h1u2sKZGvWw1x4ieXmI8EQ
[4]Charplexing-HACKADAY: https://hackaday.com/tag/charlieplexing/page/3/
[5]Adafruit Charlieplex LED Matrix Bonnet: https://cdn-learn.adafruit.com/downloads/pdf/adafruit-charlieplex-bonnet.pdf
[6]PythonY&CircuitPython: https://learn.adafruit.com/i31fl3731-16x9-charliplexed-pwm-led-driver/python-circuitpython