参考文献
对于相关的文件和软件,请访问:
https://www.dialog-semicondoduments.c亚博电竞菠菜om/products/greenpak.
下载我们的免费GreenPAK设计软件[1],打开。gp文件[2],并使用GreenPAK开发工具[3]在几分钟内将设计冻结到您自己的定制IC中。
yabo国际娱乐Dialog Semiconductor提供了一个完整的应用笔记[4]库,包括设计示例以及Dialog IC内的功能和模块的说明。
- GreenPak Designer软件,软件下载和用户指南,Dialog Semiconductoryabo国际娱乐
- AN-1136 LED矩阵式字符显示,GreenPak设计文件,对话半导体yabo国际娱乐
- GreenPak开发工具, GreenPAK开发工具网页,Dialog半导体yabo国际娱乐
- GreenPAK应用笔记,绿派克应用笔记网页,对话半导体yabo国际娱乐
- SLG46620对话框数据表,半导体yabo国际娱乐
介绍
在此应用笔记中,我们将解释如何使用对话框的GreenPak可编程混合信号ASIC控制8x8 LED矩阵。在本申请说明中使用了8x8 LED矩阵和Arduino程序。
该项目包含2个阶段:
- 标识将显示在Arduino的8x8 LED Matrix上的字母。
- 用GreenPAK IC接收和处理数据。
系统视图
在这个项目中,我们将通过Dialog的GreenPAK将“SILEGO”写在8x8的LED矩阵上。以这种方式使用GreenPAK可以让微控制器GPIO用于其他任务。首先,让我们谈谈8x8 LED矩阵的工作逻辑。它由64个led组成,8列8行。
如图所示,每一列都连接到使用led的行。列必须连接到Power,列必须连接到Ground,以照亮led。当电路完成时,流过led的电流使led亮起来。如图1所示,通常连接阴极的LED矩阵称为带共阴极的LED矩阵。正向电压(HIGH)应用于所选列,而正向电压(LOW)应用于所选行,以点亮矩阵中特定的led。让我们看看如何在将8x8 LED矩阵传递给Arduino程序之前获得字母。
你可以看到字母“S”在下面的8x8 LED矩阵上形成的例子;
我们需要照亮24个LED,以创建字母“S”,如图2所示。我们不能因为矩阵的共同阴极结构而在同时点亮它们。例如,我们必须将C4列设置为HIGH和R2行,低于L2 LED。因为我们为L6的L2 LED设置了C4柱,因为L6的L6和R3行为低,所以位于C4列中的LED A也将点亮。因此,我们必须逐行向行排列,而不是一次显示字母“s”。8位数据(1字节)足以8列。在每个8位数据之后,GreenPak IC应通过传递到下一行完成字母“S”。当我们通过行驱动行时,它必须作为完整的字符。为此,行之间的转换必须非常快速地进行。25fps(每秒帧)足以让人们轻松辨别角色,但我们需要超过25fps来平滑LED闪烁。在GreenPak IC内的SPI单元可以轻松实现这一点。 We learned the structure of LED Matrix and how to drive it. We can now proceed with the Arduino Program.
Arduino程序
在前一部分中,我们学习了为什么需要逐行发送图像。我们将把字母逐行分开,我们将使用SPI将它发送到GreenPAK IC。我们将每个字母定义为一个8字节序列,因为每一行都是1字节。让我们再做一次字母“S”。
R1列为10000000,R2列为00111100,R3列为101100110,如图3所示。我们将把字母“S”定义为一个8字节的分析。与前面的图不同,您可以清楚地看到图中第一列的更改。这样做的原因是将第一列设置为行切换功能。通过这种方式,我们的目标是当新的数据行传递到下一行时,扫描所有的行。
因此,我们将第一列作为控制行更改的时钟信号。因此,第一列应该是:R1为1,R2为0,R3为1,R4为0,R5为0,R5为0,R7为1和R8为0。
注意:从这里开始,第一列将被命名为rClock,不要与其他列混淆。
根据这个,我们的新代码如表1所示。
警告:注意图3中列的顺序,因为它根据图1所示的图表进行。但是,在图4中,位的顺序与图3中所示的顺序相反是因为C8已被视为MSB和Rclock作为LSB。
我们以原始形式保留8x8 LED矩阵字体,并在将行信息发送到GreenPak IC之前,将添加Rclock信号。
Arduino变量为字母“S”;
二进制 |
十六进制 |
||
C8…C2 |
rClock |
||
R1 |
0000000 |
1 |
01 |
R2 |
0011110 |
0 |
3 c |
R3 |
0110011. |
1 |
67 |
R4 |
0000011 |
0 |
06 |
R5 |
0011110 |
1 |
3 d |
R6 |
0110000 |
0 |
60 |
R7 |
0110011. |
1 |
67 |
R8 |
0011110 |
0 |
3 c |
警告:数据顺序继续像R8, R7, R6。0 x00代表R1。
如果按照ASCII表将其他字母和标记记录为二维矩阵,则有一个类似右上方图表的变量显示如下数据。
该矩阵在程序开头定义为常量,因为其值不会改变。我们安排了“设置”阶段中的SPI通信的设置,我们将引脚安排为输出以激活GreenPak IC的SPI单元。
在我们在设置功能中进行了一些安排后,我们写了一个函数。
这个函数接受2个参数作为输入。这些都是:1。一个将要显示的句子(char sentence[])和2。字母/标记的更改时间(unsigned long appearance time)。首先,已经确定了将在“For循环”中使用的变量(int i, y)和变量(byte row),该变量保存要发送到GreenPAK IC的行信息。
然后我们使用strlen函数创建“For循环”来扫描接收到的作为输入的句子变量的所有字符。
然后使用millis函数获取当前时间信息,并将其保存到名为“enterTime”的变量中。我们用这个变量和millis函数得到了while循环。
这个循环连续地将相同的字符发送到GreenPAK IC,周期等于接收到的作为输入的apptime变量的值。
while循环中的等式用我们所节省的时间(enterTime)减去当前时间,并与用户所输入的时间(appearance time)进行比较。因此,即使经过的时间比用户请求的时间短,它也会继续发送相同的字符。如果经过的时间比用户输入的时间长,就会打破这个循环,选择下一个字母。
这些行需要逐个发送,因为每个字符由8行组成。为此,“For循环”和行数据被逐个发送。
注意:变量y从7减小到0的原因是第一行数据R1位于二维矩阵的第8列。
然后我们检查行顺序来添加rClock信号。我们利用二维矩阵的索引将奇数索引中的第一列设为HIGH,偶数索引中的第一列设为LOW。
二维矩阵中列的索引号及对应的行号:
指数 |
0 |
1 |
2 |
3. |
4 |
5 |
6 |
7 |
排 |
R8 |
R7 |
R6 |
R5 |
R4 |
R3 |
R2 |
R1 |
我们从ASCII表中受益,以找出用户在8x8 LED矩阵字体上输入的句子中的相应字符。每个字符,字母和标记根据ASCII表具有数值。我们使用此数值对应创建了8x8 LED矩阵字体。例如:
在ASCII表中,L的值为76。如果我们在我们创建的二维矩阵的行索引中键入这个数字,我们就会获得为“L”创建的数据。您可以查看下面的ASCII表。
上面的代码“(int)sentence(i)”表示相关字符对应的ASCII码。在此之后,我们从我们创建的8x8 LED Matrix Font中获得了相关字符的行信息。我们用Index[y]逐一处理这些行。
如果我们需要为rClock信号设置第一列HIGH,那么我们对具有0x01的行应用“Logical or”。第一列升高,而其他列不受影响,因为0是“Logic or”流程中的无效元素。
如果需要将第一列设置为LOW,则对具有0xfe的行应用“Logical AND”。由于“Logical AND”中的元素无效,第一列变为LOW,而其他列不受影响。
最后,我们使用SPI接口将此行信息发送到GreenPak IC。
你可以在循环部分调用函数,如下所示。
GreenPAK IC的设计
首先,我们必须调整SPI单元的设置来获取来自Arduino的数据。
设置如下图4所示:
SPI单元将来自Arduino来自Arduino的数据转换为并行数据,并允许我们单独处理比特。来自Arduino的数据是列数据,这允许我们将此数据直接连接到列引脚。编程Arduino时,我们已将第一列安排为1-0-1-0 ......确保它不断变化。
在SPI单元的S2P模式下,我们将使用rClock作为时钟来理解串行到并行的数据转换已经完成。每个新行之后更改的第一列将向我们报告数据已准备好。我们将第一列连接到P DLY1单元,以检测第一列的任何变化。DLY1机组设置如下图6所示:
通过这种方式,每个传入数据的副本都会触发p dly单元并声明我们应该传递到下一行。我们使用简单计数器以顺序方式激活行。此计数器逐个增加,每当新行到达时最多可计入8。
第一个状态设置为空闲,下一个8个状态被设置为行状态,这就是计数器最多的原因。您可以看到下面使用的计数器:
您可以基于表4中的此计数器看到有源行信号。
根据K3-K2-K1-K0的情况,我们或者给每一行通电,或者停止通电。您可以看到我们在图8中使用的lut和引脚。
我们可以将DFF6的Q输出极性倒置,而不是使用INV1电池。这样我们就可以消除INV1细胞。您应该对DFF6进行如图9所示的设置。
K3 k2 k1 k0 |
R8 R7 R6 R5 R4 R3 R2 R1 |
0 0 0 0 |
0 0 0 0 0 0 0 0 0 |
0 0 0 1 |
0 0 0 0 0 0 0 1 |
0 0 1 0 |
0 0 0 0 0 0 0 1 0 |
0 0 1 1 |
0 0 0 0 1 0 0 |
0 1 0 0 |
0 0 0 0 1 0 0 0 |
0 1 0 1 |
0 0 0 1 1 0 0 0 |
0 1 1 0 |
0 0 1 0 0 0 0 0 0 |
0 1 1 1 |
0 1 0 0 0 0 0 0 |
1 0 0 0 |
1 0 0 0 0 0 0 0 0 |
|
|
但是,需要再次编辑包含K0的每个等式。例如,在第一情况下,当K2,K1,K0 = 111时,3位LUT1高,而在新情况下它必须高于K2,K1,K0 = 110。
替代设计
与第一个设计不同的是,我们可以使用DFFs来移动行切换功能的信号。通过这种方法,我们可以消除与排销相连的lut,并且可以直接将DFF与排销相连。
该设计如图10所示。
矩阵0中的DFF0看到的是空闲状态的任务。在每次改变rClock时,dff依次升到HIGH。第一个R1是高的,然后是R2。R8连接到R1,这个循环就完成了。第一种设计使用较少的DFF,而第二种设计使用较少的LUT。
连接
你可以通过改变电流来改变led的亮度。使用外部电源,通过控制电流的晶体管,我们将有一个更好的解决方案而不是完全通过GreenPAK IC驱动LED。你可以调整LED的亮度与电位计,你连接到外部电源或与PWM驱动晶体管。
Arduino Pins. |
SLG46620V引脚 |
43 |
13 |
52 |
2 |
51 |
10 |
SLG46620V引脚 |
NPN晶体管基座 |
3. |
R1基础 |
4 |
R2基础 |
5 |
R3基础 |
6 |
R4基地 |
7 |
R5的基础 |
8 |
R6基地 |
9 |
R7基地 |
12 |
R8基础 |
SLG46620V针 |
8x8 LED矩阵引脚 |
14 |
3. |
15 |
4 |
16 |
10 |
17 |
6 |
18 |
11 |
19 |
15 |
20. |
16 |
8x8 LED矩阵引脚 |
NPN晶体管收集器 |
9 |
R1 |
14 |
R2 |
8 |
R3 |
12 |
R4 |
1 |
R5 |
7 |
R6 |
2 |
R7 |
5 |
R8 |
NPN晶体管发射器 |
电位计销 |
R1 |
3. |
R2 |
3. |
R3 |
3. |
R4 |
3. |
R5 |
3. |
R6 |
3. |
R7 |
3. |
R8 |
3. |
电位计销 |
电源销 |
2 |
接地 |
结论
在这个项目中,我们学习了用GreenPAK IC控制常用的8x8 LED Matrix,用SLG46620V版本的SPI单元控制LED Matrix非常容易,用这种方法可以很容易地控制LED Matrix。或者,您可以使用在GreenPAK5中可用的I2C协议来控制引脚的输出。
设计的局限性:
- SPI的第1列保留给rCLK
- 如果设计改变,第一列的gpio不够