tuy0326 发表于 2008-4-18 15:17:02

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

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

holycat 发表于 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那么快的时钟。把串联级数减少点,或灰阶位数减少点就行了。

mljda 发表于 2008-4-18 15:49:18

你可以线尝试用软件模拟控制IO产生PWM控制
然后把595想成IO口就可以了。

tuy0326 发表于 2008-4-18 16:03:19

还不是太明白,能详细说一下吗?

friendljy 发表于 2008-4-18 16:12:37

他的意思是说不用OE控制。而是把595的每个输出当作IO口。用他们模拟出类似PWM的效果。比如只接了一个595,要降低第一个小灯的亮度。则循环锁存1111 1110和1111 1111,配合锁存引脚。这样。第一个灯的亮度就低了。而其他的一直最亮

holycat 发表于 2008-4-18 16:26:12

4楼正解。

tuy0326 发表于 2008-4-18 16:51:01

这样的话,如果要接很多的话,那么数据量不是很大吗?

stevenlu 发表于 2008-4-18 17:01:21

我现在也只能把把有的595输出当一个整体来做渐变,要每个输出都作不同的渐变也不会

friendljy 发表于 2008-4-18 17:03:49

串接4个595的话可以控制32个灯,只用3个IO口。刚好定义一个long数据,每一位表示一个灯。操作还是比较方便的。

stevenlu 发表于 2008-4-18 17:14:19

还是没太理解【4楼】 friendljy的意思,你这样最多只是把595的一个口的灯变化了,但其它的呢?如果要求其它的变化不同步怎么办?

friendljy 发表于 2008-4-18 17:32:52

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

holycat 发表于 2008-4-18 17:41:09

【回楼主/6楼】
数据量虽大但可不是常数,每次输出时按PWM计数器跟灰阶值临时算的。控制器需保存的数据是每位的灰阶,PWM只是个free-run计数器,字长跟灰阶一样。

mljda 发表于 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的颜色数据,灰度来实现。

AVR-BIN 发表于 2008-4-18 19:08:32

全错
产生单点灰度,需要时钟,数据,锁存,使能四线控制方式,关键在使能脚的控制.

dzcn 发表于 2008-4-18 19:29:29

13楼说说原理

tuy0326 发表于 2008-4-18 20:27:21

有意思了,看来有很多种方法啊!

13楼说说你的原理

mljda 发表于 2008-4-18 20:38:56

我的应用在护栏灯领域是没问题!

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

lin28 发表于 2008-4-18 20:45:46

关注。。。

2233223 发表于 2008-4-18 21:43:07

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

durgy 发表于 2008-4-19 00:46:26

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

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

tuy0326 发表于 2008-4-19 01:29:43

我觉得仙猫的方法可行,理解起来也简单,但是13楼呢?你的想法是什么样的呢?

dzcn 发表于 2008-4-19 08:56:34

13楼19楼的兄弟能说说在单点灰度使能脚的用法吗?虽然离开灯饰行业差不多有一年了,但还是挺感兴趣的

stevenlu 发表于 2008-4-19 09:11:47

晕呼呼,看完了还是没弄懂。
我现在是只控制第一个点的变化,依靠595的移位使其它点也变化,但整体看起来是同时变化的,没有流动的效果。

jettlau 发表于 2008-4-19 09:31:10

74hc595驱动led产生灰度等级只能是很少的led,大屏幕有专门的灰度等级控制芯片

mljda 发表于 2008-4-19 09:38:04

护栏灯上用这个就足够了。

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

大屏很闹火的。

stevenlu 发表于 2008-4-19 09:50:16

【24楼】 mljda:不知道你控制595的方式是怎么样的?我是一位一位控制的(可能你是一下传8位)。如果我把位移速度调慢的话就会感觉有抖动。

polarbear 发表于 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码
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帧的时间叠加后,就得到不同的灰度。

2233223 发表于 2008-4-19 11:18:16

楼上精彩!

mljda 发表于 2008-4-19 11:30:56

用输出锁存没有

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


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

dzcn 发表于 2008-4-19 11:53:53

呵呵..终于明白了,谢谢26楼!

stevenlu 发表于 2008-4-19 12:36:01

谢谢【26楼】 polarbear 枫叶,原来是控制OE,我一直把OE直接接地了

holycat 发表于 2008-4-20 00:30:19

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

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

ilikemcu 发表于 2008-4-20 07:51:15

我们单位以前用CPLD控制的全彩屏,12级灰度的彩色,还是蛮好看的。时钟频率达到6MHZ,抗干扰有点不行了,呵呵。

pcwinner 发表于 2008-4-20 08:17:14

记号......

hyz_avr 发表于 2008-5-9 16:38:09

26楼的精彩。。谢谢了。。

byjove 发表于 2008-5-20 08:54:30

最近也一直在想这个问题...
看了26楼的感觉不错.
谢谢1!!

telca 发表于 2008-5-20 11:39:51

没太看明白26楼的,晕呼呼,哪位高手再解释下?

poppush 发表于 2008-5-20 12:23:04

恩 精彩

wxws 发表于 2008-5-30 13:05:52

唉,哪有满天飞的资料呀?

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

QQ:1103012

stephon1 发表于 2008-5-30 14:08:18

必须做个记号了.

qkj1575 发表于 2008-5-30 14:15:21

有专门的芯片

qianc1983 发表于 2008-5-30 14:24:39

mark

madha 发表于 2008-5-30 16:43:34

mark

rainbow 发表于 2008-5-30 20:12:41

赞一个,26楼的好!

xiaobendan 发表于 2008-5-30 20:53:41

今天看了一个大屏幕,里面用到的驱动是这样几个:595、138、245。
是256级灰度的,屏是双色的,但是好像从来都是只亮红色的。

cds828 发表于 2008-5-31 14:56:46

mark

hncsxzj 发表于 2008-6-3 23:34:14

必须做个记号了

li_xuef 发表于 2008-6-4 09:07:28

26楼精彩,学习了。

stevenlu 发表于 2008-6-4 09:32:39

反复看了很多次就是没看懂,有谁看懂了写个小代码来测试一下。最好是51的。

brotherwyz 发表于 2008-6-4 10:00:39

没搞过,但看过FPGA的资料,FPGA也没搞过,给我最大的疑问是:这些灰阶控制LED屏,对LED灯有要求吗,一般的LED可以吗?好像都是单色的啊!

Feeling_MCU 发表于 2008-6-4 10:02:41

懂了,26楼专业,我以前还买过LED屏这方面的资料,但都是论文啥的

iamyanh 发表于 2008-6-4 23:47:34

PWM直接控制OE脚就可以啦,不过是控制全部的亮度

zh1112ou 发表于 2008-6-5 00:01:04

这是LED显示屏的控制方法,往视频算法方向考虑下吧!

durgy 发表于 2008-6-5 00:51:35

其实视频也是这样做的

jpjavr 发表于 2008-6-5 14:19:18

记下了,过段时间做做实验。整天净做低级的事情了,高级的事情没时间想,呵呵,必须扭转现状

cltemail 发表于 2008-6-5 15:57:40

近来也在关注这个问题,先谢谢上面几位高手的解答,研究一下,再来探讨。

liuyonguo 发表于 2008-6-5 17:07:26

对,应该作个记号,要学习一下26楼的经验!

mtxmxt 发表于 2008-6-6 21:57:26

有启发,谢谢 polarbear 枫叶!

xzmabin 发表于 2008-6-7 11:14:19

mark

lihuyong 发表于 2008-6-21 23:28:15

留爪

CHENBINGSTER 发表于 2008-7-26 16:42:35

13楼说的是做显示屏的,如果只点亮几个灯并且有灰度,可以用PWM功能。

pcwinner 发表于 2008-7-26 18:50:27

记号

hansur 发表于 2008-8-18 22:15:23

谢谢26楼的朋友,虽然原来看过专门讲LED屏的书,不过没有你说得通俗易懂,再次拜谢了

dellric 发表于 2008-8-18 23:15:44

用595的3个输出口加上R-2R网络就成了,3BIT DAC,这样有8级灰度

78057812 发表于 2008-8-19 07:36:36

博大精深,谢谢!做个记号!

yplin27 发表于 2008-8-19 07:54:51

好东西,收藏

avr_appli 发表于 2008-8-19 08:03:01

mark

HZZCL 发表于 2008-8-19 08:10:09

26楼精彩.

shinehjx 发表于 2008-8-19 08:17:13

【26楼】 polarbear 说得精彩,学习了

steven 发表于 2008-8-19 09:02:49

不错的应用,受教了.

sonic5566 发表于 2008-8-19 21:22:17

记号

kill_c 发表于 2008-8-19 21:46:53

mark

armfans 发表于 2008-8-19 22:49:39

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

moqiaobo 发表于 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   

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

javenreal 发表于 2008-12-2 15:59:06

个人理解:



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



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



没试验过,欢迎指正。

durgy 发表于 2008-12-2 17:11:44

【80楼】 javenreal 

可以这样理解

qzzz 发表于 2008-12-2 19:18:39

好帖不能不顶啊,学习了

teencole 发表于 2008-12-2 19:59:07

牛人集中地

lisn3188 发表于 2008-12-2 20:04:03

【80楼】 javenreal 的方法不如26楼的。

受教了。

shift 发表于 2008-12-3 20:27:09

我理解是这样的:枫叶的思路是不是在没加灰度的刷新频率基础上提高到了4倍?相当于一幅没有灰度的画面现在加上灰度后需要刷新4次才能现显灰度的效果?

sws222 发表于 2008-12-3 21:18:52

学习

nicksean 发表于 2008-12-3 22:47:55

虽然还没看懂, 留记号.

guojielong777 发表于 2008-12-4 08:38:18

还在硬件··mark··

shift 发表于 2008-12-4 21:17:26

一直在找相关LED驱动的资料,转载一遍文章,应该可以正解枫叶写的内容.

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

ml07077 发表于 2009-3-24 09:50:22

mark

eduhf_123 发表于 2009-3-24 11:39:49

MARK

cmh7978 发表于 2009-3-24 12:00:14

记号

kinggao 发表于 2009-3-27 08:28:49

记号

a105 发表于 2009-4-2 22:49:23

mark

hanxiao20 发表于 2009-4-3 17:36:47

mark,学习,等有心得了再来汇报

ygxycp 发表于 2009-4-11 12:06:39

我理解了,也写出程序了,可就是调不出来,郁闷。。。。。。。。。

xieshuangok 发表于 2009-4-11 14:11:56

学习学习

chiwenhu 发表于 2009-4-11 21:55:35

谢谢高手

cowboy 发表于 2009-4-11 23:23:13

看完26楼恍然大悟,mark

ndust 发表于 2009-4-11 23:33:37

jh

lzerof 发表于 2009-4-12 01:05:01

mark,好贴!

tuy0326 发表于 2009-4-12 04:45:31

好老的贴,又被顶出来了

hqjhr 发表于 2009-4-12 08:51:27

路过,看看。

gzwireless 发表于 2009-4-12 09:19:05

学习一下

ccllcc 发表于 2009-4-14 14:47:10

学习学习
页: [1] 2 3 4
查看完整版本: 如何控制74hc595驱动led产生灰度等级