磁动力电子网-雕刻机DIY论坛,单片机论坛,CNCDIY,DIYCNC

 找回密码
 加入磁动力

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 6782|回复: 14

[交流]大幅提高电子钟走时精度全攻略

  [复制链接]
发表于 2011-11-20 16:56:57 | 显示全部楼层 |阅读模式
大幅提高电子钟走时精度全攻略
莫洋
电子钟制作成功了——很喜悦;电子钟走时有误差——很麻烦;日久以后很懒——弃之不用。 所以,电子钟走时精度问题是所有单片机爱好者一般都绕不开的问题,能不能大幅度提高电子钟走时精度,保证几年内不用调时呢?回答是可以做到的,有的方法甚至很简单。
一.电子钟走时误差原因剖析
一般的电子钟一般包括带(集成)时基电路如DS1302HT1380PCF8583等,也有不带时基电路的,由单片机直接计时输出,下面给出了两种电子钟的走时误差原因:
1、带时基电路电子钟
带时基电子钟走时误差产生的根源是晶振,电压对晶振影响相对较小,时基电路在2-6V的工作范围内晶振频率误差约- 3.6ppm~ +1.3ppm(基准电压+5V)见图1
image001.jpg


由于电子钟一般采用稳压电路,电压波动不超过100mV,所以晶振频率误差一般不会超过0.1ppm,一年下来不超过3秒,几乎可以忽略不计。
对计时精度影响最大的是温度。典型应用的32.768kHz音叉系列晶体不能够在较大温差范围内提供恒定精度,在晶振工作温度范围内(-20~70℃)误差呈抛物线型,合计最大精度误差典型值为150ppm (见图2),也就是说,一个在25度校准好的电子钟,工作在极限状态下一年误差可能会超过40分钟;如果在我国中原地区按平均15ppm计算,一年误差可能达到8分钟;按照一般不超过1分钟的习惯,平均1个半月就要调表一次,的确令人郁闷。
image002.jpg

2、不带时基电路电子钟
不带时基电子钟走时误差产生的根源是晶振和定时器,电压对晶振影响相对较小,可忽略不计。
单片机所用的AT系列1~30M晶体由于切割角度而不同于32.768kHz音叉晶体,温度系数稍小在0~40℃内误差值为+11ppm~ -6ppm(见图3),如果在我国中原地区按平均5ppm计算,在基准频率校准的前提下,一年误差虽能控制在3分钟之内,但也超出了人承受范围。
image003.jpg

由于不带时基电子钟多采用定时器溢出中断计时,定时器产生中断请求到响应中断需要3-8个机器周期(很难确定其准确值),定时中断子程序中的数据入栈和重装定时的初值还需要占用数个机器周期,还有从中断入口转到中断子程序也要占用一定的机器周期,因而造成计时不准,如果采用C语言编程,所编译产生的机器代码不够精简,所造成的计时误差还要增大。
此外,晶振的老化也会使计时发生一定正负误差,一般1~10年晶振误差从±0.3~±15 ppm,而且每一片晶振都有较大差异。
                                                                       (待续)

image004.jpg
image005.jpg

评分

参与人数 1金钱 +50 收起 理由
明浩 + 50 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2011-11-20 16:59:07 | 显示全部楼层

二、提高走时精度的方法

(一)改良晶振

1、高精度方案:采用恒温晶振(OCXO),优点:改良完全,彻底杜绝温度变化给晶振带来的频率误差,同一温度范围内频率稳定度一般为±0.0001~5ppm,因而走时精度最高。缺点:成本较高,停电后需启动后备电源,否则会出现较大误差。

有动手能力的网友可以按以下方案进行自制:
1)按图4提供的电路图做一个电路。恒温电路由LM358的一个运放和负温度系数热敏电阻、加热电阻等组成,8050作开关三极管使用,配合LM358用于控制加热电阻的通断。发光LED是加热指示灯。
image005.jpg

恒温槽的制作方法:首先把热敏电阻帖在晶体的金属壳上,然后找一块硬质泡沫塑料切成适当大小的立方体,在其中部挖一个方洞,将上述电路和元件一起装入洞中,在用泡沫塑料把洞口封闭,引出导线即可。但应给微调电容留一个小洞口待调整完毕后再堵上。

2)调整10k的可调电阻使恒温槽中的温度保持为42℃左右。

3)恒温两小时后,在时钟芯片的时钟输出端接一频率计,调整微调电容使其振荡频率为32768HZ。
2、较高精度方案:采用温补晶振(TCXO),优点:改良较完全,基本杜绝温度变化给晶振带来的频率误差,在扩展工业级温度范围内 (-40°C至+85°C)能够提供优于±7.5ppm的精度。TCXO就是人为将晶体曲线变得平坦,因而走时精度较高且不需备用电源。缺点:成本较高。

温补晶振也可以自制,采用热敏电阻或变容二极管作为校正元件,成本较低,但由于校正测试非常繁琐,不推荐业余爱好者自制。

(二)改良定时器

对不带时基电路的电子钟可通过改良定时器的方法获得较高精度,从程序入手,采用动态同步修正方法给定时/计数器赋初值。动态同步修正方法:由于定时/计数器溢出后又会从0开始自动加数,故在给定时/计数器再次赋值前将定时/计数器低位(TL0)中的值和初始值相加后一并送入定时/计数器中,此时定时/计数器中的值即为动态同步修正后的准确值。
    TIMER:                    
    PUSH    ACC
    PUSH    PSW
    MOV    A,     #0B0H
    ADD    A,     TL0                 ;初值和TL0中的数相加即为同步修正值
    MOV    TL0,    A                 ;修正值送定时/计数器低8位
    MOV    TH0,    #03CH



(三)根据温度用软件校正

软件校正是笔者重点推荐的方法,因为在不增加成本和硬件制作难度的前提下获得满意的效果。

1、实测温度校正法

对有温度显示的电子钟可采用这一方法,具体构想:

1)记录在某一温度(1℃范围)所经历的秒数;

        2)通过公式计算,得出校正的时间(微秒);

l        音叉系列32.768kHz晶体可套用以下近似公式来校正:

f_time=T×B(C-Ci)2  

式中:

f_time—校正值(微秒)

T—某一温度(1℃范围)所经历的秒数;

B—温度校正系数 3.5×10-2/℃

Ci—基准温度 25℃

C—实测温度

l        单片机用AT系列1~30M晶体可套用以下近似公式来校正:

f_ime=T×B(Ci-C)

式中:

f_time—校正值(微秒)

T—某一温度(1℃范围)所经历的秒数;

B—校正系数 0.43/℃

Ci—基准温度 25℃

C—实测温度

注:AT系列晶体校正近似公式只适合于0~40℃的温度范围,超出此温度应根据晶振频率与温度关系图采用查表法来解决。

3)将得出校正的时间与上一周期剩余数相加,如果超过1秒,则调表校正,余下的毫秒数计入下一校正周期。



C语言校正参考程序:(DS1302时钟芯片所使用32.768kHz音叉系列晶体为例,AT系列晶体校正程序请自行参照修改)

#define uchar unsigned char

#define schar signed char

#define ulong unsigned long

ulong f_time,T;                     //校正时间(微秒),某一温度(1℃范围)所经历的秒数;

uchar C;                           //实测温度

uchar src;                         //从DS1302时钟芯片读出的时间:秒,其他略

uchar TS,C_last;                   //统计时间标志,温度标志

schar TS_src;                     //校正时间



/********************************************************************

* 功能: 时间自动校对模块

* 说明: 适用于DS1302、HT1380时钟芯片

***********************************************************************/

void regulate(void) {            

  schar Cx;                            //温差



  //统计时间

  if (TS!=src){                        //1秒钟统计一次  

   T++;

   TS=src;

  }              



  //当温度发生大于1℃变化时计算校正时间

  if(C_last!=C){            

    Cx=C-25;

f_time=f_time+(T*3.5*Cx*Cx)/100;   //计算校正数(微秒)

    TS_src=TS_src+f_time/1000000;     //转换成秒数,如果还未来得及校正,又发生温度急剧变化时自动相加。

    f_time=f_time%1000000;             //剩余数转到下期                  

    T=0;

    C_last=C;

   }



   //适时进行校正

   if (src==20)                        //当秒表走到20秒时进行校正,以消除分钟进位处理

   if (TS_src!=0){                    //如果>=±1s则进行校正(音叉系列晶体只有相加,而AT会用到减)

      v_W1302(0x8e,0x00);              //解除写保护 (v_W1302为DS1302写数据模块,略)

      v_W1302(0x80,0x80);              //时钟停止

      v_W1302(0x80,src+TS_src);       //写入校正后的秒数并开启时钟

      v_W1302(0x8e,0x80);              //写保护

      TS_src=0;

   }

}

/********************************************************************

* 功能: 主程序模块

* 应用: 用于控制全局

***********************************************************************/

void main (void) {

T=0;

f_time=0;

while(1){



regulate();



}

}





2、月平均温度校正法

对没有温度显示的电子钟可采用这一方法,对AT切割系列精度问题不是很大,而对音叉系列只能将晶体FT抛物特征曲线作直线处理,校正精度不是太高,但也能基本满足要求。具体构想:

1)想办法从气象局、网上或实测获得当地月平均气温(如果室内有空调、暖气还要适当修正),制成数据表;

2)将每个月的天数制成数据表;

3)在一个月的某一时刻(比如15日零时零分零秒)进行计算并校正。



C语言校正参考程序:(DS1302时钟芯片所使用32.768kHz音叉系列晶体为例,AT系列晶体校正程序请自行参照修改)

#define uchar unsigned char

#define schar signed char

#define ulong unsigned long



uchar src,min,hou,day,mon;             //从DS1302时钟芯片读出的时间:秒、分、时、日、月,其他略



uchar code MC[]={8,12,16,21,24,28,30,32,30,22,17,11};   //月平均气温数据表

uchar code MD[]={31,28,31,30,31,30,31,31,30,31,30,31};  //月天数数据表



/********************************************************************

* 功能: 时间自动校对模块

* 说明: 适用于DS1302、HT1380时钟芯片

* 敬告!本校正程序适合与南方地区的室内气温0~40℃,如果室内气温低于零度

        校正会引起分进位处理,敬请注意,如是请对本程序作相应修正

***********************************************************************/

void regulate(void) {            

  schar Cx;                            //温差

ulong T;                             //每月总秒数

schar TS_src;                        //校正时间



  //适时进行校正

  if (day==15 && hou==0 && min==0 && src==0){    //适时进行校正,音叉src==0、AT晶振取src==40以消除分钟进位处理

      Cx=MC[mon]-25;

      T=MD[mon]*864;                             //实际为T=MD[mon]*86400,与下式相约  

  TS_src=T*3.5*Cx*Cx;                        //计算校正数(微秒),实际为TS_src= (T*3.5*Cx*Cx)/100;  

TS_src=TS_src/1000000;                     //换算成秒

if (TS_src!=0){                            //如果>=±1s则进行校正(音叉系列晶体只有相加,而AT会用到减)

         v_W1302(0x8e,0x00);                     //解除写保护 (v_W1302为DS1302写数据模块,略)

         v_W1302(0x80,0x80);                     //时钟停止

         v_W1302(0x80,TS_src);                   //写入校正后的秒数并开启时钟

         v_W1302(0x8e,0x80);                     //写保护

      }

   }

}

/********************************************************************

* 功能: 主程序模块

* 应用: 用于控制全局

***********************************************************************/

void main (void) {



while(1){



regulate();



}

}



(四)根据走时误差用软件校正

由于晶振以及时钟电路本身的差异性,即使采用高精度恒温、温补晶振或采用软件对晶体温度特征进行补偿,电子钟仍然会存在走时误差,此时可通过软件对走时误差进行最终校正。

对已前期校正的电子钟,可通过与标准计时器(上网查或中央电视台报时)比对,获得电子钟误差规律,即每X天误差1秒;对没有以上手段进行前期校正的电子钟,可能会出现一段时间快、一段时间慢,此时就要不厌其烦,必须经过一年观测,并将其结果将数据制成表,然后就可以通过软件进行校正,本例只针对前一种情况提出参考程序,第二种情况可参考本程序自行编制。



C语言校正参考程序(假定10天慢1秒):

#define uchar unsigned char

#define schar signed char



uchar src,day;             //从DS1302时钟芯片读出的时间:秒,日,其他略

uchar T;                   //天数计数

uchar TS                   //天数计数标志



/********************************************************************

* 功能: 时间自动校对模块

* 说明: 适用于电子钟最终校正

***********************************************************************/

void LTregulate(void) {           

schar TS_src=1;                        //校正时间(慢为正,快为负)



  //统计天数

  if (TS!=day){                          //1天统计一次  

   T++;

   TS=day;

}   



  //适时进行校正

  if (src==5){                                //适时进行校正

if (T==10){                                 //如果天数=10

     v_W1302(0x8e,0x00);                      //解除写保护 (v_W1302为DS1302写数据模块,略)

     v_W1302(0x80,0x80);                      //时钟停止

     v_W1302(0x80,src+TS_src);               //写入校正后的秒数并开启时钟

     v_W1302(0x8e,0x80);                      //写保护

     T=0;

   }

}

/********************************************************************

* 功能: 主程序模块

* 应用: 用于控制全局

***********************************************************************/

void main (void) {

T=0;



while(1){



LTregulate();



}

}



除以上四种矫正方法以外,还有采用高频晶振通过分频提供给时钟芯片来提高走时精度的,具体讲是用4.194304M晶振通过CD4060振荡并经过7分频获得32768HZ时钟信号供给时钟芯片,由于4.194304M晶振属AT切割的晶振,其温度影响频率范围要比32.768kHz音叉晶体要小得多,老式指针式石英钟走时较准就属此类。

还有一种方法,就是采用类似RS5C372A等可修正日历芯片,也是一种比较好的选择,主要通过设置寄存器对振荡周期数进行调整,即1秒不再是32.768个周期,而要加减一个调整量来调整,前提必须有测温电路,所调整的不是秒数,而是振荡周期,其调整原理与前述的“实测温度校正法”相同,因而在此不再赘述,有兴趣的网友可查阅相关资料。

对晶振的老化校正还是一个难题,目前没有现成的公式或模式可选用,对其校正比较繁琐,一般业余爱好者不宜勉强进行校正。

三、对网友的建议

对广大网友来说,采用廉价的DS1302、HT1380、PCF8583等作为时钟芯片的居多,也有的采用DS12887作为时钟芯片的,都会遇到晶振误差问题,最好采用“实测温度校正法”+“根据走时误差用软件校正”,既避免了添加硬件的麻烦,也不增加制作成本,仅仅是编写几行程序而已。

对初学者制作的无时基电路的电子钟,可采取“改良定时器”+“月平均温度校正法”+“根据走时误差用软件校正”,也可以取得较满意的效果。

当然,在调整走时误差前,最好用10位高精度频率计在25度(室内空调设为25度并经过2小时以上保温)时,将电子钟时钟调准到32768HZ,如果没有频率计,可采用标准授时网站或中央电视台作为标准时间来校准,校准时间最好几个月,温度最好控制在25℃。

经过常规调整加上合适的自动校正程序,电子钟年误差一般可达到10秒以内,确保5年内不用调表。



四、几点说明

熬夜撰写本文,一方面是庆祝《磁动力电子论坛》成功改版,另一方面为广大网友解决面临的实际问题,不求有任何利益,因本文有点像一篇论文、请广大网友不要将其转入有盈利色彩的所谓学术网站,往其他网站转帖也要注明出自《磁动力电子论坛》和作者,moyon在此谢谢大家!

由于水平所限,文中难免出现纰漏和错误,请广大网友及时提出和指正。





参考文章: 1.《精密计时——自动化与大众化》   网友——零八我的爱:来自维库电子市场论坛个人空间

           2.《石英晶体、晶振介绍》  来自http://www.eefocus.com/wangsw/blog/10-05/190200_0c324.html

           3.《自制2.4GHz数字频率计》    深圳市凌雁电子有限公司

           4.《如何使自制的单片机电子钟走时精准》 舒新生 来自启蒙电子论坛 www.51c51.net
回复 支持 反对

使用道具 举报

发表于 2011-11-20 23:34:49 | 显示全部楼层
十分仔细,很好的文章
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-21 20:20:17 | 显示全部楼层
谢谢管理员夸奖,但不知对其他网友有用不?
回复 支持 反对

使用道具 举报

发表于 2011-11-21 21:19:30 | 显示全部楼层
有用
不过我觉得家用的没必要很高的精度
回复 支持 反对

使用道具 举报

发表于 2011-11-21 22:35:37 | 显示全部楼层
可以搞个自动电脑对时的嘛,中国的电波钟比较杯具,好像要密码的
回复 支持 反对

使用道具 举报

发表于 2011-11-21 22:39:53 | 显示全部楼层
有阵时间比较无聊,收集了差不多3个G的关于电波钟的资料。。。。。
回复 支持 反对

使用道具 举报

发表于 2011-11-21 22:40:43 | 显示全部楼层
我另开个帖子发点资料
回复 支持 反对

使用道具 举报

发表于 2011-11-29 22:47:51 | 显示全部楼层
高手高手{:soso_e179:}
回复 支持 反对

使用道具 举报

发表于 2011-12-1 22:13:04 | 显示全部楼层
暂用不上留名先{:soso_e178:}
回复 支持 反对

使用道具 举报

发表于 2012-2-19 16:14:16 | 显示全部楼层
谢谢楼主非常宝贵的资料
回复 支持 反对

使用道具 举报

发表于 2012-2-21 12:00:20 | 显示全部楼层
好东西,谢谢了
回复 支持 反对

使用道具 举报

发表于 2012-2-27 10:52:56 | 显示全部楼层
电波钟更准确
回复 支持 反对

使用道具 举报

发表于 2012-9-9 12:03:04 | 显示全部楼层
多谢楼主,!先保存学习了
回复 支持 反对

使用道具 举报

发表于 2012-9-14 22:08:28 | 显示全部楼层
好文章,支持了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入磁动力

本版积分规则

QQ|小黑屋|手机版|Archiver|www.cdle.net 磁动力电子网 2001-2017 ( 粤ICP备10098153号

粤公网安备 44040402000001号

GMT+8, 2019-1-24 09:57

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.