搜索
bottom↓
回复: 334

如何控制74hc595驱动led产生灰度等级

  [复制链接]

出0入0汤圆

发表于 2008-4-18 15:17:02 | 显示全部楼层 |阅读模式
平常我们用595来驱动led的话要么亮,要么灭,灰度怎么产生呢?
整体的灰度倒是很好控制。直接将数据送号,然后用一个pwm波形控制oe脚就可以了,但是如果要产生一个每个点都好像是有灰度,每个点的灰度值都不同改怎么处理呢?
市面上我见过一种灯饰控制器,七彩的流水效果,各个颜色之间是过渡色,并不是突兀的直接变化,比如大屏幕它们的灰度是怎么控制的呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2008-4-18 15:43:39 | 显示全部楼层
每个点都可以PWM呀。
比如用1MHz的CLK,串联32个595,共控制256点。
接着计算——
这样打出一周期的数据才256微秒,打出64周期的数据需用256×64=16384μs=16.384ms。
若以这个8.192ms作为PWM周期的话,可以做出6位的灰阶来。
16.384ms亦即每秒钟能更新61回,利用视觉的残像效应,够了!PC屏幕的帧频不是才60Hz吗?
当然,如果纯用软件做的话,不一定做得到1MHz那么快的时钟。把串联级数减少点,或灰阶位数减少点就行了。

出0入0汤圆

发表于 2008-4-18 15:49:18 | 显示全部楼层
你可以线尝试用软件模拟控制IO产生PWM控制
然后把595想成IO口就可以了。

出0入0汤圆

 楼主| 发表于 2008-4-18 16:03:19 | 显示全部楼层
还不是太明白,能详细说一下吗?

出0入93汤圆

发表于 2008-4-18 16:12:37 | 显示全部楼层
他的意思是说不用OE控制。而是把595的每个输出当作IO口。用他们模拟出类似PWM的效果。比如只接了一个595,要降低第一个小灯的亮度。则循环锁存1111 1110和1111 1111,配合锁存引脚。这样。第一个灯的亮度就低了。而其他的一直最亮

出0入0汤圆

发表于 2008-4-18 16:26:12 | 显示全部楼层
4楼正解。

出0入0汤圆

 楼主| 发表于 2008-4-18 16:51:01 | 显示全部楼层
这样的话,如果要接很多的话,那么数据量不是很大吗?

出0入0汤圆

发表于 2008-4-18 17:01:21 | 显示全部楼层
我现在也只能把把有的595输出当一个整体来做渐变,要每个输出都作不同的渐变也不会

出0入93汤圆

发表于 2008-4-18 17:03:49 | 显示全部楼层
串接4个595的话可以控制32个灯,只用3个IO口。刚好定义一个long数据,每一位表示一个灯。操作还是比较方便的。

出0入0汤圆

发表于 2008-4-18 17:14:19 | 显示全部楼层
还是没太理解【4楼】 friendljy的意思,你这样最多只是把595的一个口的灯变化了,但其它的呢?如果要求其它的变化不同步怎么办?

出0入93汤圆

发表于 2008-4-18 17:32:52 | 显示全部楼层
我是顺着2楼的意思说的。也没试过。不过感觉应该可行。
比如你把一秒分成1000个帧,然后每毫秒重新锁存这32bit也就是32个灯的亮度状态。最亮的当然就是1000次全亮。然后想要调暗某些灯在1000帧的某些帧间隔把他们打暗就行了。不过要注意的是不能暗的时间过长超过人眼的分辨时间。

出0入0汤圆

发表于 2008-4-18 17:41:09 | 显示全部楼层
【回楼主/6楼】
数据量虽大但可不是常数,每次输出时按PWM计数器跟灰阶值临时算的。控制器需保存的数据是每位的灰阶,PWM只是个free-run计数器,字长跟灰阶一样。

出0入0汤圆

发表于 2008-4-18 18:01:05 | 显示全部楼层
因为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的颜色数据,灰度来实现。

出0入0汤圆

发表于 2008-4-18 19:08:32 | 显示全部楼层
全错
产生单点灰度,需要时钟,数据,锁存,使能四线控制方式,关键在使能脚的控制.

出0入0汤圆

发表于 2008-4-18 19:29:29 | 显示全部楼层
13楼说说原理

出0入0汤圆

 楼主| 发表于 2008-4-18 20:27:21 | 显示全部楼层
有意思了,看来有很多种方法啊!

13楼说说你的原理

出0入0汤圆

发表于 2008-4-18 20:38:56 | 显示全部楼层
我的应用在护栏灯领域是没问题!

13楼,我承认我没做过单点颜色灰度!说说你的方式,语言描述就好!
:)

出0入0汤圆

发表于 2008-4-18 20:45:46 | 显示全部楼层
关注。。。

出0入0汤圆

发表于 2008-4-18 21:43:07 | 显示全部楼层
这在LED护栏灯上应用较常见,就是用较大的数据流控制595的IO单位时间内的高低电平所占的比例来实现的.
    先用网格软件编好具有灰度等级的动画文件,然后对动画文件进行数据处理(按595管脚和多个595排列方式),一般常用的是8421压缩即16级灰度方式,当然还有32或更高灰度的,这种做法并不需要使能脚的控制,只需数据、时钟和锁存三根控制线.

出0入0汤圆

发表于 2008-4-19 00:46:26 | 显示全部楼层
【1楼】 holycat 仙猫的方法是可以控制单点的灰度的
【18楼】 2233223 雪之爱 应该也是比较了解,基本上把过程的都说出来了,实际应用的话,除了做轮廓的,很少用到8级或者16级灰度了,一般都32级以上,但是32级以上不用使能脚控制的话,可以控制的点数比较有限。

现在最多可以做到的应该是每种颜色16384级灰度,就是说单点可以出16384×16384×16384种颜色,比较恐怖。。

出0入0汤圆

 楼主| 发表于 2008-4-19 01:29:43 | 显示全部楼层
我觉得仙猫的方法可行,理解起来也简单,但是13楼呢?你的想法是什么样的呢?

出0入0汤圆

发表于 2008-4-19 08:56:34 | 显示全部楼层
13楼19楼的兄弟能说说在单点灰度使能脚的用法吗?虽然离开灯饰行业差不多有一年了,但还是挺感兴趣的

出0入0汤圆

发表于 2008-4-19 09:11:47 | 显示全部楼层
晕呼呼,看完了还是没弄懂。
我现在是只控制第一个点的变化,依靠595的移位使其它点也变化,但整体看起来是同时变化的,没有流动的效果。

出0入0汤圆

发表于 2008-4-19 09:31:10 | 显示全部楼层
74hc595驱动led产生灰度等级只能是很少的led,大屏幕有专门的灰度等级控制芯片

出0入0汤圆

发表于 2008-4-19 09:38:04 | 显示全部楼层
护栏灯上用这个就足够了。

22 楼把移位速度减慢点。10个点移动的周期控制在20ms左右。看看效果后,然后慢慢加点。

大屏很闹火的。

出0入0汤圆

发表于 2008-4-19 09:50:16 | 显示全部楼层
【24楼】 mljda:不知道你控制595的方式是怎么样的?我是一位一位控制的(可能你是一下传8位)。如果我把位移速度调慢的话就会感觉有抖动。

出0入59汤圆

发表于 2008-4-19 10:55:50 | 显示全部楼层
我本来不想说的,因为以前有人说过现在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码
0011  1100  1010 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帧的时间叠加后,就得到不同的灰度。

出0入0汤圆

发表于 2008-4-19 11:18:16 | 显示全部楼层
楼上精彩!

出0入0汤圆

发表于 2008-4-19 11:30:56 | 显示全部楼层
用输出锁存没有

25由于移位。3RGB占3个脚,输出一个点,其实是要操作3个595IO口的。所以也要用输出所存的。


26楼专家。视频屏的用法。学习了。
可惜网上也不是LED满天飞!
拜谢了。自己一直没想出来。看来回帖有好报啊!

出0入0汤圆

发表于 2008-4-19 11:53:53 | 显示全部楼层
呵呵..终于明白了,谢谢26楼!

出0入0汤圆

发表于 2008-4-19 12:36:01 | 显示全部楼层
谢谢【26楼】 polarbear 枫叶,原来是控制OE,我一直把OE直接接地了

出0入0汤圆

发表于 2008-4-20 00:30:19 | 显示全部楼层
仔细看了26楼北极熊的思路,果然是相当精彩,以前不知道,学习了!
俺从未用CPU这么做过,而是用FPGA做过类似的东西。
26楼方案向595输出的CLK的密度要少得多,总体上能减轻软件的负担。但因周期是不等长的,代码会变得复杂。
另外由于CLK引发的噪声,将不再集中于一个频率上。

细想想的话,如果点数很多,用软件做肯定是困难的,尤其需要加入动感和灰阶时。因需要准确的CLK周期,借助于中断的话,进入/退出服务程序也是要花费CPU开销的,CLK就做不快,而这时用FPGA来实现应该是最合适的。

出0入50汤圆

发表于 2008-4-20 07:51:15 | 显示全部楼层
我们单位以前用CPLD控制的全彩屏,12级灰度的彩色,还是蛮好看的。时钟频率达到6MHZ,抗干扰有点不行了,呵呵。

出0入0汤圆

发表于 2008-4-20 08:17:14 | 显示全部楼层
记号......

出0入0汤圆

发表于 2008-5-9 16:38:09 | 显示全部楼层
26楼的精彩。。谢谢了。。

出0入0汤圆

发表于 2008-5-20 08:54:30 | 显示全部楼层
最近也一直在想这个问题...
看了26楼的感觉不错.
谢谢1!!

出0入0汤圆

发表于 2008-5-20 11:39:51 | 显示全部楼层
没太看明白26楼的,晕呼呼,哪位高手再解释下?

出0入0汤圆

发表于 2008-5-20 12:23:04 | 显示全部楼层
恩 精彩

出0入228汤圆

发表于 2008-5-30 13:05:52 | 显示全部楼层
唉,哪有满天飞的资料呀?

花钱买了学习学习也行呀.

QQ:1103012

出0入0汤圆

发表于 2008-5-30 14:08:18 | 显示全部楼层
必须做个记号了.

出0入0汤圆

发表于 2008-5-30 14:15:21 | 显示全部楼层
有专门的芯片

出0入0汤圆

发表于 2008-5-30 14:24:39 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-5-30 16:43:34 | 显示全部楼层
mark

出10入210汤圆

发表于 2008-5-30 20:12:41 | 显示全部楼层
赞一个,26楼的好!

出0入0汤圆

发表于 2008-5-30 20:53:41 | 显示全部楼层
今天看了一个大屏幕,里面用到的驱动是这样几个:595、138、245。
是256级灰度的,屏是双色的,但是好像从来都是只亮红色的。

出0入0汤圆

发表于 2008-5-31 14:56:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-6-3 23:34:14 | 显示全部楼层
必须做个记号了

出0入0汤圆

发表于 2008-6-4 09:07:28 | 显示全部楼层
26楼精彩,学习了。

出0入0汤圆

发表于 2008-6-4 09:32:39 | 显示全部楼层
反复看了很多次就是没看懂,有谁看懂了写个小代码来测试一下。最好是51的。

出0入0汤圆

发表于 2008-6-4 10:00:39 | 显示全部楼层
没搞过,但看过FPGA的资料,FPGA也没搞过,给我最大的疑问是:这些灰阶控制LED屏,对LED灯有要求吗,一般的LED可以吗?好像都是单色的啊!

出0入0汤圆

发表于 2008-6-4 10:02:41 | 显示全部楼层
懂了,26楼专业,我以前还买过LED屏这方面的资料,但都是论文啥的

出0入0汤圆

发表于 2008-6-4 23:47:34 | 显示全部楼层
PWM直接控制OE脚就可以啦,不过是控制全部的亮度

出0入0汤圆

发表于 2008-6-5 00:01:04 | 显示全部楼层
这是LED显示屏的控制方法,往视频算法方向考虑下吧!

出0入0汤圆

发表于 2008-6-5 00:51:35 | 显示全部楼层
其实视频也是这样做的

出0入0汤圆

发表于 2008-6-5 14:19:18 | 显示全部楼层
记下了,过段时间做做实验。整天净做低级的事情了,高级的事情没时间想,呵呵,必须扭转现状

出0入0汤圆

发表于 2008-6-5 15:57:40 | 显示全部楼层
近来也在关注这个问题,先谢谢上面几位高手的解答,研究一下,再来探讨。

出0入0汤圆

发表于 2008-6-5 17:07:26 | 显示全部楼层
对,应该作个记号,要学习一下26楼的经验!

出0入0汤圆

发表于 2008-6-6 21:57:26 | 显示全部楼层
有启发,谢谢 polarbear 枫叶!

出0入0汤圆

发表于 2008-6-7 11:14:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-6-21 23:28:15 | 显示全部楼层
留爪

出0入0汤圆

发表于 2008-7-26 16:42:35 | 显示全部楼层
13楼说的是做显示屏的,如果只点亮几个灯并且有灰度,可以用PWM功能。

出0入0汤圆

发表于 2008-7-26 18:50:27 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-8-18 22:15:23 | 显示全部楼层
谢谢26楼的朋友,虽然原来看过专门讲LED屏的书,不过没有你说得通俗易懂,再次拜谢了

出0入71汤圆

发表于 2008-8-18 23:15:44 | 显示全部楼层
用595的3个输出口加上R-2R网络就成了,3BIT DAC,这样有8级灰度

出0入0汤圆

发表于 2008-8-19 07:36:36 | 显示全部楼层
博大精深,谢谢!做个记号!

出0入148汤圆

发表于 2008-8-19 07:54:51 | 显示全部楼层
好东西,收藏

出0入0汤圆

发表于 2008-8-19 08:03:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-19 08:10:09 | 显示全部楼层
26楼精彩.

出0入0汤圆

发表于 2008-8-19 08:17:13 | 显示全部楼层
【26楼】 polarbear 说得精彩,学习了

出0入0汤圆

发表于 2008-8-19 09:02:49 | 显示全部楼层
不错的应用,受教了.

出0入0汤圆

发表于 2008-8-19 21:22:17 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-8-19 21:46:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-19 22:49:39 | 显示全部楼层
以前做过LED屏,只做过单色的,不过没做伪彩和全彩,好像外面通用的方式是595+TIP127,595控制点数据,127控制行扫,直接控制127的通断时间就可以实现灰度,由于595带锁存功能可以在显示当前行的时候更新下一行的数据,楼主可以找卖主控卡的厂家,一般都提供点阵屏的PCB版图。

出0入0汤圆

发表于 2008-8-20 09:31:41 | 显示全部楼层
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     

然后后面数据处理发送类似方法?

出0入0汤圆

发表于 2008-12-2 15:59:06 | 显示全部楼层
个人理解:



普通led屏在亮时,虽然肉眼看起来是静止的,但实际上是在快速的扫描。



如果你要实现灰度,在普通无灰度的基础上,把扫描频率加快16倍,这样控制每个点每次扫描时的亮灭,就可以实现16级灰度。



没试验过,欢迎指正。

出0入0汤圆

发表于 2008-12-2 17:11:44 | 显示全部楼层
【80楼】 javenreal 

可以这样理解

出0入0汤圆

发表于 2008-12-2 19:18:39 | 显示全部楼层
好帖不能不顶啊,学习了

出0入0汤圆

发表于 2008-12-2 19:59:07 | 显示全部楼层
牛人集中地

出0入0汤圆

发表于 2008-12-2 20:04:03 | 显示全部楼层
【80楼】 javenreal 的方法不如26楼的。

受教了。

出0入0汤圆

发表于 2008-12-3 20:27:09 | 显示全部楼层
我理解是这样的:枫叶的思路是不是在没加灰度的刷新频率基础上提高到了4倍?相当于一幅没有灰度的画面现在加上灰度后需要刷新4次才能现显灰度的效果?

出0入0汤圆

发表于 2008-12-3 21:18:52 | 显示全部楼层
学习

出0入0汤圆

发表于 2008-12-3 22:47:55 | 显示全部楼层
虽然还没看懂, 留记号.

出0入0汤圆

发表于 2008-12-4 08:38:18 | 显示全部楼层
还在硬件··mark··

出0入0汤圆

发表于 2008-12-4 21:17:26 | 显示全部楼层
一直在找相关LED驱动的资料,转载一遍文章,应该可以正解枫叶写的内容.

点击此处下载 ourdev_529097.pdf(文件大小:112K) (原文件名:256级灰度LED点阵屏显示原理及基于FPGA的电路设计.pdf) 

出0入0汤圆

发表于 2009-3-24 09:50:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-24 11:39:49 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-3-24 12:00:14 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-3-27 08:28:49 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-4-2 22:49:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-4-3 17:36:47 | 显示全部楼层
mark,学习,等有心得了再来汇报

出0入0汤圆

发表于 2009-4-11 12:06:39 | 显示全部楼层
我理解了,也写出程序了,可就是调不出来,郁闷。。。。。。。。。

出0入0汤圆

发表于 2009-4-11 14:11:56 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2009-4-11 21:55:35 | 显示全部楼层
谢谢高手

出0入0汤圆

发表于 2009-4-11 23:23:13 | 显示全部楼层
看完26楼恍然大悟,mark

出0入0汤圆

发表于 2009-4-11 23:33:37 | 显示全部楼层
jh

出0入0汤圆

发表于 2009-4-12 01:05:01 | 显示全部楼层
mark,好贴!

出0入0汤圆

 楼主| 发表于 2009-4-12 04:45:31 | 显示全部楼层
好老的贴,又被顶出来了

出0入0汤圆

发表于 2009-4-12 08:51:27 | 显示全部楼层
路过,看看。

出0入0汤圆

发表于 2009-4-12 09:19:05 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2009-4-14 14:47:10 | 显示全部楼层
学习学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 21:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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