『DIY新做.二十四小时感动之三』饱含了我所有期待的电子管时钟((2)
时间:2017-08-02 13:56 来源:数码之家 作者:yanzeyuan 点击:次
![]() ![]() 这次的DIY作品下最大功夫的除了PCB设计以外,就是这个炫彩的效果了。 底部采用了6颗高亮RGB全彩LED,并且采用了专用的驱动模块,能够产生各种色彩。为此,我一共做了9种背景光动态模式,比如第9种Corssfade:能够精确的在每一秒钟,渐变一种色彩,也就是从一种色彩过度到另外一种色彩。而且在RGB LED的周围正好套着一个激光雕刻的亚克力电子管底座,能够完全折射出LED的光芒。 用于代表时钟冒号的两个LED其实也采用了RGB LED,由于没有单色的LED能与荧光管的颜色一样,所以专门精心调配了RGB的颜色,使之与荧光管的颜色完全相同,并且这次的冒号闪烁效果不像辉光管的氖灯,要么亮,要么灭,这次采用PWM来做的呼吸效果fade in and fade out。给人一宁静柔和的感觉。 重点是数码管显示的字符的三种特效。在正常显示时钟的界面状态下按下FUNC键,可以在三种数字变换效果之间切换。 1、Crossfade:数字在变化的时候,原来的数字会慢慢隐去,同时新的字符会慢慢显示出来,交叉过度,变换的很柔和。开机的时候所有的字符也都会慢慢的显示出来,这种效果尤其是在宁静的夜晚,配合底部的七彩RGB LED,能给人一安静舒服的感觉。 2、Fadein & fadeout:数字在变化的时候,原来的数字会先渐渐消失,消失完了以后新的字符会渐渐显示出来,不是交叉显示,而是渐隐渐显,也给人一不同的柔和的感觉。 3、Standard:标准的显示模式,就是我们最普通的显示模式,数字变化的时候立即切换。以前我做的辉光钟就是这种方式,看了国外的一些高手做得效果以后,才发现,这种效果太生硬,不柔和,不过还是要做上这种效果,喜欢的话可以切换上。 这些效果只能从视频录像上能看出来,录像是用数码相机拍的,有点频闪,朋友们凑活的看看吧,呵呵。 ============================================================================================ 下面简单说一下设计和制作的过程 ============================================================================================ 上次的辉光管时钟,大量采用了贴片器件,这样可以在很小的电路板上实现所有的功能,包括MCU也选用了C8051FXXX系列的贴片高性能51内核的MCU。 这次从前期筹备的时候就计划用ALL DIP的模式,就是全部为直插器件。但是电路板的尺寸我还是采用了跟QS18-12辉光管电子时钟一摸一样的电路板尺寸(176mm x 50mm),因为这次的荧光管尺寸粗细跟上次的辉光管一模一样,所以这次的电路板连固定孔都跟辉光管时钟的电路板位置相同。 全部直插的电子器件,当然要选用直插的MCU,根据电路板大小及外围器件的大小等因素经过反复的比较,后来选用了STC的窄体直插MCU-STC12C5628AD,最适合不过了。I/O数量正合适,体积大小正合适,但是不支持在线调试,这一点可能对一些朋友来说是个问题,毕竟无法在线跟踪每一个模块每一个变量的执行结果,同C8051F系列的MCU比起来编程效率要打不少折扣,但是综合考虑一下还是它比较合适。 原理图的绘制过程中,我考虑过用动态扫描方式来做驱动,但是这样一来电子管的工作电压需要提高,升压电路又要像辉光管升压电路部分那样稍微复杂一些,后来觉得还是静态驱动稳定、可靠,所以采用了静态驱动方式,没有用动态扫描模式来驱动荧光管。 画图的过程中,为了使整体电路板更加美观,对全部器件的封装库都做了专门的绘制,所有器件的封装库都与实际元器件大小一模一样,保证器件排列整齐美观,需要的器件一个不少,不需要的器件一个不留。电阻都并排排列、IC也对称布局,圆柱体的电容也都尽量排列在一条线上。 每个辉光管底部都有一个5mm直径的RGB全彩发光二极管。包括蜂鸣器、备份电池等等都尽量放在最合适的位置上。 风格依旧,采用了蓝色的PCB电路板,不过这次没有贴片器件,PCB一面全部都是元器件,另一面都是焊盘,所以没有做古典线条,直插的电路板还是采用喷锡工艺比较容易焊接,所以这次做好了以后的电路板呈现出另外一种风格。 SHOW一下电路板的一些细节: ![]() ![]() ![]() ![]() 先从空板开始焊接开始,由于全部是直插器件,焊接几乎没有任何难度,插好器件,焊上焊锡,剪掉多余的管脚,只要IC和电解电容以及二极管不焊反,几乎没有什么问题。 收起来SMD的家伙,拿出来直插的家当,准备开始动手: SHOW一下: ![]() ![]() 因为设计之前没有做洞洞板试验,所以这次焊接也是调试过程,还是老规矩,先从电源部分开始。 由于VFD荧光管的工作电压在20v,还是需要一套升压电路来升压,不过这次升压电路比起辉光管的升压180v要简单一些,并且都是直插器件,所以电路简单。 输入采用5v直流,看一下焊接好的高压部分升压电路特写(下面的照片忘了焊电容C23,不过竟然能够正常工作): ![]() 看一下上图,输出电压20v。 再看一下下图,标准的荧光数码电子管的基本参数,正常工作条件下,阳极电压和栅极电压均为DC20V。 ![]() ![]() 另外一组电压是5v部分。因为STC的芯片工作电压范围比较宽,而且为了保证MCU、红外接收头等工作的电压安全,所以用了一颗78L05来为MCU和红外接收头、温度传感器等供电。 看一下5vLDO稳压部分和MCU的复位电路部分,放在了一起: ![]() ![]() 除了这两组电压以外,还需要为VFD荧光管的灯丝供电。 官方数据是1.2v,因为一共有6只荧光管,担心电流不够,所以采用了1.5A的老器件LM317,并且将输出电压调整到了1.5v左右,保证给6只VFD荧光管的灯丝供电充足。 看一下这组简单的线性降压电路: ![]() ![]() 当电源电路部分完全工作正常了以后,剩下的所有器件全部一次焊接完成。 为了美观,为了更稳定可靠的工作,而且电路板设计合理,所有的IC都没有使用IC座。 并且为了美观,所有的管脚都简断了以后,又重新整理了底部焊盘,全部焊点圆滑光亮。 SHOW一下大部分元器件焊好以后的样子: ![]() ![]() ![]() ![]() ![]() ![]() 下面开始调试最基本的功能:RGB LED的全彩控制。 RGB的控制其实没有说的那么玄乎那么难,为了不占用MCU的大量资源,在板子空间允许的情况下,我选用了一颗LPD6803的RGB驱动IC,6颗背景灯都靠它来驱动。需要什么颜色都可以通过与LPD6803通讯来调节。 这部分程序不难,先看一下不同的背景灯颜色效果,后面我会贴上相应的源码: ![]() ![]() ![]() ![]() ****************************************Copyright (c)************************************************** ** ** 项目名称: YS18-3 Clock ** 文件名称: LPD6803.c ** 模块功能: 实现LPD6803的全功能控制 ** **------------------------------------------------------------------------------------------------------ ** 创建者: 严泽远 ** E-mail : yanzeyuan@163.com ** QQ : 6626209 ** Mobile : 18602007878 ** 创建时间: 2011-02-01 ** 版 本: v1.0.0 ** 描 述: 基础程序 ** ******************************************************************************************************** #include <STC12C5620AD.H> //加载STC12C5620AD.H头文件 #include <Define.H> //加载Define.H头文件 #include <LPD6803Variable.H> //加载LPD6803Variable.H头文件 ******************************************************************************************************** ** 函数名称: void LEDSendData(uchar dr,uchar dg,uchar db) ** 功能描述: 输出3个5位RGB颜色数据子程序,参数格式:红颜色数据、绿颜色数据、蓝颜色数据 ** 创建者: 严泽远 ** 创建时间: 2011-02-01 00:02 ** 版 本: v1.0.0 ******************************************************************************************************** void LEDSendData(uchar dr,uchar dg,uchar db) { uchar k,mask; LEDDATA=0; LEDCLOCK=0; for(k=0;k<32;k++) {LEDCLOCK=1;LEDCLOCK=0;} //送起始位32bits 0 LEDDATA=1;LEDCLOCK=1;LEDCLOCK=0; //首先输出1个'1'起始位 mask=0x10; for(k=0;k<5;k++) //输出5位红色数据 { if(mask & dg) LEDDATA=1; else LEDDATA=0; LEDCLOCK=1;LEDCLOCK=0; mask>>=1; } mask=0x10; for(k=0;k<5;k++) //输出5位绿色数据 (责任编辑:admin) |