风筝
发表于: 2018-9-7 23:44:06 | 显示全部楼层

本篇文章主要介绍LED点阵的基础知识以及如何使用微控制器点亮LED点阵。


如果您想了解LED点阵的工作原理以及如何使用微控制器点亮它们,那么您来对地方了。在本篇文章中,我将介绍什么是LED点阵,它们是如何连接的,以及如何使用微控制器有效地驱动它们。我将以Arduino开发板为例。

rsz_dsc_1521.jpg


LED点阵

首先,什么是LED点阵呢?

实际上,LED点阵是每个单独像素是发光二极管的显示器。这些点阵广泛用于广告牌、交通信号灯、商店标志和公共汽车目的地显示器,因为它们非常可靠,耗电量小并且易于管理。


一些更大的显示器通常由多个模块构建,每个模块都有自己的控制器IC。最常见的LED点阵之一是七段数码管,用于您只需要显示数字的应用程序,例如时钟。

rsz_dsc_1608.jpg


内部连接

要了解LED点阵的工作原理以及如何点亮它们,我们首先需要了解LED内部之间是如何连接的。


您可能认为每个LED都有一个共阳极或阴极,我们从微控制器引脚驱动每个LED。对于像七段数码管这样简单的东西来说,这是一个合理的假设,但随着点阵中LED数量的增加,由于各个LED的连接数众多,这种方案成为问题。让我们以标准8x8 LED矩阵为例:如果每个LED都有单独的连接,我们需要64个输出来控制显示。这绝对不实用。

下面,您将看到LED点阵的实际构建方式:

ledsszzz.jpg


同一行上的LED将阳极连接在一起,而同一列上的LED具有共同的阴极。当然,不同的模块可以切换阴极和阳极连接。


我们现在只有16根连接:每行和每列一个连接。当我们想点亮一个像素时,我们会为其特定的行和列供电。例如,如果我们想要打开LED [1,1],我们为第一列提供接地连接并将电流驱动到第一行。

但是,当我们想要一次点亮更多LED时会出现问题。


点亮LED点阵

让我们继续使用同样的8x8的LED点阵。我谈到了如何控制每个LED,但是当我们想要点亮多个像素而不点亮有相同阳极和阴极连接的其他像素时,会出现问题。

在下面的gif动画中,你会看到我的意思。我想打开LED [1,1]和LED [2,2]。不幸的是,LED [1,2]和LED [2,1]也会点亮,形成一个正方形而不是一条线。

LedMatrixMultiplexing.jpg


我们如何解决这个问题?

很简单。我们只是一次驱动一个像素,我们这么快就做到人眼无法分辨出来。为了更高效,我们甚至可以一次驱动一行而不会有任何问题。


例如,对于上面的点阵,我们一次扫描一行。这意味着我们打开整个第一行,查看需要打开哪些LED,并将列打开我们想要打开像素的位置。然后我们进入下一行并做同样的事情,依此类推,直到我们到达最后一行并重新开始。这种重复被称为“刷新”,它在一秒钟内发生的次数称为“刷新频率”,以赫兹为单位。


这是大多数显示器的工作方式。请注意,其中一些比较复杂,例如电视和显示器,其中像素保持其照明状态,控制器一次驱动多行。


使用Arduino点亮一个8x8的LED点阵

我们已经讨论过了行扫描,其中启用了一整行,并通过将列接地来打开LED。您还可以使用列扫描,其中整个列接地并通过向各行施加电压来打开LED。本文制作的电路使用了列扫描的方式。

我们将使用一个8x8的LED点阵、ATmega328微控制器、一些无源元件、移位寄存器(74HC595DTPIC6B596)和Arduino IDE。如果需要,您可以使用Arduino Uno开发板。


只需按照下面的原理图,制作LED点阵驱动电路(原理图的右半部分),并通过5根线(VCC、接地、数据、时钟和锁存器)将其连接到Arduino Uno开发板。如果驱动电路通过导线连接,最好在每个集成电路的电源引脚附近加一个100nF滤波电容。


请注意LED点阵的引脚排列。将100nF和100uF电容放在微控制器附近的VCC和地之间;检查大电容的极性 - 外壳表面指示哪个引线为负极,此负极引线必须接地。电阻器R1至R8均为200欧姆,但您需要根据以下公式的LED阵列规格调整它们的大小:

VLED + ILED * R1 = VCC

其中VLED是典型的正向电压,ILED是所需的正向电流。

schematic_pleda_res.jpg


现在让我们分析一下这个电路是如何工作的。我们有一个微控制器、两个移位寄存器和一个LED点阵。两个移位寄存器采用菊花链式连接;这意味着它们一个接一个地连接起来。在74HC595D收到8位后,以下命令将首先发送的位推送到TPIC6B596。


移位寄存器一次从微控制器接收两个字节的串行数据。这些首先表示列,其次表示要打开的行。串行数据被转换成并行数据,引脚QA到QH和Q0到Q7是连接到LED阵列的输出。

每个数据位代表每个输出引脚的状态:使用74CC595D时1 = VCC,使用TPIC6B596时1 =接地(这是TPIC6B596的情况,因为每个输出实际上是N通道Mosfet的漏极和该位控制门极)。


以下是一个简单的例子。假设我们想要打开LED [2,1]。我们首先发送列字节B00000001,然后是行字节B00000010,它将第一个字节推送到TPIC6B595,将第一列接地,第二个字节(B00000010)将VCC应用到第二行,因此LED [2,1]开启。 (这些二进制数对应于位移位寄存器中的位;最低有效位对应于74HC595D的QA和TPIC6B596的Q0。)


TimerOne库用于以特定间隔调用函数。我们用它来精确控制刷新率。在这里,我们可以看到它的实际应用:

  1. void setup() {
  2.   ...
  3.   Timer1.initialize(2000);
  4.   Timer1.attachInterrupt(screenUpdate);
  5. }
复制代码

在上述代码中,我们初始化Timer1,并以微秒为单位指定时间段。此时间段是列保持启用状态直到扫描下一个时间段为止。每次这段时间过去,我们都会调用“screenUpdate”函数。要计算刷新率,总周期要大8倍(因为我们有8列)。在这里你可以看到我设置了2000μs的周期,相当于62.5Hz的刷新率。


screenUpdate()”函数是将数据发送到移位寄存器的函数。它从第一列(B00000001)开始,读取模式的第一个字节。然后它使用标准Arduino库中包含的“shiftOut()”函数来发送这两个字节。列字节中的“1”被移位,然后它读取模式的第二个字节,依此类推,直到它到达最后一列(B10000000)。在此之后,列字节返回到B00000001并且该过程重复。


要编辑显示模式,只需编辑“patterns.h”文件,并更改每个模式的时间段,更改“interval”变量的值。


以下是制作的实物效果:

LedArrayArduino.jpg


总结

我希望本篇文章涵盖了LED点阵的基础知识,现在您已经了解了它们的工作原理以及如何使用它们。


那你还在等什么?买一些LED点阵,或者更好的是,自己制作一个并开始熟悉它们。您可以轻松制作物联网显示屏、LED咖啡桌或Daft Punk头盔。


如果您对本篇文章有任何帮助或建议,请在下面进行回帖,我会尽力回复您。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1483



手机版|

GMT+8, 2024-5-8 23:04 , Processed in 0.073025 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表