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