打印

请教:用单片机做的电子钟,11.0592晶振,约三分钟就慢1秒!

[复制链接]
楼主: 89cpu
手机看帖
扫描二维码
随时随地手机跟帖
41
agency1980| | 2007-12-7 18:09 | 只看该作者 回帖奖励 |倒序浏览

软时钟做准很难的

可以自己做的玩玩,但这种东西只能在实验室里与要求不高的场合使用.当然你不考虑成本采用带温补的晶振是有可能的.现在有些供电公司装的分时电能表,各厂家都是用硬件时钟(R8025)做的,但不做温度补偿也做不到0.5s/d的

使用特权

评论回复
42
89cpu|  楼主 | 2007-12-8 09:31 | 只看该作者

带温补的晶振价格多少啊?

贵吗? 好像没见过. 

使用特权

评论回复
43
ty5004| | 2007-12-8 16:35 | 只看该作者

应该是仿真的时候时间就快了

使用特权

评论回复
44
czfys2007| | 2007-12-8 20:27 | 只看该作者

换带副振的芯片,用32.768的晶振

换带副振的芯片,用32.768的晶振,可以做到几乎没误差~

使用特权

评论回复
45
liuguobing| | 2007-12-8 23:26 | 只看该作者

晶振和软件都可能有关系

最开始不太懂修正,做出来的时钟误差应该应该说很离谱。

至于现在做时钟一般是用32768的晶振吧,但是大家有没有去仔细的注意那个频率呢?是否用示波器测过其晶振波形呢?
前段时间做了个时钟类的小产品,能过不同的电容,调晶振的频率都精确到32.7680KHZ,所做的实验表明,用22pf电容最合适(25的也可以)。 而我在现在做的一个ARM项目中,时钟要求不严格,用的30pf电容,我随便一测,频率为 32.75x(不太记得是不是这么多,也可能是32.765x) ,可见其精度相差甚远。对于一般的要求也不用太在意,但如果是真正的时钟,还是得多花些时间多测一下。不然做出的产品绝对不合格。

使用特权

评论回复
46
txh353012| | 2007-12-9 00:29 | 只看该作者

有个简单的办法啊!

用单片机编译器的跑表啊,
什么11.0592 .什么12M 都行.怎么加语句都行.
你跑表以后可以看到一个中断差多少,再该中断的定时.(11.0592改不到很准,建议用12M的,但是调节后怎么不会3小时差一秒.)应该会一个月差几秒了.
还有就是晶振的质量要好,最好选那种长一点的.那种会稳定些.

使用特权

评论回复
47
sinanjj| | 2007-12-9 18:52 | 只看该作者

31楼的

"但是, 现在,改到#39H,感觉差不多了: 
若再加1,就会变快; 若再减1,就会变慢; "

这个很难解决.

精度要那么高, 还是用"4位的单片机用32.768K振荡就可以保证很稳很准"---37楼.

手表的晶振就是32.768Khz的.

使用特权

评论回复
48
nyf1972| | 2007-12-10 20:20 | 只看该作者

我给你一个建议,100%保证精度。

下面内容是在保证晶体准确度的情况下而进行的探讨:
首先:11059200=144*64*100*12,其中12为机器周期和指令周期的关系。100是为了保持准确度取的10ms为单位,1秒的次数,当然,也可以取100ms为单位,那么该次数就为10.前面那个144是8位自动装载的值,这个值尽量大,这样可以少一些中断次数,有些可以使用16位的自动装载,那么问题就非常简单了。64这个数字就不用太解释了。
假设T0自动装载的值为144,装载后每次进入一个中断,中断的任务是CNT_T0加一
那么
if(++Cnt_t0==64)
   {
   Cnt_10ms++;//表示10ms计数加一
   Cnt_t0=0;
   }
//64次自动装载后,总的时间为10ms。这个只要保证T0的优先级,保证T0自动装载的时候,一定会发生中断就可以。至于是否马上或等待几个周期后进入,这个是没有关系的。
主程序中,就使用CNT_10ms就可以了。我不管在什么时候使用CNT_10ms,本程序不会产生累计误差的。实际我们平时要求没有太高,显示问题可以早几个ms,晚几个ms.但是视觉上是没有多大的变化的。同时又能够保证定时的准确度。
   个人不太同意使用软件补偿的方法来做。毕竟补偿的方法是不可靠的。
   这个方法我本人是经过测试过的。每天系统的误差在3秒以内。这个3秒还是晶体的温度变化引起的。
   希望对你有点儿用处。

使用特权

评论回复
49
qihao| | 2007-12-10 23:08 | 只看该作者

定时中断自身开销!

使用特权

评论回复
50
xwj| | 2007-12-11 03:51 | 只看该作者

不同意48楼的方法

144周期就中断一次,中断太过于频繁了

再就是,“软件补偿的方法”和避免低位重载的方法完全可以做到无累计误差的,根本就不存在什么“不可靠”,做的不对那也是你的问题。

至于时钟校准的3种方案,看我30楼的贴吧

估计没人仔细看过...

使用特权

评论回复
51
nyf1972| | 2007-12-11 15:37 | 只看该作者

256*36*100*12

11059200=144*64*100*12=256*36*100*12
这样做行不?

使用特权

评论回复
52
xwj| | 2007-12-11 16:00 | 只看该作者

呵呵,当然可以,11059200是个相当绝妙的频率

11059200=2^14 * 3^3 * 5^2
51或别的单片机都可以很容易的获得标准波特率和能被256整除的重载值。

比如10mS、5mS、2.5mS、10/3mS的整数倍的定时时间,而这些定时值低位都不需要重载!

使用特权

评论回复
53
tc9148| | 2007-12-11 19:25 | 只看该作者

可以

可以减少定时中断程序里的命令行,转移到主程序中。

使用特权

评论回复
54
ayb_ice| | 2007-12-11 19:57 | 只看该作者

再次强调

用什么频率的晶振不是问题。。。

使用特权

评论回复
55
xwj| | 2007-12-11 20:28 | 只看该作者

是的,我也持LS的见解

使用特权

评论回复
56
hotpower| | 2007-12-11 20:32 | 只看该作者

感觉是程序的问题~~~

使用特权

评论回复
57
aolin| | 2007-12-12 10:21 | 只看该作者

又在讨论51的时钟了,凑个热闹!

现在已经很明确了,可以完全消除软件引入的误差,下一步该讨论晶体的精度了.
消费电子中做电子钟的晶体大部分都用32.768KHz,4.19304MHz, 它们的精度通常是多少PPM的?
我们51所用的12MHz,11.0592MHz通常又是多少PPM的?

使用特权

评论回复
58
王砚成| | 2007-12-12 12:59 | 只看该作者

看看

都是新手,就几个建议供参考:
1.首先程序要对
2.频率最好能整除
3.晶振精度要高,我想搂主用的晶体精度不会超过20ppm。你自己可以计算一下一年能有几分钟的误差。

使用特权

评论回复
59
yanmch| | 2007-12-13 16:21 | 只看该作者

有关用51单片机定时器做软时钟的问题

已彻底解决

使用特权

评论回复
60
hgjinwei| | 2007-12-14 22:51 | 只看该作者

11.0592是可以的

我搞过,和计算机的时间还看不出积累误差.
通过T2自动重装定时,

使用特权

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

本版积分规则