理论上只要是用晶振作为时基的单片机时间钟,在常温下做到日差1秒之内,甚至更精准是应该极易达成的。

 

只是许多人并不知道如何达成这个目标的方案。

 

 

而且市面很多带单片机的产品中,时间都做不准,这绝对是设计问题。例如:笔者车子上的时钟日差有10秒多。


一般大多数人所设计的定时器时常,是根据晶振标出的数据(如12M)计算而成的,固定不变,设计呆板。但普通晶振的实际振荡频率是不可能与标出的数据完全相同的,例如:12.00043M,11.99985……,这个误差必然积累,所以时钟就不准了。另外绝大多数设计也没有考虑微调方案,对于日差几秒无法控制。


日差1秒要求的精准是:1秒/(24小时*60分*60秒),对应12M晶振;当频率是12.000014M或11.999986M,日差就有1.2秒。可见用普通晶振做的时间钟,如果不采取修正措施,会因精度不够,时钟日差10多秒是很普遍的。

 

在笔者设计的有单片机时间产品中,随机取10个,同时上电,3天后再看时钟,它们之间的最大时间误差,一般都不会超出1秒(普通晶振,不联网)。许多产品月差在1秒之内。

 

 

1、实现方法:

1)将时间的定时中断时常数做成可修正的,且加入微调常数,定时时常数与微调时常数在FLASH中取得。微调时常数用于修正时常数的小数点之后的部分。


2)程序可以对某端口输入的秒脉冲再进行计算,并据之修正定时器的时常数,以及微调常数,并存入FLASH中。达成利用外部精准脉冲源对时钟进行校准的目的,说白了,就是用外校消除普通晶振的个体差异。同时程序也可以输出自己的秒脉冲,这样就可以达成产品之间的互校。


3)选择一个产品,对其时钟进行精确校准(这需要外部精准的时钟源。如果手中没有,可以多花点时间,用手机、电视、广播上的报时进行校准),这样就可以将它做成一个自己的【标准秒脉冲时钟源】。


4)产品出货前,用自己的【标准秒脉冲时钟源】校一下(将输出的标准秒脉冲送入其它产品的校准端口,让其它产品自动完成定时器时常数及微调常数的修正。)
如此处理,时间钟的精度就取决于晶振的稳定度,而不是精度。而晶振的稳定度普遍可以达到PPM级,当环境温度变化不大时,极易保证<11.57PPM,这就达成了日差小于1秒的目的。

 

2、产品相关时间基准的程序:

(只提方案,不提程序代码)

1)将端口输入的秒脉冲与本体的晶振频率进行比对,计算出定时器的时常数与微调时常数(只做一次即可,计算结果保存到FLASH了,其最初值是按晶振的标称值计算确定的)。


2)时间微调补偿。


3)秒脉冲输出(用于互校,可以放弃不写)。

 

要点:定时器的时常数不是程序直接赋值,而是从FLASH中调取的。