打印

LED数码管动态扫描

[复制链接]
楼主: shibao21ic
手机看帖
扫描二维码
随时随地手机跟帖
41
maychang| | 2010-11-2 01:14 | 只看该作者 回帖奖励 |倒序浏览
highgear,xwj等各位:
不必再多说了。

使用特权

评论回复
42
QuakeGod| | 2010-11-2 04:14 | 只看该作者
偶做LED动态显示的时候一般是最大16复用,扫描频率最少120Hz,一般都用800Hz左右,最高超过1KHz
即每1/1000秒扫描一遍,每位显示用1/(1000*16)秒,即约60uS左右,
之所以用这么高的扫描速度,
第一是因为,切换显示基本不占用什么CPU,几个指令而已,而且定时器确实是在这么高的频率运行。
第二是因为,偶们设计的时候要考虑多一些的东西,不能光从适应人类的角度考虑问题。

LED之所以能使用动态扫描,是因为人眼睛有视觉暂停效应,所以人看起来是同时显示。
但是,如果在摄像机里面看LED图像,则会乱得一塌糊涂,因为摄像机没有视觉暂停效应,即便有,也肯定小于1/60秒,照相机也是一样的道理,视觉暂停效应的时间,应该等效于快门时间,但是也应该是百分之1秒量级的。
在CRT,LCD,LED三种显示系统中,
LCD的“余晖”时间最长,而现在所用的TFT-LCD显示器,基本上可以等效为静态显示,对摄像机和照相机很友好。
CRT的余晖时间有长有短,慢扫描长余辉的示波器余晖时间数十秒量级,而短余晖的也在mS量级以上。
在使用摄像机摄录普通显示器和电视上显示图像的时候,会产生明暗相间的条带。
LED的余晖时间最短,最多是nS级别,如果动态扫描时,频率太低,就对摄像机很不友好。
提高扫描频率可以很有效解决这个问题,同时对人眼来说,亮度也没有任何变化,
且LED显示与观察者有相对运动时,显示也会更稳定。
----做一个更友好的系统

使用特权

评论回复
43
xujie88| | 2010-11-2 08:41 | 只看该作者
采用时间片论思想,一般延时5MS左右就可以了,不会调动的

使用特权

评论回复
44
c+++| | 2010-11-2 10:08 | 只看该作者
41楼:
highgear,xwj等各位:
不必再多说了。


;P :D :P
我早说过刘钱贝不懂技术, 你们这些聪明人怎么想去试图说服一个连一幅画都要请人挂,还美其名曰站在巨人肩膀上的白痴呢?
;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P

使用特权

评论回复
45
刘前辈| | 2010-11-2 10:08 | 只看该作者
请教42楼QuakeGod,您用的什么型号LED?60us就能点亮?20年来,数码管技术进展不大,还是基本点亮时间持续5ms以上(所谓“点亮”是相对人的眼睛滞留效应来说),小于5ms 亮度就暗了(即使是5ms静态恒定电流也是如此,更不要说动态扫描刷新电流了。)这是所有人公认的吧。——换句话说,一个数码管的点亮持续电流要求不小于5ms,也就是说无论动态扫描阵列多少个LED(真庆幸QuakeGod只扫描了16个(复用),为什么不能32、64只复用?),必须保证5ms 一切换,(如果4ms,甚或1ms 一切换,LZ已经告诉我们了:“亮度不足”。)而且必须在人眼滞留时间50ms之内再次回来以5ms持续时间刷新这只LED。hehe,所以你看到大多LED动态扫描个数是8个,不超过10个。如果超过10个LED扫描,那么回扫时间大于人眼滞留50ms,第一支LED的滞留亮度就灭啦,整个扫描屏LED看上去就闪烁跳动了。
    QuakeGod 兄长说16路复用,那么也就是50ms÷16≈64ms÷16=4ms。好一点的高亮度数码管是没问题的;——知道为什么不能32路复用了。有人说2ms点亮电流也行,那么就可以32路复用动态扫描。

    再回过头来说42楼QuakeGod 的LED,您的LED,60us持续电流就能点亮!什么新器件?
60us的持续点亮电流,再经过16×60us 关闭黑灭时间之后重新刷新这个60us点亮电流,您刷新的再频繁,最大还是60us !按照XWJ说的,您的亮度占空比只有1/16 ,您无论以多高的刷新频率刷屏,您的亮度都不会超过单只LED亮度的 1/ 16 !

    可别把电视屏(摄像机)原理应用在这,那原理不一样。

使用特权

评论回复
46
ayb_ice| | 2010-11-2 10:44 | 只看该作者
44L是个明白人

使用特权

评论回复
47
刘前辈| | 2010-11-2 10:55 | 只看该作者
本帖最后由 刘前辈 于 2010-11-2 10:57 编辑
偶做LED动态显示的时候一般是最大16复用,扫描频率最少120Hz,


计算起来大约每只LED(是超高亮度发光二极管?不是数码管。)点亮时间1ms。这对新型发光二极管来说没问题,靠谱。

那么下面以1000HZ的扫描频率扫描16只发光管,每只点亮时间压缩到60us,按照xwj原理,亮度不变。
    按照 T= 1/n•f ,和实验结果来看,可就不可理解了。f 取值范围,在LED数码管动态扫描显示屏应用范围,是20HZ~50HZ;这是根据人眼滞留效应规定的。低了,闪烁;高了,不亮。否则,岂不是f 取值越高越好?越高越能多接数码管个数,反正亮度不变。
     
      自然界没这么好的事儿吧。20年前的人都笨,没发现这么好的事,遗留下来的标准扫描程序都是5ms 为切换间隔时间的。——搞清楚,切换是瞬间的,5ms是切换间隔中断时间,不占CPU资源的。
      而如果1KHZ扫描频率,60us 时标中断一次,一秒钟中断16,000次?前台程序每秒钟被中断一万6千次?还干别的么?还有4 级中断ISR怎么办?

          所长的教材要更新?所长人老了要淘汰?

使用特权

评论回复
48
刘前辈| | 2010-11-2 11:26 | 只看该作者
看下面所长的程序;我们谁比所长更高明?所长可是没把我们放在眼里,“估计没人看的懂”。
highgear怎么把师傅都骂了。所长一直是我的偶像。我是根据所长的教材做的实验。把你干爹的教材内容都忘了。“一日为师,终生为父。”所长昔日那么罩着你,为了你都做出退出论坛的牺牲了,如今转脸就一点不照顾所长的面子了,——忘恩负义的小人。好好看看下面所长怎么写的吧:

农民讲习所发表于 2007-7-27 09:40 | 只看该作者 回复 引用 评分 报告 返回版面 TOP  得分:0
24楼:
再贴一遍,俺估计很多人没那个水平看懂,不理解。//-----------------------------------------------------------
//系统时间管理
//T0中断5ms,处理弱实时任务。5ms主要提供给数码LED、协议解析用。

void Timer0(void) interrupt 1 using 1
{
    TH0 = sInSysTimer.mT0_PreLoad;   //重装T0高位5ms初始值
    ……
    //调用5ms中断要处理的弱实时任务。
    if( sInSysTimer.Weekness_5ms )(*sInSysTimer.Weekness_5ms)();

}

使用特权

评论回复
49
acbear| | 2010-11-2 11:41 | 只看该作者
受教了,学习了。

使用特权

评论回复
50
ayb_ice| | 2010-11-2 14:11 | 只看该作者
48L
可以这样 != 必须这样

使用特权

评论回复
51
aihe| | 2010-11-2 21:03 | 只看该作者
无语中,观战

使用特权

评论回复
52
aihe| | 2010-11-2 21:28 | 只看该作者
给本书大家看看,老t叔那边弄来的,第一章第一节,供大家参考 LED显示屏的计算机远程控制系统 62页 4.3M.rar (3.86 MB)

使用特权

评论回复
53
moseswoody| | 2010-11-2 22:05 | 只看该作者
讨论问题要心平气和,心不平,思不定,搞到最后哪像讨论,最主要的是让我们学习的人搞不懂听谁的了、、、、、、、、、

使用特权

评论回复
54
踢球老越位| | 2010-11-2 22:20 | 只看该作者
纠结了。。。。

使用特权

评论回复
55
原野之狼| | 2010-11-3 00:59 | 只看该作者
呵呵 这个问题刘前辈确实弄错了
同意53楼说的“讨论问题要心平气和,心不平,思不定。”

使用特权

评论回复
56
whlchh| | 2010-11-3 10:13 | 只看该作者
是否闪烁与占空比有关,刷新2ms足够了

使用特权

评论回复
57
QuakeGod| | 2010-11-5 00:35 | 只看该作者
计算起来大约每只LED(是超高亮度发光二极管?不是数码管。)点亮时间1ms。这对新型发光二极管来说没问题,靠谱。

那么下面以1000HZ的扫描频率扫描16只发光管,每只点亮时间压缩到60us,按照xwj原理,亮度不变。
...
而如果1KHZ扫描频率,60us 时标中断一次,一秒钟中断16,000次?前台程序每秒钟被中断一万6千次?还干别的么?还有4 级中断ISR怎么办?
刘前辈 发表于 2010-11-2 10:55

其实还不是每秒中断16000,是每秒中断21600次。
更高的频率是86400Hz.

;;;    定时中断选择与PWM周期同步,21.6K,则重装载值为256.
PWM1reload EQU 256  ;定时中断的频率 ;为PWM频率的1倍
;;;    那么定时中断的频率则为86400Hz

另外附送一小段程序,此程序在22.1184MHz的89C51上运行

;模拟串口子程序
;不能采用延时的办法
;要(比较)准确的确认起始位,还有每个数据位的中点位置,才能正确取样数据.
;模拟串口:9600BPS,每位取样3次,则中断速度为28800次/S,采用22.1184M晶振,
;如若采取INT0外部中断检测开始位,则每位采样两次即可,中断速度为19200次/S,
;             或者每位采样一次,仅第一次中断速度为19200次/S,剩下的都为9600次/S,
;用INT0外部中断检测开始位,需要一个独立的定时器,可独立开始,可独立停止。
;若每位取样4次,则中断速度为38400次/S,
;此程序中采取第一种方法
;发送时时钟不需要3倍,相等即可。
;发送和接收可以看成是两个相互独立的模块,不论硬件还是软件上。
RXD2  BIT P3.2
TXD2  BIT P3.3
com2con  data 02Fh
RI2  bit com2con.0
TI2  bit com2con.1
tx2send  bit com2con.2
tx2sending bit com2con.3
ct2busy  bit com2con.4
com2stat data 30h
com2recvtemp data 31h
com2recvbuf data 32h
com2sendstat data 33h
com2sendtemp data 34h
com2sendbuf data 35h
;       com2stat   数据格式
; 7 6 5 4 3 2 1 0
; | | | | | | | +---
; | | | | | | +----- 最低的这两位,表示接收数据的时钟相位,0,1,2, 在1相位的时候采样数据.
;  | | | | | +-------
; | | | | +---------
; | | | +----------- 高4位,表示接收数据的位;第几位,0是起始位,1开始是数据位,8是最后一位数据,9是停止位.
; | | +-------------
; | +---------------
; +-----------------
;相位的变化方式 : 在服务程序退出前,增加相位,使他等于下一次的相位,下一次直接用,用完后再增加或判断

mov a,com2stat
jz detectstartbit  ;如果com2stat等于0,说明现在还没有启动数据接收过程
jb acc.0,getbit  ;第一相位,去采样数据
jb acc.1,incbitpos  ;第二相位,看是否采集完成,增加采样的地址数.
     ;第0相位,增加相位,然后退出
inc a
mov com2stat,a
sjmp com2skipall
detectstartbit:
jb RXD2,com2skipall ;RXD2为高电平,说明没有起始位到来,退出
inc com2stat  ;有起始位到来,COM2stat加1,准备开始接收起始位;
sjmp com2skipall
getbit:
inc a
mov com2stat,a
anl a,#0f0h  ;取com2stat的高4位
jz checkstartbit ;判断起始位是否正确.
xrl a,#090H  ;
jz stopbit  ;在接收停止位吗?
mov c,RXD2  ;采集数据
mov a,com2recvtemp
rrc a
mov com2recvtemp,a
sjmp com2skipall
checkstartbit:
jb RXD2,notstartbit ;起始位不正确
sjmp com2skipall ;起始位正确
notstartbit:   ;放弃采样数据重新开始
MOV com2stat,#0h
sjmp com2skipall

incbitpos:
anl a,#0f0h
xrl a,#90h
jz recvdone
xrl a,#90h
add a,#10h
mov com2stat,a
sjmp com2skipall
recvdone:
jb RI2,com2skipall  ;如果RI2被置位,说明recvbuf中有数据未被取走,则进行等待.
     ;在位9,相位2处空转,而不丢弃这次采集的数据,
     ;如果recvbuf中数据不能被及其取走,则不能进行后续的接收过程.
mov com2recvbuf,com2recvtemp ;如果RI2未被置位,则转存数据,接收完成,置RI2.
mov com2stat,#0h
setb RI2
sjmp com2skipall

stopbit:   ;检查停止位是否正确
jnb rxd2,notstopbit ;如果RXD2电平不为高电平,则停止位不正确.
;jb RI2,com2skipall  ;如果RI2被置位,说明recvbuf中有数据未被取走,则进行等待.
     ;在位9,相位2处空转,而不丢弃这次采集的数据,
     ;如果recvbuf中数据不能被及其取走,则不能进行后续的接收过程.
mov com2recvbuf,com2recvtemp ;如果RI2未被置位,则转存数据,接收完成,置RI2.
mov com2stat,#0h
setb RI2
sjmp com2skipall
notstopbit:   ;停止位不正确,放弃所采集的数据
mov com2stat,#0h
sjmp com2skipall
com2skipall:

com2send:
jb tx2sending,com2sending
jnb TX2SEND,com2sendskipall
com2sendstart:
;inc com2sendstat
mov com2sendstat,#01h
clr txd2
mov com2sendtemp,com2sendbuf
setb tx2sending
clr tx2send
sjmp com2sendskipall
com2sending:
mov a,com2sendstat
jb acc.1,sendincbitpos
jnb  acc.0,sendbitchange
inc a
mov com2sendstat,a
anl a,#0f0h
xrl a,#090h
jz com2senddone
sjmp com2sendskipall
sendincbitpos:
anl a,#0f0h
add a,#010h
mov com2sendstat,a
xrl a,#0a0h
jz com2senddone
sjmp com2sendskipall
com2senddone:
mov com2sendstat,a
clr tx2sending
setb TXD2
setb TI2
sjmp com2sendskipall
sendbitchange:
inc a
mov com2sendstat,a
anl a,#0f0h
xrl a,#090h
jz com2sendstopbit
mov a,com2sendtemp
rrc a
mov com2sendtemp,a
mov txd2,c
sjmp com2sendskipall
com2sendstopbit:
setb txd2
sjmp com2sendskipall
com2sendskipall:

使用特权

评论回复
58
Cortex-M0| | 2011-9-14 18:50 | 只看该作者
其实还不是每秒中断16000,是每秒中断21600次。
更高的频率是86400Hz.

;;;    定时中断选择与PWM周期同步,21.6K,则重装载值为256.
PWM1reload EQU 256  ;定时中断的频率 ;为PWM频率的1倍
;;;    那么定时中断的频 ...
QuakeGod 发表于 2010-11-5 00:35


QuakeGod 老师的程序写的不错,学习了~~~

使用特权

评论回复
59
dqyubsh| | 2011-9-14 18:59 | 只看该作者
呵呵,俺只会用显示芯片更新数码管,给它数,它就显示。至于刷新频率之类的根本不了解,更不会算。

跟各位比,俺是打酱油的~~

使用特权

评论回复
60
ldyeah| | 2012-5-11 16:40 | 只看该作者
晕,这个问题还讨论了这么长,其实40楼指出的问题所在,XWJ的说法是对的。只是这个刘老前辈偷换了条件,你把LED的个数变来变去,同一时间内,每个LED的平均电流肯定有变化,亮度也肯定有变化啊。跟你的频率木有关系。所以刘前辈讨论的和XWJ讨论的根本就是两个问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则