| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> TinyMatrix | HUB75接口LED点阵控制器的设计 -> 正文阅读 |
|
[嵌入式]TinyMatrix | HUB75接口LED点阵控制器的设计 |
0. 前言
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点阵板的扫描显示。其具体实现过程如下:
将以上步骤执行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来实现。
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缓冲数据。这时有两种扫描方式:
那么,哪一种扫描方式效果更好呢?可以料想方式2需要更多的Row行切换,不仅消耗更多的硬件资源,而且在显示动态图像时更易产生闪烁现象。所以,先将一行像素的Plane 0至Plane 3数据依次输出,此行扫描显示完成。 切换行选择信号,选中下一行。再将一行像素的Plane 0至Plane 3数据依次输出,此行扫描显示完成。如此,循环切换行选择信号,再将Plane数据依次输出,一幅完整的静态图像扫描显示完成。 缓冲区数据和行Row地址对应关系如下:
现在集成有MBI5153/ICN2053这类LED驱动芯片的Led点阵板,可通过写入参数至配置寄存器选择1~32扫任意扫描行数、配置输出电流增益等,可通过写入16bit灰阶数据以PWM调制实现LED全彩显示。 其扫描显示序列如下,即每显示1个像素之前切换一次当前行和列。这种扫描方式能较好地解决开路十字架和残影显示问题。 现有的互联网资源很难找到IC厂商提供的驱动程序,感谢bitbucket大神 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按键从左往右依次为上翻、下翻、确认、取消。确认/取消按键的长按和短按,可以实现不同的操作。 控制逻辑和菜单结构如下:
initialize
long ENTER
long ESC
power on
Menu:R
Menu:M
Menu:1.Font
1.Font12 2.Font16 3.Font24
Menu:2.Color
1.Red 2.Green 3.Yellow 4.Blue 5.Pink 6.Cyan 7.White 8.Auto
Menu:3.Lang
1.EN 2.CN
Menu:4.Freq
1.D_freq 2.S_peri
Menu:1.1.FONT12
1.SEL. * 2.UPG. * 3.EAU. !
Menu:1.1.Dis_Freq
60Hz
Menu:1.2.Shi_Peri
100ms 系统上电初始化后,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串口,实现系统参数、字库数据的传输和菜单的显示控制。 已实现和可扩展的通讯协议:
4. 结语经历很多周末时间,终于将Led Matrix点阵控制器设计并制作完成,希望能给更多电子爱好者参考借鉴。本项目中还有更多优化空间:如选用更高时钟频率的MCU、高效的Ymodem协议,实时全彩动画显示等。但由于我时间所限,这些就交由您来完成吧! 最后附上TinyMatrix点阵控制器调试效果: 本项目设计资料已推送至 github,希望收到你的pull request。关注公众号,获取设计资料! 参考文章: |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/8 5:21:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |