打印

请教关于单片机系统的实时时钟问题

[复制链接]
7543|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天雨粟|  楼主 | 2008-11-18 21:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实时时钟是单片机系统面临的重要课题,理论上讲,每个单片机应用系统都应具有实时时钟系统,如同PC机及手机上的RTC。我看了一些应用系统例程,无非是两种办法:一是用单片机自己的TIMER,再者是用DS1302时钟芯片。
    实时时钟的计时精度最终取决于晶振的准确性及稳定度,PC及手机的计时精度是非常不错的,由于其生产规模庞大,估计其晶振的性价比极高,以器件渠道而言,单片机系统难以比附,在这种情况下,如何提高单片机系统的计时精度呢?或者说,从理论上讲,我们最终能够做到多少精度?
    常见单片机用晶振的指标大约是准确度50~150PPM,稳定性也是这样,根根有关理论,晶振的秒稳定度应比其准确度至少高一数量级,这样综合考虑下来,则其合成准确度十分恐怖,再考虑温漂,廉价晶振无非是个节拍器罢了,对于计时而言,可以说一无是处。
    那么实测结果又怎样呢?
    TIMER的计时准确度取决以下几个方面:晶振的稳定度、谐振电容的匹配性及温漂、软件处理的合理性。
    软件处理实际上是一个重装初值的问题,我采取如下办法:
    TR0=0;
    TL0=TL0+V_TL0;
    TH0=TH0+V_TH0;
    TR0=1;
    以上的办法我理解为动态修正,与救火车老师讲的原理殊无二致。根据在KEIL中的模拟:在置位TR0的情况下,观察进入TIMER中断时TL0的值,多次观察的结果,其值并不一致,这是因为TIMER每次响应中断的时间并不相同所致。所以动态修正是必要的。
    上几条语句反汇编的结果如下:
               
    CLR      TR0(0x88.4)
    MOV      A,#IP(0xB8)
    ADD      A,TL0(0x8A)
    MOV      TL0(0x8A),A
    MOV      A,#0x3C
    ADD      A,TH0(0x8C)
    MOV      TH0(0x8C),A
    SETB     TR0(0x88.4)

    根据以前在论坛中咨询的结果,以上指令共需八个机器周期,由于执行SETB TR0时TL0已开始计数,所以在理论初值上一共补偿7个。
    谐振电容按资料上讲应尽量匹配,且宜选用温飘低的正牌厂家的产品,由于渠道所限,所用的电容应该疑似正牌罢!
    我没有采用从晶振的XTAL2处直测频率的办法,这是出于不影响其正常振荡的考虑,采取测中断周期这种间接的办法,通过不断调整V_TL0,得到精确的100ms中断周期,再通过V_TL0反推晶振真实频率,考虑量化误差的影响,晶振频率准确度约为30ppm。
    稳定性如何呢?在温度、电源负载恒定的情况下,可以忽略不计。
    在实验室(未刻意恒温)中启动计时24小时,未见明显误差。在打开实验室窗户的情况下再计时24小时,由于当日气温下降了约10度,其计时误差为10秒。(采取用收音机收地方台的办法授时)。
    10秒是个致命的误差。接下来几天继续观察,偏快偏慢不等,看来用廉价晶振时,单片机的TIMER并不适合做系统的实时时钟。
    DS1302又如何呢?我没有首选DS1302是基于如下考虑:3元芯片+2元晶振+1元电池+3根口线,其软件效率如何呢?由于是串行读写,有这读写的功夫,TIMER也已完成了计时,况且用TIMER可直接从内部RAM中取数,用DS1302得通过串行办法从外部RAM中取数,那个速度要慢很多。再则二者的计时精度都是依赖晶振,无非一个是用硬件计时一个是用软件计时,二者并无本质的差别。还有,TIMER在晶振稳定性优于其准确度的情况下,可以用软件修正的办法提高计时精度,而DS1302在晶振不准时只能无可奈何!
    惟一的好处是DS1302用的晶振号称钟振,听说电脑主板、石英钟、表都用的是这个,渠道或者畅通一点罢,至于DS1302对晶振负载电容6PF的要求,询问商家,茫无所知,渠道仍属不畅,但总要试一下。
    对DS1302的试验结果是日误差20秒,这个当然与器件本身无关,问题在晶振,网上有资料说,可以串或并一个几PF电容调整晶振的负载电容,通过用频率计测试,得到精确的32.768kHz的晶振频率,我对此方法存疑,因为我在监测晶振频率的过程中,一个小时内,计时误差达到数分钟,亦即测试工作直接影响到了晶振振荡频率,纵然你依此调出了准确的频率,但取下频率计的测试线后,其振荡频率并不是你调校好了的结果。再者,即便通过串并联电容得到了较好的准确度,也只是摸石头过河的个案成功,并无理论上的指导意义,继续试验的价值不大。
    总结困难,问题在器件上——晶振、电容、负载电容。虽说国货当自强,但困难在眼前,用SEIKO、EPSON的器件罢,据说“贼贵”,用内部集成晶振及电池的计时芯片吧,“成本就上去了”,我想,用常规的国产器件,加上一些软硬方法,做一个单片机的实时时钟模块,达到PC机及手机RTC的精度,应该是有办法的,想就此求教各位老师!

相关帖子

沙发
一级菜鸟| | 2008-11-18 21:19 | 只看该作者

你对RTC晶振的测量方法有误

正确测量校准RTC晶振的方法是将信号从RTC芯片的CLKOUT或者FOUT引脚引出测量,绝大多数RTC都具备将晶振频率分频或者直接输出的功能。

51的指令不等长结构决定了每次进入定时器中断的时间不会一致,需要用51精确定时,定时器必须使用自动重载模式。

使用特权

评论回复
板凳
ayb_ice| | 2008-11-18 21:25 | 只看该作者

LS

谁说51做RTC必须用自动重装载的定时器。
51在响应中断时,定时器又没有被打断。。。

使用特权

评论回复
地板
icmap| | 2008-11-18 21:29 | 只看该作者

搞得那么麻烦,不重装初值不就得了。

使用特权

评论回复
5
一级菜鸟| | 2008-11-18 21:33 | 只看该作者

建议3楼重新看一遍我的帖子

使用特权

评论回复
6
天雨粟|  楼主 | 2008-11-18 21:34 | 只看该作者

回二楼

具体到DS1302,并无频率输出引脚,我也觉得直接从晶振引脚处测试不妥,如想测频率,当如之何呢?

另外,我采用的重装初值办法,是否可以算自动重载?

TIMER的方式二才算自动重载吗?那个中断周期太短,量化误差积累下来恐怕要命。

使用特权

评论回复
7
一级菜鸟| | 2008-11-18 21:47 | 只看该作者

回LS

1、换别的RTC咯,多了去了的东西。
2、定时器2有16位自动重载方式,中断间隔可以长很多,即便是8位方式,中断内也仅仅是对某个变量加一处理,有足够的时间在下次中断前退出。

使用特权

评论回复
8
NE5532| | 2008-11-18 21:50 | 只看该作者

搞清楚,什么叫时间,什么叫时钟

推荐阅读:《深入浅出AVR单片机——从ATmega48/88/168开始》定时器章节。

使用特权

评论回复
9
天雨粟|  楼主 | 2008-11-18 22:13 | 只看该作者

回七楼、八楼

根据分析及实验结果,软件处理没有问题,RTC芯片也没有问题,关键是授时用的晶振,它经不起温度变化,负载变化也有影响。单片机系统一般都属于小电子,无法订制晶振,在只有到市场上买现成的这种状况下,如何提高实时时钟的精度,可有善策?

NE5532老师:那本书我见过,不是51,没买,原理性的东西应大同小异吧!有机会到书店蹭点白书看看!

使用特权

评论回复
10
NE5532| | 2008-11-18 22:39 | 只看该作者

呃……我的书可不是讲具体机型,而是通用法则的。

计算机的“时钟”和我们在墙上挂的“时钟”是不一样的。转换的介质就是“人”。

使用特权

评论回复
11
zq1987731| | 2008-11-18 22:52 | 只看该作者

这个啊...

    用有源晶振不就好了嘛?市场上很多的,基本上温漂都小于15PPM的,而且也不是很贵,51的话1脚接地2脚接有源晶振的输出就行了...相当方便...
    不惜成本的话可以用FM31XXX的铁电存储器上的实时时钟,它是有校正频率输出的...就是价格...

使用特权

评论回复
12
天雨粟|  楼主 | 2008-11-18 22:55 | 只看该作者

不知是老师的大作,失敬!

我地处偏僻,要有出差机会才能买书,买芯片,有机会一定买来拜读。谢谢您的指导!

使用特权

评论回复
13
天雨粟|  楼主 | 2008-11-18 23:03 | 只看该作者

回11楼

有源晶振的问题,其实我也考虑过。五元左右罢!
向您讨教:
是否1脚NC,二脚GND,三脚输出,四脚VCC。输出接51的XTAL1,51的XTAL2悬空,因为CMOS的单片机的时钟信号取自XTAL1(反相放大器的输入端)。

要注意是方波还是正弦波波吗?是否不拘波形?

使用特权

评论回复
14
ljm810010| | 2008-11-18 23:26 | 只看该作者

不拘波形

使用特权

评论回复
15
天雨粟|  楼主 | 2008-11-18 23:43 | 只看该作者

谢谢楼上!

使用特权

评论回复
16
yongfei| | 2008-11-18 23:55 | 只看该作者

RTC耗电量也很重要,

DS1302用CR2032电池可做到10年不换电池,作为产品上的一项指标还是挺有吸引力的,毕竟换电池还是比较烦人的。

使用特权

评论回复
17
耕在此行| | 2008-11-19 09:01 | 只看该作者

RTC推荐

本人推荐下:
   PHILIPS 8563 25度下精度可以调到5ppm,如果要全天候保证精度,
                得根据温度进行软件补偿.
   DALAS  DS1302大概与8563差不多.
   R8025  内置水震晶子,性能比8653强,室温下(25度):5ppm 价格也比其贵.
          内部带温度测量.可以;全天候要保证精度需软件校准.
   DS3231 性能超强,0-40度内+-2ppm. -40-85度内+-3.5ppm
   DS3231本人用过,R8025在电能表上用的人N多.8563早期的电能表用的多,
          后来也都改成8025或其它了.DS3231一般用在高端的电能表上.

使用特权

评论回复
18
天雨粟|  楼主 | 2008-11-19 18:49 | 只看该作者

回16楼,17楼

DS1302的成本及低功耗确实诱人,但其将计时精度委之晶振,使人行之不便,舍之不甘,可堪浩叹!

感谢17楼推荐的片子,在下记住了DS3231,知其内含温补晶振,在成本允许的情况下,可以一试!

使用特权

评论回复
19
谈的元| | 2008-11-19 21:55 | 只看该作者

可以用实际测试单片机输出频率,再自动修正,估计比较好

比如,单片机输出0.3HZ的波形,用高精度仪器测试,得到实际频率,再在MCU中写一个数据,MCU根据该数据修正时间。

使用特权

评论回复
20
天雨粟|  楼主 | 2008-11-19 22:33 | 只看该作者

回楼上

我正是这样办理的,这可以解决固定温度条件下的系统误差问题,现在的困难是,环境温度变化后,以前的努力即无效了.
解决温飘问题有两法:一是实测温度再进行补偿,这个难以操作;
二是用温补晶振或有温度补偿功能的芯片,缺点是价格高,资料也欠缺!

还是想在DS1302上想办法,因为日误差3秒可以接受,只要找到负载电容为6PF的32768晶振,再来做实验还是有意义的.但这个也困难,难以理解,无法理解,这是常用芯片,也是电子工程师的忠仆,其配套的晶振竟也难求?

难道电子工程师要始终走在性能及价格这两把刀的刀尖上?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

168

帖子

0

粉丝