0. 前言
工具箱里有块闲置的Led点阵板,于是便想折腾起来让其绽放色彩。HUB75是全彩LED显示屏最常见的接口,但很难找到标准通信协议。经历一番探索调试,将其记录于此文。
1. 硬件篇
1.1. HUB75接口定义
Led点阵板的HUB75接口,一般以DC3-16P牛角座封装形式接入。通常Led点阵板的左右两侧各有一个HUB75接口IN、OUT,以实现多块Led点阵板的组合扩展。HUB75接口中:R1、G1、B1分别为上半屏的红、绿、蓝控制信号,R2、G2、B2分别为下半屏的红、绿、蓝控制信号,A、B、C、D、E为行选择信号,CLK为数据时钟信号,LAT为数据锁存信号,OE为输出使能信号,GND为信号地。
1.2. HUB75扫描方式
那么Led点阵板是怎样通过HUB75接口实现行扫描信号、行选择信号的输入和锁存的呢?
我们来复习下数字电路中的D型锁存器:CLK=1时,Q端将置为D端输入电平状态;CLK=0时,Q端将保持Q端输出电平状态。如果将8个D型锁存器串联就构成了一个8位串入并出移位寄存器,74HC595是一个8位串行输入、并行输出移位寄存器的集成电路。如果将8个74HC595集成电路级联,通过CLK数据时钟、LAT数据锁存、OE输出使能控制便能实现64位行扫描信号的输出。
![](https://i-blog.csdnimg.cn/blog_migrate/526eea5faa34cdd5ef04cf28f9c82a27.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a7a50884f79267e3af002556eec1e390.png)
Led点阵板通常被设计成上下两个部分进行显示,这样就能够降低扫描频率、减少地址线,代价是需要增加数据线。所以对于32扫的Led点阵板,需要6根数据线(上半屏R1、G1、B1,下半屏R2、G2、B2),5根地址线(A、B、C、D、E)。
我们来复习下数字电路中的3线-8线译码器:当E1=0、E2=0、E3=1时,输入端A0、A1、A2的二进制编码被译码成相应的十进制信号至输出端Yn。74HC138是一个3线-8线译码器的集成电路。如果将4个74HC138集成电路和一个非门电路进行连接,就构成了一个5线-32线译码器,便能实现5位-32行行选择信号的输出。
![](https://i-blog.csdnimg.cn/blog_migrate/668e20152f0a37987cda7808518cca8a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2b0c922e0a88d42ae9cee5d15af70216.png)
将行扫描信号、行选择信号进行组合控制,就实现了整个Led点阵板的扫描显示。其具体实现过程如下:
- 从DATA_IN引脚(R1、G1、B1、R2、G2、B2)写入1 bit数据,将CLK引脚拉高产生上升沿将数据写入移位寄存器。如此循环m次将一行m bit数据传输至移位寄存器。
- 将LATCH、OE引脚拉高,m bit数据被从移位寄存器传输至缓存寄存器。同时缓存寄存器中数据被保持禁止从输出驱动器中输出,以使得在行选择信号切换时没有Led被点亮。
- 切换并输出行选择信号。(初始状态时,第0行、第32行被选中。)
- 将LATCH、OE引脚拉低,m bit数据被从缓存寄存器传输至输出驱动器。同时移位寄存器中数据被锁存禁止从缓存寄存器中移出,此时对应选中行Led被点亮。
将以上步骤执行n/2次,便能实现m x n像素Led点阵板整个画面的扫描显示。如果扫描频率足够低,我们能看到逐行扫描显示的全过程:
基于人眼视觉暂留效应(余晖效应),我们无法分辨刷新率在24Hz以上的动态画面。如果将扫描频率设置在60Hz,我们就能看到一幅完整的静态画面。而这也就是常见的显示器的基本原理。
最后,将Led点阵板上下两个部分的R1、G1、B1、R2、G2、B2控制信号进行组合,便能基于光学RGB模型实现全彩显示。
1.3. Led Matrix控制板设计
了解了HUB75接口的控制原理,接下来进行Led Matrix控制板设计。
Led Matrix控制板设计思路如下:
Led Matrix控制板的核心选择的是一款尺寸为 22.86mm x 53.34mm 的STM32最小系统板。其通过2 x 20Pin GPIO排针将板载STM32F103C8T6 MCU内集成的2x SPI、3x USART、2x I2C、1x CAN、37x I/O、2x ADC、4x Timer等硬件资源引出,以便外围扩展板调用。固件程序可通过SWD接口进行烧录和调试,可通过Reset键复位。板载2路Led灯,一路用于电源状态指示,一路用于程序状态指示。
![](https://i-blog.csdnimg.cn/blog_migrate/5c7f6800c51974cbb48191affd7ae0d7.jpeg)
Led Matrix控制板设计1 x 4按键用于点阵控制器的参数设置。MCU相关GPIO经由74HC245连接至HUB75接口,以增加驱动电流并将驱动电压从3.3v转换至5.0v。外挂的W25Qxx系列SPI Flash用于存储系统参数和字库数据。UART串口可用于下载系统参数和字库数据,TTL-蓝牙模块、TTL-WiFi模块通过UART串口建立与MCU间的通讯以实现控制指令、显示数据的无线透传。Led Matrix控制板由外接电源适配器或内置锂离子电池提供系统电源,直流降压电路实现系统电源从12v-> 5v-> 3.3v电压转换以给各功能单元供电。
基于以上硬件需求,将Led Matrix控制板通过Eagle PCB设计如下。选择使用Eagle PCB,是因为其小巧精悍、简单易用,丰富的元件库、精美的原理图、标准vector字体,无不透露着严谨精致。可惜的是,被Autodesk收购后的Eagle 9.6.2对于3D模型的预览编辑需要通过Fusion 360来实现。
预计Eagle PCB的功能将被全部整合入Fusion 360,一款优秀的EDA工具将走向终点。
2. 结构篇
Eagle 9.6.2不支持直接编辑3D封装,而只能通过Fusion 360以云托管元件库的方式导入。不想从Fusion 360中重构元件库,但又追求项目完整性,这怎么解决呢?那就选择KiCad,不仅支持3D封装的直接编辑,还能将Eagle的.sch原理图文件、.brd电路板文件转换成对应的KiCad格式文件。
使用KiCad将Led Matrix控制板的Eagle格式文件转换成KiCad格式文件,基于此添加编辑3D封装,导出Led Matrix控制板3D Step模型文件。
使用KiCad对MCU核心板重新进行layout,添加编辑3D封装,导出MCU核心板3D Step模型文件。
在Fusion 360中将Led Matrix控制板和MCU核心板进行零件装配、干涉检查。
在Fusion 360中将Led Matrix控制板设置为固定零件,以此为基准依据Led Matrix控制板的空间尺寸设计Led Matrix控制器的整体结构。选择亚克力板材作为外壳材质。顶部和底部亚克力板通过双通螺母柱进行连接,Led Matrix控制板和Led点阵板与底部亚克力板连接固定,四侧亚克力板与顶部和底部亚克力板通过卡扣扣合进行连接。
3. 软件篇
3.1. RGB LED全彩显示
控制RGB LED实现全彩显示的传统方式是脉宽调制(Pulse Width Modulation),简称PWM。通过脉宽调制控制LED开关时间占比,进而实现RGB LED的亮度调节。如果对RGB模块中的三个LED进行此操作,则可以将红绿蓝三色按比例混合成对应的RGB全彩输出。对于Led Matrix Panel的全彩显示,PWM方式却不适用:这需要足够多的GPIO和定时器独立控制,需要消耗太多的硬件资源。那么我们如何通过软件方式予以解决呢?
二进制编码调制(Binary Code Modulation),简称BCM。BCM利用二进制编码性质控制开关信号占空比。假设有一个位宽为4的二进制数:从其最低位向左移动至最高位依次表示1个时间切片、2个时间切片、4个时间切片、8个时间切片。将这4种时间切片混合,可产生分辨率为1/15的任意占空比。如此,位宽越大分辨率越高色彩越丰富。位宽为8的二进制数,可表示分辨率为1/255的任意占空比。但位宽越大,时间切片越小,意味着更高的CPU占用率。为更好地平衡系统性能和硬件资源,本项目中BCM位宽为4。例如,4位二进制数0101表示5/15或33.3%的占空比。
Led Matrix Panel是逐行扫描显示的,所以需要预先将图像像素色彩转换成BCM值保存至图像缓冲区。创建4个图像缓冲区,以表示BCM位宽为4情况下的4种长度的时间切片中在扫描时间范围内哪些时间切片需要点亮LED。将这4个图像缓冲区构成的4个颜色通道Plane,进行图像融合就构成了一幅完整的静态图像。
每1个颜色通道需要6位二进制数表示1个像素(每一个时钟周期内同时扫描Led Matrix Panel上半部分、下半部分)。4个颜色通道需要4x 6= 24位二进制数,即3个Byte来表示一幅完整的静态图像中的1个像素。Byte 1的高6位表示Plane 1,Byte 2的高6位表示Plane 2,Byte 3的高6位表示Plane 3,Byte 1的低2位、Byte 2的低2位、Byte 3的低2位表示Plane 0。
将图像中全部像素从左至右、从上至下逐一转换成对应的3 Byte缓冲数据。这时有两种扫描方式:
- 先选择Row 0,将Plane 0至Plane 3数据依次输出,再切换至Row 1,直至Row 31。
- 先选择Plane 0,将Row 0至Row 31数据依次输出,再切换至Plane 1,直至Plane 3。
那么,哪一种扫描方式效果更好呢?可以料想方式2需要更多的Row行切换,不仅消耗更多的硬件资源,而且在显示动态图像时更易产生闪烁现象。所以,先将一行像素的Plane 0至Plane 3数据依次输出,此行扫描显示完成。
切换行选择信号,选中下一行。再将一行像素的Plane 0至Plane 3数据依次输出,此行扫描显示完成。如此,循环切换行选择信号,再将Plane数据依次输出,一幅完整的静态图像扫描显示完成。
缓冲区数据和行Row地址对应关系如下:
需要注意的是,BCM调制实现Led Matrix Panel的全彩显示需要高速时钟信号。以BCM位宽为4为例,如果1个时间切片内完成一行LED扫描,那么实现一行LED全彩显示需要15个时间切片。设置帧频率FPS= 60Hz,则行扫描频率LPS= 60x (n/2)x 15= 60x 32x 15= 28800Hz。本项目板载STM32F103C8T6 MCU主频为72MHz,程序内有多个任务分时调度处理,经调试发现将行扫描任务定时器频率设置为LPS= 28800Hz后,在1个时间切片内无法完成一行LED扫描。
如果选用更高时钟频率的MCU、减少调度任务数量,确保行扫描任务在任务时间切片内执行完毕,便能通过BCM调制实现Led Matrix Panel的全彩显示。而在实际应用中需要将多个Led Matrix Panel组合成大型LED显示屏,这就需要更高的扫描频率,通常设计采用高速FPGA输出扫描信号。
现在集成有MBI5153/ICN2053这类LED驱动芯片的Led点阵板,可通过写入参数至配置寄存器选择1~32扫任意扫描行数、配置输出电流增益等,可通过写入16bit灰阶数据以PWM调制实现LED全彩显示。
其扫描显示序列如下,即每显示1个像素之前切换一次当前行和列。这种扫描方式能较好地解决开路十字架和残影显示问题。