二十四小时的感动(古典版III) 自制YS18-3荧光管电子钟【严泽远作品】

从虎年腊月到兔年正月,饱含了我对时钟所有期待新作品终于制作完成。

在这之前从LED到辉光管再到VFD点阵、从石英晶体到温补再到GPS校时,从静态显示到动态滚屏翻页,还是那句话:时钟虽简单,想做完美不容易…
这次的DIY作品从设计之初就考虑到了很多功能上的细节、操作上的细节、效果上的细节,以前我对SMD情有独钟,这次头一回全部采用直插元器件(只有一颗 DS3231采用贴片),每个元器件的选型、位置、大小、高度,甚至是立着放还是躺着放都经过了周密考虑。电路板每个元器件的封装库都根据实际元器件大小 测绘,没有一个焊盘位置与实际元件有差别。以前在制作电子钟的时候,不少朋友提出了忠肯的建议和意见,也为这次DIY提供了原动力,所以在人性化操作和功 能方面比较完备。至于炫彩的七彩背景光效,还有近4000行代码所编辑出来的Crossfade等数字变换效果等等只能从视频上才能看出…
我就先介绍一下这次DIY作品的一些功能和特点,然后再具体介绍一下DIY设计过程【有图片、有视频】,重点部分的源代码我也会公开,希望能与大家一起交流。

老规矩,先上美图,SHOW TIME:



我接触电子的时候,几乎是直接从SMD上手的,所以一直以来对SMD情有独钟。因为现代电子工艺带给我们的是集成度越来越高的零部件,可以满足我们在尽可能小的空间内完成更多更精彩的功能,所以前面几个时钟作品包括LED点阵、辉光管、VFD点阵全部都采用SMD器件设计并制作。
后来慢慢接触了很多老的工控产品发现原来ALL DIP的电路板也能如此唯美,比如20年前的任天堂红白机主板、286电脑主板等等…所以就产生了全部使用直插器件制作她的想法。
因为之前很少使用直插元器件,所以这次电路板绘制也花了很大的功夫。放弃了优美的古典线条及花边,利用直插IC及电阻电容本身的形体和周密的布局,直接塑 造出漂亮的主板。每一个元器件都是根据实际尺寸和大小专门绘制封装库,每个器件的选型和高度都控制严格,均在10mm一下。结合以前的设计经验,未作洞洞 板试验,但实际验证硬件部分零BUG。
因为全部采用了直插元件,所以组装制作几乎是零难度,只要别把器件焊反,完美的一次性通过,比起ALL SMD的组装简单很多很多。
SHOW一下:

同样是采用了近30年前的一种电子管–VFD荧光数码电子管,虽然是80年代初生产,比起辉光管晚出了几年,但漂亮通透的玻璃管身依然放射出一种古典的韵味,同时又焕发着一种现代的气息。
VFD荧光的原理比起辉光管来说有本质上的不同,驱动也采用了低电压(VFD荧光管只需20v就能驱动,辉光管最低需要170v的阳极高压)。这次采用的是YS18-3的荧光数码电子管,尺寸与我以前设计的QS18-12的辉光电子管相同,直径为18mm。虽然尺寸相同,但是荧光管的顶部都有银色的消气剂,就像戴了一顶银色的帽子,很漂亮。
由于全部采用直插元件,所以电子管本身需要架高,所以专门用激光雕刻了专用的管座将荧光管垫高,同时能够折射出位于管底的RGB LED所发出的炫彩背景光。刚才提过,所有的元器件高度均在10mm一下,但是有四个元器件需要伸出:两只用于代替时钟冒号的LED,专门订购了14mm 高的支撑柱将其撑起,还有一只红外线接收头,也用14mm高的专用支撑住将其撑起,还有一只温度传感器18B20,因为它的管脚短,所以专门订购了 12mm高的支撑住撑起。
所有器件布局合理,没有飞线,没有感觉器件的稀疏与拥挤。即使不用外壳,同样能给人电子器件构成的美感。
SHOW一下:

时钟的基本功能还是显示时间,如果因为好看而走时不准也就失去了时钟的意义。所以这次的荧光数码电子管时钟,没有采用DS1302+石英晶体的方案,采用了VFD点阵时钟的DS3231方案,虽然标配没有GPS对时,但预留了GPS模块的通讯接口,并且DS3231本身内置温度补偿,精度为0℃-40℃ ±2ppm,年误差2分钟以内。
由于这个方案所使用的DS3231是达拉斯05年推出的产品,所以没有直插的封装,所以整套时钟器件只有这一颗器件是贴片封装,但是SO16的封装焊接起 来几乎与直插器件无异。而且这次同样采用了CR1220备份电池,在断电的情况下,依然能够维持时钟的走时,断电5年依然能够精确计时,包括闹钟设置等 等,无需再对时和设置。
SHOW一下DS3231和备份电池:

前几次设计的时钟有不少朋友多提出了很多好的建议,在这次软件设计的时候下了很大的功夫来尽可能的利用6颗荧光数码电子管和两颗冒号LED以及6颗RGB LED来组合出更多的功能。配合电子钟专用的红外线遥控器,设计出了很全很人性化的操作功能:
1、单键操作。以前设计的时候为了防止误按,有些操作需要长按遥控器,很多朋友觉得这一点会让人觉得麻烦,所以本次所有遥控操作即按即得,操作方便。即便是误按了SET,只要不按OK确认,再按一次SET或者按CANCEL键,都可以返回正常状态。
2、具有很方便操作的时间调整、日期调整和闹铃调整功能。在调整不同的功能的时候,背景灯会渐变显示为相对应的颜色,比如调整闹铃的时候,无论七彩背景灯是什么颜色,都会慢慢过渡为蓝色。而且保存的两组闹铃可以很方便的关闭任何一组,再次打开时,不用重新调整闹铃时间等等…
3、具备摄氏温度和华氏温度的转换功能。由于有些朋友需要华氏温标,所以这次设计了两种温度单位并自动换算。在查看温度时,按FUNC键就可以在℃和℉之间转换,并且自动保存设置,下次查看或者断电后,不需要再进行设置,会自动记忆你常用的查看单位。
4、具备中西方两种日期格式。上 次在做辉光钟的时候,有朋友就说能否做成MM-DD-YY的日期格式,本次完全解决了这个问题,在查看日期的时候,按一下FUNC键就可以在YY-MM- DD和MM-DD-YY日期格式之间转换,并且自动保存设置,断电不影响设置的保存,下次查看依然记忆你常用的查看格式。
5、具备中国农历日期显示。农 历是我们中国最常用的历法,当然时钟少不了农历。在这里,按一下DATE键能够查看公历,再按一次就会自动计算出农历日期,这个农历日期是自动计算出来 的,我们只要调整好公历日期,就会自动换算出来农历,无需单独设置。为了区别开公历和农历的显示,在显示公历的时候,时间冒号的两点会慢慢隐去,在切换为 农历的时候冒号两点会慢慢的渐亮,以示区别。
6、具备两组闹铃功能。这次的荧光电子数码管时钟贴心设计了两组闹铃,每组闹铃都可以单独的设置并单独的打开与关闭。当闹铃时间到了以后,会发出滴滴滴滴连续4声的提示音,持续1分钟,如果我们想关闭闹铃,只需随便按一下遥控器的任意一个按键即可关闭闹铃响声。
还有很多细微的人性化设计,在这里就不一一介绍,呵呵,总体来讲,这次DIY设计的功能比较完备,不过也欢迎大家多提宝贵建议。
SHOW一下一些功能界面:

这次的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位绿色数据  
    {   if(mask & dr)   LEDDATA=1;   
        else            LEDDATA=0;   
        LEDCLOCK=1;LEDCLOCK=0;   
        mask>>=1;       
	}   		     
    mask=0x10;   
    for(k=0;k<5;k++)   	 	//输出5位兰色数据   
    {   if(mask & db)   LEDDATA=1;   
        else            LEDDATA=0;   
        LEDCLOCK=1;LEDCLOCK=0;   
        mask>>=1;       
	}   
	LEDDATA=1;LEDCLOCK=1;LEDCLOCK=0;   	//首先输出1个'1'起始位
}

接下来调整代表时钟冒号的两点的LED色彩。
因为VFD的那种光介于蓝色和绿色之间,没有单颗的LED能够与它的色彩相对应一致,所以没办法,只能用两颗草帽的RGB LED来调配颜色。后来经过对比,调整好了两颗对应G和对应B的电阻,使其颜色与VFD荧光的颜色一致。
并且这两颗LED是要伸出来的,所以专门买了一些14mm高的支撑柱来支撑这个LED,这样就不会来回摇晃,保证了位置的固定。
SHOW一下效果(相机曝光时间较长,与实际有些色差):

幻彩背景灯搞定了以后,下面就要上荧光管了。
因为荧光管与所有直插的原器件在一面,所以要将荧光管支撑起来。但是这个荧光数码电子管又没有管座,只能直插焊接,所以用CAD画好图纸,用激光切割了一些支撑座,这样荧光管就能垫高起10mm,而且还能正好坐在RGB LED的上面。
支承座是用透明的亚克力板切割的,正好能将所有的管脚传过去,将管子固定在电路板上,不会摇晃,而且能突出出来。
SHOW一下效果:

将所有的荧光管加上底座以后,焊在电路板上,开始调试驱动部分程序。
静态驱动采用了串行译码器74HC595配合ULN2003来做,一组这样的IC正好驱动一颗荧光管。
74HC595我在QS30-1的辉光钟上就用过,虽然这次采用了STC的MCU,但是原理大致相同,用示波器校正一下时序,完美驱动荧光管。
下面是点亮背景灯和数码管调试时的效果和74HC595的部分通讯源代码:

/********************************************************************************************************
** 	函数名称:			void 	Send595(uchar count,uint dat)
**	功能描述:			向74HC595发送数据  
**	入口参数:			count:	发送数据的位数
**						dat:	发送的数据(MAX 16Bit)
**	创 建 者:			严泽远
**	创建时间:			2011-02-04 22:32
**	版    本:			v1.0.0
********************************************************************************************************/
void 	Send595(uchar count,uint dat)
{
	for(;count>0;count--)
	{
		DATA = dat&0x0001;//_nop_();
		SHCP  = 1;//_nop_();
		SHCP  = 0;//_nop_();
		dat>>=1;
	}
}

红外线遥控部分以前就做过,但是第一次做是在QS30-1的辉光钟上进行应用,那个时候采用的MCU是C8051F310,这款MCU没有外部中断功能,其实用定时器来做也可以做得很稳定很完美。
这次同样,在STC上调试很快就将红外线译码完成。虽然无法在线调试跟踪红外线数据,但是荧光管既然能够驱动并显示数字了,编程调试的时候就用它来显示跟踪过程中的结果,大大提高了效率。
看一下红外接收部分的源代码:

 
/********************************************************************************************************
** 	函数名称:			void	IR_RX()
**	功能描述:			红外线中断接收处理
**	创 建 者:			严泽远
**	创建时间:			2011-02-04 16:07
**	版    本:			v1.0.0
********************************************************************************************************/
void IR_RX()
{
	uchar	SampleTime;
 
	IR_SampleCnt++;							//Sample + 1
 
	F0 = P_IR_RX_temp;						//Save Last sample status
	P_IR_RX_temp = IR;						//Read current status
	if(F0 && !P_IR_RX_temp)					//Last sample is high,and current sample is low, so is fall edge
	{
		SampleTime = IR_SampleCnt;			//get the sample time
		IR_SampleCnt = 0;					//Clear the sample counter
 
			 if(SampleTime > D_IR_SYNC_MAX)		B_IR_Sync = 0;	//large the Maxim SYNC time, then error
		else if(SampleTime >= D_IR_SYNC_MIN)					//SYNC
		{
			if(SampleTime >= D_IR_SYNC_DIVIDE)
			{
				B_IR_Sync = 1;					//has received SYNC
				IR_BitCnt = D_IR_BIT_NUMBER;	//Load bit number
			}
		}
		else if(B_IR_Sync)						//has received SYNC
		{
			if(SampleTime > D_IR_DATA_MAX)		B_IR_Sync=0;	//data samlpe time to large
			else
			{
				IR_DataShit >>= 1;					//data shift right 1 bit
				if(SampleTime >= D_IR_DATA_DIVIDE)	IR_DataShit |= 0x80;	//devide data 0 or 1
				if(--IR_BitCnt == 0)				//bit number is over?
				{
					B_IR_Sync = 0;					//Clear SYNC
					if(~IR_DataShit == IR_data)		//判断数据正反码
					{  	
						if((IR_UserH == (D_IR_usercode / 256)) &&
							IR_UserL == (D_IR_usercode % 256))		//系统码正确
						{
							IR_code      = IR_data;
							B_IR_Press   = 1;		//数据有效
						}
					}
				}
				else if((IR_BitCnt & 7)== 0)		//one byte receive
				{
					IR_UserL = IR_UserH;			//Save the User code high byte
					IR_UserH = IR_data;				//Save the User code low byte
					IR_data  = IR_DataShit;			//Save the IR data byte
				}
			}
		}
	}
}

    剩下的部分程序稍微有点难度,主要在实现逻辑控制和闹钟等通讯上,DS3231的程序也很简单,懂得IIC通讯的朋友想必一次都能调通,无非就是对某个地址的写操作和读操作。
    闹钟的设置和一些参数的保存,都是保存在了STC的内部EEPROM上,其实STC内部的EEPROM不能称之为真正的EEPROM,它需要页擦除,跟FLASH有点像。不过还是挺好用的,省了外置的EEPROM芯片,还能存储一些有用的数据。

    完成之后的图片SHOW一下:

    临近春节放假之前,早早就把亚克力的外衣用激光切好了,终于要给他穿外衣了,底座先安装好。
    SHOW一下底座的样子:

只有底座不完美,继续采用实木中框,外加不锈钢内六角螺丝,上下光面黑色亚克力板,还有数字的倒影在里面。
拍了一些图片,这里面有些客厅的道具在做辉光钟的时候已经见过了,呵呵
请朋友们敬请欣赏吧

DIY是一种享受,享受的是过程,更是结果……

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
软硬件设计:严泽远
QQ:6626209
Mobile:18602007878
WebSite:http://www.nixieclock.org
E-mail:yanzeyuan@163.com

2011-02-07

7 comments to 二十四小时的感动(古典版III) 自制YS18-3荧光管电子钟【严泽远作品】

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>