标题: 单片机定时器时间不准 [打印本页]

作者: 菜鸟的菜鸟一号    时间: 2023-5-29 20:53
标题: 单片机定时器时间不准
无论我选择晶振频率为12MHZ还是11.059Hz ,(用了烧录软件里面的那个定时器计算器) 计时器的时间都比正常的慢,几乎没分钟就要慢5s,各位大佬有没有什么好的解决办法啊。

作者: lkc8210    时间: 2023-5-29 22:46
5/60 = 8.333% Error
正常晶振误差没有这么大
程序中是不是用了阻塞式延时?
作者: gongnn    时间: 2023-5-30 07:45
上程序吧,很大可能不是自动赋值的。
作者: wufa1986    时间: 2023-5-30 07:57
几分钟慢5s不可能
作者: chxelc    时间: 2023-5-30 08:32
要精准计时,推荐使用外部时钟芯片如PCF8563,DS1302等。
作者: yzwzfyz    时间: 2023-5-30 08:34
好办,再改中断时间常数。
作者: npn    时间: 2023-5-30 09:08
定时器使用自动重装初值模式,定时器中断里的程序执行时间,不得超过定时器设定的时间。
作者: xianfajushi    时间: 2023-5-30 09:55
看我帖子,单片机频率比时间芯片高一个数量级,定时是很准确的,有误差大多是呆等思路和代码引发的。
作者: xianfajushi    时间: 2023-5-30 10:06
看图片运行1小时半始终保持差1秒同步,也就是无误差。


作者: xianfajushi    时间: 2023-5-30 10:11
这是代码片段


作者: yzwzfyz    时间: 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(前例参考),否则,会丢失一个中断,这样计时就无法精准控制了,这是重重之重!
记住:中断服务只做计时,与之无关的计算,以及其它事件,只做个标记,放到主程序中,依标记再做。这样中断服务程序就短了,不会超时了。

作者: 13423265909    时间: 2023-5-30 10:58
可以试试用软件来调整过来
作者: Y_G_G    时间: 2023-5-30 12:48
每分钟慢5秒,我都不用分析,直接就告诉你,这是代码不对
10个小时以内的定时器,完全可以直接用单片机片上的RC时钟,都不需要用到晶振
作者: li64331218    时间: 2023-5-30 13:21
误差太大了。好好检查一下。
作者: 陶888    时间: 2023-5-30 14:44
at89c52单片机定时器的时间可能比正常的慢的原因有以下几种123:  晶振的频率不准确,导致时钟信号的周期不稳定,影响定时器的计数速度; 定时器的工作模式设置不正确,导致定时器的计数范围或重装载值不合适,影响定时器的溢出时间; 定时器的中断服务程序执行时间过长,导致定时器的中断响应延迟,影响定时器的溢出标志清零; 定时器的中断优先级设置不合理,导致定时器的中断被其他高优先级的中断打断,影响定时器的中断处理; 定时器的计数源选择错误,导致定时器从外部引脚输入计数信号,而不是从内部系统时钟输入,影响定时器的计数精度。
作者: Hephaestus    时间: 2023-5-30 16:10
chxelc 发表于 2023-5-30 08:32
要精准计时,推荐使用外部时钟芯片如PCF8563,DS1302等。

RTC的优点是功耗极低,掉电依然可以运行。缺点是32768的音叉晶体没有MHz级AT-cut晶体稳定,实际上更加不准确。
作者: xianfajushi    时间: 2023-5-30 16:32
运行8小时后依然无差



作者: kk17328    时间: 2023-5-30 17:26
虽然51的精度不是很高,但绝不会出现你说的这种情况,一定是程序里面有问题
作者: weihua8206    时间: 2023-5-31 13:57
可能的原因:
1、晶振未起振,程序用RC在跑
2、定时器阻塞了(比如你在10ms定时器里跑了个可能需要12ms的程序)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1