找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2473|回复: 19
打印 上一主题 下一主题
收起左侧

单片机定时器时间不准

  [复制链接]
跳转到指定楼层
楼主
无论我选择晶振频率为12MHZ还是11.059Hz ,(用了烧录软件里面的那个定时器计算器) 计时器的时间都比正常的慢,几乎没分钟就要慢5s,各位大佬有没有什么好的解决办法啊。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161164 发表于 2023-5-29 22:46 | 只看该作者
5/60 = 8.333% Error
正常晶振误差没有这么大
程序中是不是用了阻塞式延时?
回复

使用道具 举报

板凳
ID:220661 发表于 2023-5-30 07:45 | 只看该作者
上程序吧,很大可能不是自动赋值的。
回复

使用道具 举报

地板
ID:879348 发表于 2023-5-30 07:57 | 只看该作者
几分钟慢5s不可能
回复

使用道具 举报

5#
ID:712097 发表于 2023-5-30 08:32 | 只看该作者
要精准计时,推荐使用外部时钟芯片如PCF8563,DS1302等。
回复

使用道具 举报

6#
ID:123289 发表于 2023-5-30 08:34 | 只看该作者
好办,再改中断时间常数。
回复

使用道具 举报

7#
ID:57657 发表于 2023-5-30 09:08 | 只看该作者
定时器使用自动重装初值模式,定时器中断里的程序执行时间,不得超过定时器设定的时间。
回复

使用道具 举报

8#
ID:332444 发表于 2023-5-30 09:55 | 只看该作者
看我帖子,单片机频率比时间芯片高一个数量级,定时是很准确的,有误差大多是呆等思路和代码引发的。
回复

使用道具 举报

9#
ID:332444 发表于 2023-5-30 10:06 | 只看该作者
看图片运行1小时半始终保持差1秒同步,也就是无误差。

回复

使用道具 举报

10#
ID:332444 发表于 2023-5-30 10:11 | 只看该作者
这是代码片段

回复

使用道具 举报

11#
ID:123289 发表于 2023-5-30 10:19 | 只看该作者
1、理论上只要是晶振,做到日差1秒之类,没有问题。因为日差1秒,要求的稳定优于1秒/1天=1/86400,约为百万分子11.57。晶振振荡稳定度优于它。
如何做到呢:
2、确保单片机的时基是晶振,而不是内部RC。
3、确保定时器的时钟源,是由晶振分频或不分频的时钟脉冲。
4、建议使用自动重装方式(这一点并不是很重要的),但新手会发生中断时常数重置不准确(如中断后走了一个脉冲再装新的时常数)。
5、中断时常数建议取长1000ms的公约数,例如5、10、20、50、100ms,以便秒计算。对于新手来说,取大一点,间隔时间长一点,发生意外的概率会少一点。
6、由于晶振不会轻易地恰好是12.000000MHz,或是11.0592MHz,所以第5、是做不到精准的。这时你就无法实现日差一秒。
以12M,时钟分频为12,则10ms中断需要,10000个脉冲,通常晶振不是精准的12MHz,如12.000240MHZ,这样10ms就可能是10000.2个时钟,由于时常数只能取最接近的整数10000(实际=65536-10000),所以每次中断最会误:0.2个时钟,拆成时间是0.2us。每秒中断100次,即每秒误差20us,一天就误差1.728秒。这是你所能做到的极限精准度。
7、日差<1秒的技巧:如果每间隔一个时间,对误差进行补偿,至于间隔时间取多少,由你决定,补多少,则需要你知道当前日差是多少秒。这个估计难不倒你。
8、中断服务程序中一定要短,不能超过10ms(前例参考),否则,会丢失一个中断,这样计时就无法精准控制了,这是重重之重!
记住:中断服务只做计时,与之无关的计算,以及其它事件,只做个标记,放到主程序中,依标记再做。这样中断服务程序就短了,不会超时了。
回复

使用道具 举报

12#
ID:1061331 发表于 2023-5-30 10:58 | 只看该作者
可以试试用软件来调整过来
回复

使用道具 举报

13#
ID:401564 发表于 2023-5-30 12:48 | 只看该作者
每分钟慢5秒,我都不用分析,直接就告诉你,这是代码不对
10个小时以内的定时器,完全可以直接用单片机片上的RC时钟,都不需要用到晶振
回复

使用道具 举报

14#
ID:291668 发表于 2023-5-30 13:21 | 只看该作者
误差太大了。好好检查一下。
回复

使用道具 举报

15#
ID:1079863 发表于 2023-5-30 14:44 | 只看该作者
at89c52单片机定时器的时间可能比正常的慢的原因有以下几种123:  晶振的频率不准确,导致时钟信号的周期不稳定,影响定时器的计数速度; 定时器的工作模式设置不正确,导致定时器的计数范围或重装载值不合适,影响定时器的溢出时间; 定时器的中断服务程序执行时间过长,导致定时器的中断响应延迟,影响定时器的溢出标志清零; 定时器的中断优先级设置不合理,导致定时器的中断被其他高优先级的中断打断,影响定时器的中断处理; 定时器的计数源选择错误,导致定时器从外部引脚输入计数信号,而不是从内部系统时钟输入,影响定时器的计数精度。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

16#
ID:883242 发表于 2023-5-30 16:10 | 只看该作者
chxelc 发表于 2023-5-30 08:32
要精准计时,推荐使用外部时钟芯片如PCF8563,DS1302等。

RTC的优点是功耗极低,掉电依然可以运行。缺点是32768的音叉晶体没有MHz级AT-cut晶体稳定,实际上更加不准确。
回复

使用道具 举报

17#
ID:332444 发表于 2023-5-30 16:32 | 只看该作者
运行8小时后依然无差


回复

使用道具 举报

18#
ID:1074206 发表于 2023-5-30 17:26 | 只看该作者
虽然51的精度不是很高,但绝不会出现你说的这种情况,一定是程序里面有问题
回复

使用道具 举报

19#
ID:1081090 发表于 2023-5-31 13:57 | 只看该作者
可能的原因:
1、晶振未起振,程序用RC在跑
2、定时器阻塞了(比如你在10ms定时器里跑了个可能需要12ms的程序)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表