IO口多路查理复用:三个单片机IO口控制六个LED

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO口多路查理复用:三个单片机IO口控制六个LED相关的知识,希望对你有一定的参考价值。

简 介: 本文介绍了单片机的IO控制 LED 中的复用技术,特别查理复用基本原理和特点进行了介绍。使用一款IS31FL3731可以构成16×9的PWM亮度可控的 LED 矩阵。

关键词 查理复用CharlieplexingIOMCUIS31FL3731IO口复用

 

§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(N1)LED

 

§02 理复用原理


   微信公众号“电路啊” 近日的一篇推文 用3个IO口控制6个 LED 灯,怎么做到的?查理复用! 中,介绍了使用 查理复用 (Charlieplexing)方法。

1.电动牙刷中查理复用

  有趣的是,他是从一款手头的电动牙刷的设计中看到了 查理复用 在实际产品中是如何解决单片机IO不足的问题。在电动牙刷内部控制板上使用了一颗8PIN的单片机,外部需控制六个 LED ,单片机只使用了其中三个IO控制 6LED 灯,表示电动牙刷不同运行速度设置。

▲ 电动牙刷内部8PIN单片机控制六个 **LED**

▲ 电动牙刷内部8PIN单片机控制六个 **LED**

  下面是三个IO与六个 LED 之间的连接关系。三个IO口之间共有三对相互连接关系。在每一对连接IO之间,正反并联一对 LED ,总共六个 LED

▲ 三个IO端口控制六个 **LED** 单独点亮

▲ 三个IO端口控制六个 **LED** 单独点亮

  如果需要点亮某一个 LED ,首先确定它在哪一对IO之间,然后将其余IO设置成高阻状态,使其不参与控制。然后在根据该 LED 的极性,设置它所在两个IO的高低电平,来点亮它,与它并联的 LED 由于极性相反而熄灭。

▲ 任意挑选两个IO,设置他们不同高低电平可以分别控制它们之间连接的两个 **LED** 点亮

▲ 任意挑选两个IO,设置他们不同高低电平可以分别控制它们之间连接的两个 **LED** 点亮

  这个电路中使用的 查理复用 是在 N = 3 N = 3 N=3的情况下,控制 3 × 2 = 6 3 \\times 2 = 6 3×2=6LED 的点亮。

2.查理复用原理

  查理复用 最基本单元是一对IO口可以单独控制两个背对背并联 LED 中某一个 LED 点亮。如下图所示,电路连接一对单片机IO口。随着左右两边不同的电平设置,可以控制 LED 1、 LED 2分别单独点亮。

▲ 极性相反并联的 **LED**

▲ 极性相反并联的 **LED**

  对于N个IO口,它们之间总共有 N ( N − 1 ) / 2 N\\left( {N - 1} \\right)/2 N(N1)/2个相互连接的边。比如下面所示的三个IO口,它们之间有三个连接边。每一个边对应的两个IO口,可以连接一个上面的 LED 并联电路。这样总共有 N ( N − 1 ) N\\left( {N - 1} \\right) N(N1)LED

  工作时,任选两个IO,将其余的IO口设置为高阻状态。比如下图中将C对应的IO口设置为高阻,剩下A,B两个IO口完成对于0,1两个 LED 的控制。

▲ 三个IO口,可以形成三个相互连接的边

▲ 三个IO口,可以形成三个相互连接的边

  由于A,B两点的电位始终被0,1 LED 钳位,使其在单个 LED 导通电压,而小于两个 LED 串联的导通电压,所以A,B两点之间的电位差不会引起(2,3)、(4,5)两边 LED 串联导通。

▲ 三个IO口(分别用黄、绿、蓝表示)不同状态点亮不同 **LED** (0 至 7)

▲ 三个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** 矩阵

▲ 单片机驱动 **LED** 矩阵

  在 Adafruit Charlieplex LED Matrix Bonnet 给出了一款8×16 LED 阵列,利用专用一颗I2C接口控制器,使用 查理复用 驱动 LED 矩阵。

▲ Adafruit 15x7 CharliePlex  **LED**  Matrix Display FeatherWings

▲ Adafruit 15x7 CharliePlex **LED** Matrix Display FeatherWings

  下面 LED 模块被称为“LED 矩阵羽毛”,它外观看起来就像一片贴满鳞片的羽毛。它外部具有I2C 总线接口。它可以通过PWM控制 LED 亮度(256级别)

▲ CharpliePlex  **LED**  矩阵显示不同图案

▲ CharpliePlex **LED** 矩阵显示不同图案

   LED 矩阵羽毛核心的IC为IS31FL3731芯片,它可以通过PWM波形控制多大16×9个 LED 组成的矩阵,可以工作在 2.7V~5.5V 电压。

  特别,在 PythonY&CircuitPython 还有它专用驱动库文件。

▲ IS31FL3731控制板可以控制16×9 **LED**  矩阵560

▲ IS31FL3731控制板可以控制16×9 **LED** 矩阵560

  那么问题回来了,这颗IS31FL3731芯片与 查理复用 有什么关系呢?

▲ IS31FL3731芯片外部连接的LED阵列就是使用的查理复用的方法

▲ IS31FL3731芯片外部连接的LED阵列就是使用的查理复用的方法

 

结 ※


  查理复用 在单片机IO端口复用应用比较广泛。在解决一些管脚很少单片机在多路显示的情况下,控制更多的 LED 显示。

 


  ■ 相关文献链接:

▲ 实验中突然电路着火了

▲ 实验中突然电路着火了

以上是关于IO口多路查理复用:三个单片机IO口控制六个LED的主要内容,如果未能解决你的问题,请参考以下文章

怎样用单片机io口控制大功率led灯亮灭,用1117芯片

单片机课堂思考题-如何用手机控制单片机IO口-如点亮一个LED

单片机课堂思考题-如何用手机控制单片机IO口-如点亮一个LED

IO多路复用

Linux IO多路复用

select-IO多路复用