失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > TinyMatrix | HUB75接口LED点阵控制器的设计

TinyMatrix | HUB75接口LED点阵控制器的设计

时间:2019-12-31 20:34:42

相关推荐

TinyMatrix | HUB75接口LED点阵控制器的设计

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位行扫描信号的输出。

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行行选择信号的输出。

将行扫描信号、行选择信号进行组合控制,就实现了整个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灯,一路用于电源状态指示,一路用于程序状态指示。

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个像素之前切换一次当前行和列。这种扫描方式能较好地解决开路十字架和残影显示问题。

现有的互联网资源很难找到IC厂商提供的驱动程序,感谢bitbucket大神@nadyrshin_ryu贡献的源码。(/nadyrshin_ryu/icn2053_esp32_demo/)

3.2. GBK中文字库

Led Matrix点阵控制器可控制GBK编码的中文字符显示。GBK字库存储在板载的SPI Flash,存储空间为8MB。

GBK全称《汉字内码扩展规范》,GBK编码是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准。

3.3. 菜单显示控制

Led Matrix点阵控制器板载1 x 4按键,通过按键控制和菜单显示实现Led Matrix Panel模式和参数的设置。

1 x 4按键从左往右依次为上翻、下翻、确认、取消。确认/取消按键的长按和短按,可以实现不同的操作。

控制逻辑和菜单结构如下:

系统上电初始化后,Led点阵板将按照设置的模式和参数,滚动显示保存的文本字符。长按按键[确认],系统将从显示模式(Menu:R)切换到设置模式(Menu:M)。进入设置模式(Menu:M)后,通过按键[上翻]、[下翻]选择对应设置项。

Menu:1.Font设置显示模式的字体,目前可选择宋体12号、16号、24号。进入子菜单后,"1.SEL"选中当前字体,"2.UPG"准备写入字体,"3.EAU"擦除当前字体。目前字库是通过UART串口通讯方式传输至Flash的。

Menu:2.Color设置显示字体的颜色,目前可选择红、绿、黄、蓝、紫、青、白和7色循环显示。进入此菜单后,选中颜色并[确认]后,字体的颜色被切换并保存。

Menu:3.Lang设置菜单显示的语言,目前可选择英文、中文2种语言显示。

Menu:4.Freq设置滚动显示的频率。进入子菜单后,"1.D_freq"可设置Led Matrix Panel的扫描频率即帧速率,"2.S_peri"可设置Led Matrix Panel的滚动字幕显示速率( :ms/pixel)。

3.4. 通讯协议格式

Led Matrix点阵控制器可通过板载UART串口,实现系统参数、字库数据的传输和菜单的显示控制。

数据帧格式如下:

已实现和可扩展的通讯协议:

推荐使用Ymodem协议进行文件传输,一次可传输1024字节的信息块,是一种可错误纠正、高效稳定的文件传输协议。

4. 结语

经历很多周末时间,终于将Led Matrix点阵控制器设计并制作完成,希望能给更多电子爱好者参考借鉴。本项目中还有更多优化空间:如选用更高时钟频率的MCU、高效的Ymodem协议,实时全彩动画显示等。但由于我时间所限,这些就交由您来完成吧!

最后附上TinyMatrix点阵控制器调试效果:

本项目设计资料已推送至 github,希望收到你的pull request。关注公众号,获取设计资料!

— END —

参考文章:

1.Everything You Didn’t Want to Know About RGB Matrix Panels

2.Adafruit RGB Matrix + Real Time Clock HAT for Raspberry Pi

/hzeller/rpi-rgb-led-matrix

4.stm32f103-bootloader-and-programming

如果觉得《TinyMatrix | HUB75接口LED点阵控制器的设计》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。