如何巧妙利用4个IO口驱动12个LED灯

Posted 三明治开发社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何巧妙利用4个IO口驱动12个LED灯相关的知识,希望对你有一定的参考价值。

在电路设计过程中有时经常遇到单片机的IO口不够用的情况。对于这样的问题,我们可以选择换单片机,也可以尝试一些巧妙的设计来避免IO口不够用的问题。例如当我们在设计中遇到许多LED灯需要控制的时候,而单片机的IO口又不够用,我们又不希望增加成本,此时我们可以采用“查理复用”(Charlieplexing)的方式去解决这个问题。

“查理复用”(Charlieplexing)作为一种LED显示器多路复用的方法,能够使人们利用少量的IO口控制很多的LED灯,在LED领域应用广泛。

当使用 Charlieplexing 方法,n引脚可以有nx(n-1)个组合。也就是说,它可以用n个引脚驱动nx(n-1)个LED二极管。而传统的行列复用则需要更多的引脚来驱动相同的LED二极管,也就是说要驱动6个LED,用行列式需要5个口,而这种方法只要3个IO口。LED越多,节省的IO越多。比方说驱动20个LED,行列式要用9个,而这种只要5个。

下面我们来看看设计的原理吧!!!!!

一、原理图分析

这个电路用到了单片机GPIO的三种状态:

  • 高电平

  • 低电平

  • 高阻态

所谓“高阻态”,是指GPIO对外部电路表现出极大的阻抗。因阻抗很大,几乎不会吸入电流,也不会对外输出电流。

各个LED灯单独亮起,分为12种情况。(原理图中的二极管为LED灯)

1、当只有D1亮起时,单片机各GPIO的状态如下:(带箭头的红线为电流回路)

2、当只有D2亮起时,单片机各GPIO的状态如下:

3、当只有D3亮起时,单片机各GPIO的状态如下:

4、当只有D4亮起时,单片机各GPIO的状态如下:

5、当只有D5亮起时,单片机各GPIO的状态如下:

6、当只有D6亮起时,单片机各GPIO的状态如下:

7、当只有D7,D8,D9,D10,D11,D12任意一个亮起时,单片机各GPIO的状态如上分析,这里不在叙述了。

二、设计要求

这种方式能够实现的基础是:

  • 单片机GPIO的三个状态:高电平、低电平、高阻态。

  • GPIO能承受的电流要大于LED灯流过的电流。

  • LED具有单向导电性。

查理复用设计的方法:

  • 任意两个GPIO引脚之间串入两个LED,这两个LED为并联,且LED方向相反。

  • 当你想要点亮某个特定的LED时,就将其两端所连接到的GPIO引脚分别设定为高电平和低电平,其它剩余的GPIO引脚设定为高阻态。

程序的编写和控制简介

对于使用了 查理复用算法的LED控制电路,程序开发步骤如下:

  • 初始化所有端口为高阻态。

  • 初始化指定LED 灯对应的两个管脚为推挽输出。

  • 设置两个管脚的高低电平。

三、设计中的问题

查理复用“这样的电路接法也会引发一些问题如下:

首先,LED亮起时完全由单片机的GPIO输出电流驱动,所以对于GPIO的电流驱动能力有一定的要求。设计电路时要注意查询自己使用的MCU的电流驱动能力,下图是GD32和STM32单片机中对GPIO电流驱动能力的说明:

GD32E230C8T6单片机GPIO最大输出电流如下:

STM32F105,STM32F107单片机GPIO输出电流如下:

其次,如果出现了某个LED开路或短路的情况,电流的流向会被打乱,LED亮起来的逻辑会变得错乱。最坏的情况下,电路会对GPIO索取大电流,导致单片机损坏。下图是假设D1和D3短路,那么在点亮D11时,D5也会亮起:

四、进阶设计

问题:如果要同时亮起两个以上的LED,怎么办?

方法:交替点亮他们就行,只要交替切换的速度够快,由于人眼的视觉暂留效应,看起来就是同时亮起的。

注意:如果要同时亮起较多LED灯,比如大规模的LED点阵,还要注意一些新的问题,这里不在展开叙述了。

要求:在任意时刻只要有一个端口高电平,一个端口低电平,其余两个端口高阻态,那么就只有一个LED发光。依次循环扫描就成流水灯,速度快了就达到视觉全亮。想控制任意几个LED亮灭就与控制多位数码管动态显示一样。唯一的前提条件是MCU的端口可以设置为推挽和高阻模式。

拓展:有了上述方法之后,我们可以利用1个GPIO控制2个LED显示4种状态。

要实现4种状态:

  • 红灯亮,绿灯灭

  • 红灯灭,绿灯亮

  • 都灭

  • 都亮

分析同上,这里不在叙述了。(也是需要单片机IO口模式能设置为推挽模式和高阻态)

注意;两个LED灯总的导通压降要求大于3.3V。若总压降小于3.3V可能会出现当Port设为浮空高阻态时,出现两个LED灯同时点亮的风险。(当Port设为浮空高阻态时,需要同时灭)

以上是关于如何巧妙利用4个IO口驱动12个LED灯的主要内容,如果未能解决你的问题,请参考以下文章

单片机驱动多个LED

单片机的IO驱动LED灯电路,需要用到三极管,求原理图,并说明

嵌入式STM32F1学习-驱动led灯(寄存器版本)

单片机一个接口怎么控制两个LED灯?!

如何使两个LED灯循环亮灭?或者交替亮灭?最好有电路图。大一小白求助,

3.1 51单片机-LED灯模块