如何控制74hc595驱动led产生灰度等级
平常我们用595来驱动led的话要么亮,要么灭,灰度怎么产生呢?整体的灰度倒是很好控制。直接将数据送号,然后用一个pwm波形控制oe脚就可以了,但是如果要产生一个每个点都好像是有灰度,每个点的灰度值都不同改怎么处理呢?
市面上我见过一种灯饰控制器,七彩的流水效果,各个颜色之间是过渡色,并不是突兀的直接变化,比如大屏幕它们的灰度是怎么控制的呢? 每个点都可以PWM呀。
比如用1MHz的CLK,串联32个595,共控制256点。
接着计算——
这样打出一周期的数据才256微秒,打出64周期的数据需用256×64=16384μs=16.384ms。
若以这个8.192ms作为PWM周期的话,可以做出6位的灰阶来。
16.384ms亦即每秒钟能更新61回,利用视觉的残像效应,够了!PC屏幕的帧频不是才60Hz吗?
当然,如果纯用软件做的话,不一定做得到1MHz那么快的时钟。把串联级数减少点,或灰阶位数减少点就行了。 你可以线尝试用软件模拟控制IO产生PWM控制
然后把595想成IO口就可以了。 还不是太明白,能详细说一下吗? 他的意思是说不用OE控制。而是把595的每个输出当作IO口。用他们模拟出类似PWM的效果。比如只接了一个595,要降低第一个小灯的亮度。则循环锁存1111 1110和1111 1111,配合锁存引脚。这样。第一个灯的亮度就低了。而其他的一直最亮 4楼正解。 这样的话,如果要接很多的话,那么数据量不是很大吗? 我现在也只能把把有的595输出当一个整体来做渐变,要每个输出都作不同的渐变也不会 串接4个595的话可以控制32个灯,只用3个IO口。刚好定义一个long数据,每一位表示一个灯。操作还是比较方便的。 还是没太理解【4楼】 friendljy的意思,你这样最多只是把595的一个口的灯变化了,但其它的呢?如果要求其它的变化不同步怎么办? 我是顺着2楼的意思说的。也没试过。不过感觉应该可行。
比如你把一秒分成1000个帧,然后每毫秒重新锁存这32bit也就是32个灯的亮度状态。最亮的当然就是1000次全亮。然后想要调暗某些灯在1000帧的某些帧间隔把他们打暗就行了。不过要注意的是不能暗的时间过长超过人眼的分辨时间。 【回楼主/6楼】
数据量虽大但可不是常数,每次输出时按PWM计数器跟灰阶值临时算的。控制器需保存的数据是每位的灰阶,PWM只是个free-run计数器,字长跟灰阶一样。 因为595有输出锁存的和移位寄存器两级缓存。
所以在移位时不会影响输出信号!
如果只是做局部区域性流水的(多个灯一个颜色)渐亮,程序只需要两个变量 1 颜色变量 2 亮度,亮度=在这个区域中点亮灯个数的百分比。组出来的效果就是流水渐亮的。
这个是移动上有一组‘PWM‘控制,亮度上有一组’PWM‘控制。颜色切换也可以看成一组’PWM‘控制。
数据链--- 00000000
段1 段n
t1 10000000
t2 01000000
t3 00100000
00010000
00001000
00000100
00000010
00000001
t 每个亮度脉宽t时刻移位一个,在一个完整周期Tn内则移动了n,则在这个周期里,所有位的亮度是一样的都只点亮了一次亮度为1/8
数据链--- 00000000
t11 10000000 10000000
t21 11000000 01000000
t31 01100000 00100000
00110000 00010000
00011000 00001000
00001100 00000100
00000110 00000010
00000011 00000001
--- -----
在 T2 > T > T1,移位过程中,如’-‘标注的,是一部分的亮度是1/8,2/8。595的移位作用,所以每个点经历的数据是一样的。
在T1,与T2周期比,则在 段1.1位 单点亮度点亮了两次了,则亮度增加了
T2 在段的层面,段1处以2/8亮度状态。 段2处以1/8亮度状态。所以亮度移动了。
就软件来说。直接安照PWM控制一个595IO口亮度,移位推出值,由于595是串行的,所以你控制的离MCU最近那个点的值也会重复出现在其它595IO上,只是依次慢了一个脉冲宽度的时间。
亮度是自然移动的 : )不用特殊操作的。
如果要用颜色移动的话,就需要考虑595作用缓存了。一次串行移出一个段的颜色。在段的层面(把段看成一个大点)控制亮度,则颜色也会渐变移动的。
-----------------以上论点已经使用,可以用程序实现,不占用RAM(较少的控制变量除外)------------------
如果想做每个点的颜色不一样的灰度控制,只能用MCU不断输出RAM的颜色数据,灰度来实现。 全错
产生单点灰度,需要时钟,数据,锁存,使能四线控制方式,关键在使能脚的控制. 13楼说说原理 有意思了,看来有很多种方法啊!
13楼说说你的原理 我的应用在护栏灯领域是没问题!
13楼,我承认我没做过单点颜色灰度!说说你的方式,语言描述就好!
:) 关注。。。 这在LED护栏灯上应用较常见,就是用较大的数据流控制595的IO单位时间内的高低电平所占的比例来实现的.
先用网格软件编好具有灰度等级的动画文件,然后对动画文件进行数据处理(按595管脚和多个595排列方式),一般常用的是8421压缩即16级灰度方式,当然还有32或更高灰度的,这种做法并不需要使能脚的控制,只需数据、时钟和锁存三根控制线. 【1楼】 holycat 仙猫的方法是可以控制单点的灰度的
【18楼】 2233223 雪之爱 应该也是比较了解,基本上把过程的都说出来了,实际应用的话,除了做轮廓的,很少用到8级或者16级灰度了,一般都32级以上,但是32级以上不用使能脚控制的话,可以控制的点数比较有限。
现在最多可以做到的应该是每种颜色16384级灰度,就是说单点可以出16384×16384×16384种颜色,比较恐怖。。 我觉得仙猫的方法可行,理解起来也简单,但是13楼呢?你的想法是什么样的呢? 13楼19楼的兄弟能说说在单点灰度使能脚的用法吗?虽然离开灯饰行业差不多有一年了,但还是挺感兴趣的 晕呼呼,看完了还是没弄懂。
我现在是只控制第一个点的变化,依靠595的移位使其它点也变化,但整体看起来是同时变化的,没有流动的效果。 74hc595驱动led产生灰度等级只能是很少的led,大屏幕有专门的灰度等级控制芯片 护栏灯上用这个就足够了。
22 楼把移位速度减慢点。10个点移动的周期控制在20ms左右。看看效果后,然后慢慢加点。
大屏很闹火的。 【24楼】 mljda:不知道你控制595的方式是怎么样的?我是一位一位控制的(可能你是一下传8位)。如果我把位移速度调慢的话就会感觉有抖动。 我本来不想说的,因为以前有人说过现在LED的资料漫天飞,没什么行业秘密
16个灰度,也就是 0--15,用4个BIT来表示, 8-4-2-1
用PWM产生4个联系不同占空比的脉冲
T8 8/16 对应BIT8
T4 4/16 对应BIT4
T2 2/16 对应BIT2
T1 1/16 对应BIT1
8/16表示的是把PWM的周期划分为16份,其中量的周期占8份,其他雷同
当这4个脉冲运行后,由于人的生理特点。也会出现需他的灰度;
同上面的方法比较,它需要4次个周期人眼才能感觉出灰度;
但是对PWM的要求就很低;比如256种灰度,不过送8次,1024也不过要10次
大大减低了对硬件的要求,现在基本都是使用这种方法;
在一个595上+出现不同的灰度,就必须结合上面说的东东;
把一个灰度分解成4帧
例如灰度9: 1001
T8 8/16 对应BIT8
T4 不亮 对应BIT4
T2 不亮 对应BIT2
T1 1/16 对应BIT1
所以我们的各个灰度分解为4帧,送4次都595,就可以了
例如在1个595上出现下面不同灰度的4个点,(就以4个点举例,)
4个点的灰度
3,12,10,7
转化为BIN码
001111001010 0111
把8-4-2-1码分割出来,得到独立的4帧
BIT8
0 1 1 0
BIT4
0 1 0 1
BIT2
1 0 1 1
BIT1
1 0 0 1
步骤:
1.把BIT8的数据送到595,用PWM控制OE的脉冲为T8
2.把BIT4的数据送到595,用PWM控制OE的脉冲为T4
3.把BIT2的数据送到595,用PWM控制OE的脉冲为T2
4.把BIT1的数据送到595,用PWM控制OE的脉冲为T1
经过4帧的时间叠加后,就得到不同的灰度。 楼上精彩! 用输出锁存没有
25由于移位。3RGB占3个脚,输出一个点,其实是要操作3个595IO口的。所以也要用输出所存的。
26楼专家。视频屏的用法。学习了。
可惜网上也不是LED满天飞!
拜谢了。自己一直没想出来。看来回帖有好报啊! 呵呵..终于明白了,谢谢26楼! 谢谢【26楼】 polarbear 枫叶,原来是控制OE,我一直把OE直接接地了 仔细看了26楼北极熊的思路,果然是相当精彩,以前不知道,学习了!
俺从未用CPU这么做过,而是用FPGA做过类似的东西。
26楼方案向595输出的CLK的密度要少得多,总体上能减轻软件的负担。但因周期是不等长的,代码会变得复杂。
另外由于CLK引发的噪声,将不再集中于一个频率上。
细想想的话,如果点数很多,用软件做肯定是困难的,尤其需要加入动感和灰阶时。因需要准确的CLK周期,借助于中断的话,进入/退出服务程序也是要花费CPU开销的,CLK就做不快,而这时用FPGA来实现应该是最合适的。 我们单位以前用CPLD控制的全彩屏,12级灰度的彩色,还是蛮好看的。时钟频率达到6MHZ,抗干扰有点不行了,呵呵。 记号...... 26楼的精彩。。谢谢了。。 最近也一直在想这个问题...
看了26楼的感觉不错.
谢谢1!! 没太看明白26楼的,晕呼呼,哪位高手再解释下? 恩 精彩 唉,哪有满天飞的资料呀?
花钱买了学习学习也行呀.
QQ:1103012 必须做个记号了. 有专门的芯片 mark mark 赞一个,26楼的好! 今天看了一个大屏幕,里面用到的驱动是这样几个:595、138、245。
是256级灰度的,屏是双色的,但是好像从来都是只亮红色的。 mark 必须做个记号了 26楼精彩,学习了。 反复看了很多次就是没看懂,有谁看懂了写个小代码来测试一下。最好是51的。 没搞过,但看过FPGA的资料,FPGA也没搞过,给我最大的疑问是:这些灰阶控制LED屏,对LED灯有要求吗,一般的LED可以吗?好像都是单色的啊! 懂了,26楼专业,我以前还买过LED屏这方面的资料,但都是论文啥的 PWM直接控制OE脚就可以啦,不过是控制全部的亮度 这是LED显示屏的控制方法,往视频算法方向考虑下吧! 其实视频也是这样做的 记下了,过段时间做做实验。整天净做低级的事情了,高级的事情没时间想,呵呵,必须扭转现状 近来也在关注这个问题,先谢谢上面几位高手的解答,研究一下,再来探讨。 对,应该作个记号,要学习一下26楼的经验! 有启发,谢谢 polarbear 枫叶! mark 留爪 13楼说的是做显示屏的,如果只点亮几个灯并且有灰度,可以用PWM功能。 记号 谢谢26楼的朋友,虽然原来看过专门讲LED屏的书,不过没有你说得通俗易懂,再次拜谢了 用595的3个输出口加上R-2R网络就成了,3BIT DAC,这样有8级灰度 博大精深,谢谢!做个记号! 好东西,收藏 mark 26楼精彩. 【26楼】 polarbear 说得精彩,学习了 不错的应用,受教了. 记号 mark 以前做过LED屏,只做过单色的,不过没做伪彩和全彩,好像外面通用的方式是595+TIP127,595控制点数据,127控制行扫,直接控制127的通断时间就可以实现灰度,由于595带锁存功能可以在显示当前行的时候更新下一行的数据,楼主可以找卖主控卡的厂家,一般都提供点阵屏的PCB版图。 26楼厉害,以前听人说过,就是没明白!现在看了三遍才明白,那么如果要产生256灰阶呢?
这样做吗?
256个灰度,也就是 0--255,用8个BIT来表示, 128-64-32-16-8-4-2-1
用PWM产生8个联系不同占空比的脉冲
T128 128/256 对应BIT128
T64 64/256 对应BIT64
T32 32/256 对应BIT32
T16 16/256 对应BIT16
T8 8/256 对应BIT8
T4 4/256 对应BIT4
T2 2/256 对应BIT2
T1 1/256 对应BIT1
然后后面数据处理发送类似方法? 个人理解:
普通led屏在亮时,虽然肉眼看起来是静止的,但实际上是在快速的扫描。
如果你要实现灰度,在普通无灰度的基础上,把扫描频率加快16倍,这样控制每个点每次扫描时的亮灭,就可以实现16级灰度。
没试验过,欢迎指正。 【80楼】 javenreal
可以这样理解 好帖不能不顶啊,学习了 牛人集中地 【80楼】 javenreal 的方法不如26楼的。
受教了。 我理解是这样的:枫叶的思路是不是在没加灰度的刷新频率基础上提高到了4倍?相当于一幅没有灰度的画面现在加上灰度后需要刷新4次才能现显灰度的效果? 学习 虽然还没看懂, 留记号. 还在硬件··mark·· 一直在找相关LED驱动的资料,转载一遍文章,应该可以正解枫叶写的内容.
点击此处下载 ourdev_529097.pdf(文件大小:112K) (原文件名:256级灰度LED点阵屏显示原理及基于FPGA的电路设计.pdf) mark MARK 记号 记号 mark mark,学习,等有心得了再来汇报 我理解了,也写出程序了,可就是调不出来,郁闷。。。。。。。。。 学习学习 谢谢高手 看完26楼恍然大悟,mark jh mark,好贴! 好老的贴,又被顶出来了 路过,看看。 学习一下 学习学习