二十四小时的感动(古典版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头文件
#include //加载Define.H头文件
#include //加载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一下底座的样子:
只有底座不完美,继续采用实木中框,外加不锈钢内六角螺丝,上下光面黑色亚克力板,还有数字的倒影在里面。
拍了一些图片,这里面有些客厅的道具在做辉光钟的时候已经见过了,呵呵
请朋友们敬请欣赏吧
DIY是一种享受,享受的是过程,更是结果……
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
软硬件设计:严泽远
QQ:6626209
Mobile:18602007878
WebSite:https://nixieclock.org
E-mail:yanzeyuan@163.com
2011-02-07
7 条评论
Bavol · 2012 年 2 月 29 日 上午 1:53
喜欢你这种严谨追求完美的风格,学会单片机不久,正在准备自己做一些作品,偶然看见你做的这个,觉得很有意思,可以尝试下,这段时间把电容电感测量仪和散热器做出来就暂时放下,13年初考完研就开始准备这个吧!谢谢分享…
RCA 2012 · 2012 年 3 月 18 日 下午 3:00
Hello there, You’ve performed a fantastic job. I’ll definitely digg it and for my part suggest to my friends. I’m confident they will be benefited from this site.
Hi, Thank you for visiting. Hop you and your friends like my works
RCA Ieftina 2012 · 2012 年 3 月 18 日 下午 10:36
Great points altogether, you simply won a new reader. What would you suggest in regards to your publish that you made a few days in the past? Any sure?
fanku1990 · 2013 年 5 月 16 日 下午 7:07
你好,看了你的东西感觉挺有兴趣。麻烦能不能把YS18-3的PCB封装给我发一个呀!!谢谢啦!!
fanku1990 · 2013 年 5 月 16 日 下午 7:10
不好意思,错了是YS13-3的封装!
胡培伟 · 2013 年 5 月 21 日 下午 1:57
好久没动手了!想动手弄弄,参考下!谢谢!