打印

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

[复制链接]
楼主: he119
手机看帖
扫描二维码
随时随地手机跟帖
41
AIRWILL| | 2008-5-29 09:08 | 只看该作者 回帖奖励 |倒序浏览

1.8Mhz以上频率的晶振

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

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

楼上有人的偏差过大, 什么原因? 中断,软件计数里有误差, 丢失了脉冲数了吧? 好好查一下你的软件

使用特权

评论回复
42
HE119| | 2008-5-29 20:00 | 只看该作者

悲哀!

悲哀!悲哀!完成悲哀!

看来新手在这里发贴是一大错误!

使用特权

评论回复
43
soso| | 2008-5-29 21:42 | 只看该作者

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

使用特权

评论回复
44
jerkoh| | 2008-5-29 21:55 | 只看该作者

re

我用51做的时钟今天看了下  5年了慢了1S而已。
有谁比我强
不过天数差了好几天。凑巧凑巧~ 哈哈

使用特权

评论回复
45
soso| | 2008-5-29 21:59 | 只看该作者

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

使用特权

评论回复
46
PowerAnts| | 2008-5-29 22:17 | 只看该作者

加RCC,天文台自动校时

使用特权

评论回复
47
5880527| | 2008-5-29 22:41 | 只看该作者

这里不是学校

网友没有任何义务要给你回答,大家只是因为工**好才聚居在这里讨论的,上面不是很多网友给你说了好多方法了吗,第一页就有好几个网友给你提出了问题的所在,你以为是在学校老师要握住你的手写123啊

使用特权

评论回复
48
mxh0506| | 2008-5-30 12:26 | 只看该作者

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

只要逐条去做,包你能做准

使用特权

评论回复
49
yuewumu| | 2008-5-30 22:10 | 只看该作者

还是程序的问题

lz的自动载入考虑中断响应时间了么?

使用特权

评论回复
50
原野之狼| | 2008-5-31 09:23 | 只看该作者

和标准时间同步一下吧

使用特权

评论回复
51
dai_weis| | 2008-5-31 11:25 | 只看该作者

非常支持46楼的说法

程序有问题要自己找原因,而且已经给了很多提示。

使用特权

评论回复
52
gx_huang| | 2008-5-31 12:15 | 只看该作者

20楼吹牛?

30天不差一秒?
如果光是普通电路,怎么可能?

使用特权

评论回复
53
koolean| | 2008-5-31 12:34 | 只看该作者

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

大家说有道理把。

使用特权

评论回复
54
feifeile| | 2008-5-31 23:31 | 只看该作者

应该不是程序问题,

首先看你的时钟是多少,然后再看每一分钟慢多少秒,然后调整一下T0或T1给时间一个补偿就可以了!!
最好用11.0592HZ的时钟比较好。

使用特权

评论回复
55
dongpei21| | 2008-6-1 08:46 | 只看该作者

晶振和程序问题

试着用时钟芯片,改进一下成序

使用特权

评论回复
56
HE119| | 2008-6-1 11:06 | 只看该作者

有点上升

昨天没事再弄这个时钟,觉得标志位溢出有问题,再算了一下时间,
现在一个小时慢三秒了,有机会再试一伙!

使用特权

评论回复
57
_Exploiter| | 2008-6-1 18:00 | 只看该作者

应该是程序架构有问题

再次的元件做出来的效果也不会差那么多。

使用特权

评论回复
58
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;
    }
      }
}

使用特权

评论回复
59
huangqi412| | 2008-6-2 10:13 | 只看该作者

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

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

首先看你的时钟是多少,然后再看每一分钟慢多少秒,然后调整一下T0或T1给时间一个补偿就可以了!!
最好用11.0592HZ的时钟比较好。
 
 

使用特权

评论回复
60
wlz966| | 2008-6-4 09:41 | 只看该作者

教你怎么改程序了

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

使用特权

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

本版积分规则