电源技术网|技术阅读
登录|注册

您现在的位置是:电源技术网 > 技术阅读 > 听卓老师讲查理复用,看更多的实物案例

听卓老师讲查理复用,看更多的实物案例


§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灯,表示电动牙刷不同运行速度设置。

▲ 电动牙刷内部8PIN单片机控制六个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分别单独点亮。

▲ 极性相反并联的LED

  对于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矩阵了。

▲ 单片机驱动LED矩阵

  在 Adafruit Charlieplex LED Matrix Bonnet[5] 给出了一款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[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