之前在我们设计的DIY电子时钟里面,有一项需求就是数码管显示的亮度要随环境亮度的改变而自动调节。这几天在群里也有人问到这个问题,在群里说了大体思路后,还是不能理解,程序部分还是没有是成功,今天小代就写此文来说说数码管亮度怎么调节?文后会附上源码。
在我们硬件电路做好之后,再要去调节数码管的亮度,那就只能从软件入手,也就是编程来实现它。正常情况下,我们的程序都是给数码管全亮,就像电机全速运行一样,需要调速了,我们就采用PWM信号去控制,PWM信号的原理其实就是在相同的频率下,减小了驱动电平的时间,这里调节亮度的原理也是差不多,就是在保持刷新频率不变得情况下,减少每一位数码管点亮的时间。
下面我们简单说说正常的数码管显示程序怎么写。全亮时,我们是现给数码送段选数据,再送位选数据,然后延时一小会时间,再重复以上内容显示下一位。现在我们有四位数码管,我们让每位点亮6ms,这样4位数码管显示完一次(扫描一次)大约25ms,那1秒就可以扫描40次(40帧/秒),这样我们人眼看到的就是同时显示(视频一般为25帧/秒)。具体过程如下(4位数码管分别计为A、B、C、D):
开始: A 选通 延时6ms ,关闭A
B 选通 延时6ms ,关闭B
C 选通 延时6ms ,关闭C
D选通 延时6ms ,关闭 D
结束一帧扫描
(注:此处的选通包含段码和位码)
详细程序如下:
正常显示程序
如上图就是正常的显示代码段(共阴数码管),以上程序运行后可以在数码管上看到显示1234全亮度。这里说的延时一小会,这个时间是在毫秒级别的,调节这个时间,是可以调节亮度,但是时间稍微大一点,就会出现闪烁的情况了。我们要的是既要亮度可以调节,又要不闪烁,那就要用到我们说的PWM信号了。
现在要在不改变扫描速率的情况下,降低每一位点亮的时间,这样我们看到的效果就是亮度的降低了。比如上图中的程序,我们延时时间是6ms,这6ms时间都是点亮数码管的,现在要减少点亮时间,那我们就点亮3ms,关闭3ms,这样一来,扫描一位的时间还是6ms,但是这6ms时间内只有3ms时间是点亮的,自然亮度就降低了,而没有改变扫描时间,自然不会出现闪烁的情况。具体过程如下:
开始: A 选通 延时3ms ,关闭A 延时3ms
B 选通 延时3ms ,关闭B 延时3ms
C 选通 延时3ms ,关闭C 延时3ms
D选通 延时3ms ,关闭 D 延时3ms
结束一帧扫描
(注:此处的选通包含段码和位码)
具体代码如下:
如上图所示,每一位点亮的时间只有3ms,但是扫描每一位数码管的时间还是原来的6ms,这样就实现了在不改变刷新频率的情况下减少了每一位点亮的时间,从而减低了亮度,上图中的亮度已经是全亮的一半了。
好了,到这要调节亮度的任务就已经完成了,但是我们还想拓展一下,如何让这个亮度可以通过程序自动来调节而不是我们认为的修改程序呢?办法很简单,我们在程序中设一个变量为点亮的时间参数(比如设为on_time),每一位还是点亮6ms,那关闭的时间就是6ms-on_time。
那过程就变为如下:
开始: A 选通 延时on_time ,关闭A延时6ms-on_time
B 选通 延时on_time ,关闭B延时6ms-on_time
C 选通 延时on_time ,关闭C延时6ms-on_time
D选通 延时on_time ,关闭 D延时6ms-on_time
结束一帧扫描
要让程序自动调节这个变量on_time,就需要来调节的参数,比如时间参数,在几点到几点之间亮度为多少,可以多少几个档次。更高级别的可以通过光敏电阻来实现检测环境光照度来调节这个现实的时间参数on_time,这样就可以实现正真的随环境的变化而变化。我们做的DIY电子时钟就是采用最后说的方式,通过光敏电阻分压后单片机ADC转换得到电压值,再根据这个电压值来自动的调节点亮的时间。通过修改延时函数,可以做到真正的无极调光。以上文字版教程我们还会录制视频教程,视频讲解的会更直观,需要观看视频的请关注我们微信公众号:单片机技术宅或加Q群:300384358