怎么样才能用单片机做出一个精确的时钟

[复制链接]
22953|98
AIRWILL 发表于 2008-5-29 09:08 | 显示全部楼层

1.8Mhz以上频率的晶振

 1.8Mhz 到 24Mhz 频率的晶振, 我发现频率精度是相当的高的.

后来我查的手册称 50ppm 以内. 也就是一天(86400秒)应该最大偏差 4秒!

楼上有人的偏差过大, 什么原因? 中断,软件计数里有误差, 丢失了脉冲数了吧? 好好查一下你的软件
HE119 发表于 2008-5-29 20:00 | 显示全部楼层

悲哀!

悲哀!悲哀!完成悲哀!

看来新手在这里发贴是一大错误!
soso 发表于 2008-5-29 21:42 | 显示全部楼层

人家都在帮你, 你倒说开风凉话了

jerkoh 发表于 2008-5-29 21:55 | 显示全部楼层

re

我用51做的时钟今天看了下  5年了慢了1S而已。
有谁比我强
不过天数差了好几天。凑巧凑巧~ 哈哈
soso 发表于 2008-5-29 21:59 | 显示全部楼层

只要晶振稳定,5 年误差不到 1s 也做得到

PowerAnts 发表于 2008-5-29 22:17 | 显示全部楼层

加RCC,天文台自动校时

5880527 发表于 2008-5-29 22:41 | 显示全部楼层

这里不是学校

网友没有任何义务要给你回答,大家只是因为工**好才聚居在这里讨论的,上面不是很多网友给你说了好多方法了吗,第一页就有好几个网友给你提出了问题的所在,你以为是在学校老师要握住你的手写123啊
mxh0506 发表于 2008-5-30 12:26 | 显示全部楼层

LZ,我给你说的那几条是不是没看到啊?

只要逐条去做,包你能做准
yuewumu 发表于 2008-5-30 22:10 | 显示全部楼层

还是程序的问题

lz的自动载入考虑中断响应时间了么?
原野之狼 发表于 2008-5-31 09:23 | 显示全部楼层

和标准时间同步一下吧

dai_weis 发表于 2008-5-31 11:25 | 显示全部楼层

非常支持46楼的说法

程序有问题要自己找原因,而且已经给了很多提示。
gx_huang 发表于 2008-5-31 12:15 | 显示全部楼层

20楼吹牛?

30天不差一秒?
如果光是普通电路,怎么可能?
koolean 发表于 2008-5-31 12:34 | 显示全部楼层

有个示波器就搞定了,呵呵简单简单

大家说有道理把。
feifeile 发表于 2008-5-31 23:31 | 显示全部楼层

应该不是程序问题,

首先看你的时钟是多少,然后再看每一分钟慢多少秒,然后调整一下T0或T1给时间一个补偿就可以了!!
最好用11.0592HZ的时钟比较好。
dongpei21 发表于 2008-6-1 08:46 | 显示全部楼层

晶振和程序问题

试着用时钟芯片,改进一下成序
HE119 发表于 2008-6-1 11:06 | 显示全部楼层

有点上升

昨天没事再弄这个时钟,觉得标志位溢出有问题,再算了一下时间,
现在一个小时慢三秒了,有机会再试一伙!
_Exploiter 发表于 2008-6-1 18:00 | 显示全部楼层

应该是程序架构有问题

再次的元件做出来的效果也不会差那么多。
TOTOJOJO 发表于 2008-6-2 10:00 | 显示全部楼层

软件校准的办法

定时器采用自然益出产生中断的办法,如定时器每1US计一次,那么计1024次产生一次自然益出定时中断,即每1024US产生一次中断,那么1秒内产生1000000/1024=976.5625次中断,我们先假设是977次这样的定时中断进1秒,那么每一秒就会多出0.4375个这样的定时中断 ,这个称之为误差,采用软件校准这个误差就是把这个误差累加到以后的时间计算里去,......,就这样采用软件校准的办法,就OK了.
我尝试用过51单片机、义隆单片机还有ATMEGA单片机做过电子表,都可以做到误差每天小于1秒的,如果再调节下晶振的补偿电容,慢了就调小,快了就调大一点,误差还可以做到更小.
下面有我一段用ATMEGA做的电子表时间误差软件校准的代码DEMO:
if(++time_var.mil_sec_var>=977)
{
      PORTB=PORTB^0b00000001;
      time_var.mil_sec_var=0;
      time_cal_counter=time_cal_counter+4375;
      if(time_cal_counter>=10000)
      {                         time_var.mil_sec_var=1;                time_cal_counter=time_cal_counter-10000;
      }  //callibrate the error time
      if(++time_var.sec_var>=60)
      {                        time_var.sec_var=0;
         if(++time_var.min_var>=60)
    {                              time_var.min_var=0;                          if(++time_var.hour_var>=24)                    time_var.hour_var=0;
    }
      }
}
huangqi412 发表于 2008-6-2 10:13 | 显示全部楼层

用12m的比11的好计算吧 刚好1us.

54楼: 应该不是程序问题, 

首先看你的时钟是多少,然后再看每一分钟慢多少秒,然后调整一下T0或T1给时间一个补偿就可以了!!
最好用11.0592HZ的时钟比较好。
 
 
wlz966 发表于 2008-6-4 09:41 | 显示全部楼层

教你怎么改程序了

定时器不用重装载的,16位计数方式
你先根据晶振计算出一个初值,12M的话,定时器计数一次需1uS,我们50mS中断一次,那这个初值就是65536 - 50000;
就用这个值让钟运行个一个小时,看看有多少误差,然后把这个误差平均分配到每一次的定时当中,这样能让现有的设备得到最准的时间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部