搜索
查看: 485|回复: 0

DMA和LED相结合,能玩出什么花样?

[复制链接]

263

主题

272

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
33884
发表于 2017-6-21 09:48:43 | 显示全部楼层 |阅读模式
LED——这个我们一般拿来学习单片机的基础元器件,大家肯定对它都不陌生。利用LED构成的点阵显示器件可以方便的实现大面积的显示功能,想要驱动LED点阵也并不复杂,但是如何把它驱动好,则需要我们动一动脑筋。
36.jpg
如果你想要设计一个具有动态效果的LED,我们第一时间就会想到利用PWM来控制LED的亮度和闪烁状态,但如果想要控制矩阵的话,你可能会遇到非常多的问题,你的控制器是否有足够多的PWM端口?如果用普通IO口来模拟PWM端口的话,能否达到相同的扫描速度?
37.jpg
对于越大的LED显示器件,我们想要实现同等无闪烁的显示效果所需要的扫描时间就更短。8×8的矩阵的话,扫描频率约为100Hz。而16×16矩阵的话其扫描频率则将剧增至1666Hz。这要求控制器要有16个以这个频率输出PWM信号的端口。这并不是一个简单的任务。
38.jpg
如何解决呢?也许DMA能够提供给我们一个方便的途径。DMA(Direct Memory Access直接内存存取)是一种在现代的控制器中非常常见的外部设备。它可以在不占用CPU时间的情况下将数据从内部存储设备中移动到外部设备中,或进行相反的过程。在完成了这样的过程之后,DMA控制器将告知CPU任务已完成。而利用DMA控制器,我们就能够用它来实现高速LED显示。
39.png
我们首先要构建一个调色盘。上面的这个表格粗略的表示出了我们想要在LED矩阵上显示出来的内容。而转化成C语言的数组之后,它看起来是这个样子的。
40.png
将不同的位叠加,我们就能够得到这样的一个序列。
41.png
将数据用DMA送至IO口之后,显示在LED上,我们所看到的就是这样的效果了。
42.jpg
而通过同样的查表法,我们就可以像是显存一样将数据送至LED矩阵,并构建出动态的效果了。如下图所示:
43.gif
上面,我们对于控制行的管脚送去了数据,如果我们利用两个DMA通道同时对于控制行和控制列的管脚发送数据,我们就能够构建出更加复杂一点的动画效果了。
44.gif

相关阅读:

LED与OLED照明,你还在傻傻分不清吗?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|LED社区

GMT+8, 2018-10-24 11:30 , Processed in 0.113551 second(s), 11 queries , MemCache On.

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