精确定时是用单片机内的定时器好还是时钟芯片好

2020-02-05 08:53发布

刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&bbs_page_no=1&search_mode=1&search_text=定时&bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器T0中断函数**********/
void t0(void) interrupt 1  
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;//这样的定时数据,是不是正好是50000*1微秒=50毫秒?
aa++;
if(aa==18)//这里的意思是中断18次,需要1秒的时间(晶振12MHz),我怎么感觉应该是中断20次用时1秒?
  {
    aa=0;
    miao++;
    if(miao==60)
    {
      miao=0;
      fen++;
       if(fen==60)
        {
           fen=0;
           shi++;
          if(shi==24)
             shi=0;
        }
    }
  }

----------------问题附在注释里面,请指点一下,看看这个18是怎么算的吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
76条回答
bitter_rain
1楼-- · 2020-02-08 21:27
回复【楼主位】balance
    刚看了一个帖子http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4056474&bbs_page_no=1&search_mode=1&search_text=定时&bbs_id=9999
好像用单片机内的定时器定时会有误差,是这样吗?误差来源是什么呢?定时器不是1微妙加一计时的吗? 怎么会有误差呢?我用过方式2,就是那种自动重装载的方式,用protues仿真运行一个小时,好像也看不到误差啊?
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
帖子内容如下:
/********定时器t0中断函数**********/  
void t0(void) interrupt 1   
{  
th0=(65536-5000......
-----------------------------------------------------------------------
进中断是要时间,但是决不影响计时精度。

影响精度的只有一个因素,那就是晶振本省。若晶振毫无误差,计时就可以毫无误差
fanka
2楼-- · 2020-02-08 21:55
 精彩回答 2  元偷偷看……
little_Monkey
3楼-- · 2020-02-08 23:59
回复【33楼】fanka
回复【32楼】bitter rain  
若晶振毫无误差,计时就可以毫无误差   
-----------------------------------------------------------------------
不敢苟同,代码的运行是需要占用cpu时间的,进行精确的定时必须考虑代码的运行时间。

-----------------------------------------------------------------------

自动重装模式。。。
balance
4楼-- · 2020-02-09 03:59
看来我这个坑是越挖越深了。首先感谢大家的激_情似火的讨论。看了一遍大家的讨论,我得出的结论和【26楼】 zhangxun0712
的结论一样。
    首先要明确题目,单片机内的定时器与时钟芯片相比较哪个更准。基于此题目,对于晶振的误差当然就不考虑在内了,毕竟两种方案都要用晶振,晶振误差是不可避免的,而中断响应时间嘛,却要考虑在内,毕竟中断是定时器与单片机沟通的桥梁嘛。
    至于【23楼】 takashiki 岚月影,说到的那种不用中断的定时方式,确实挺好,可是我毕竟还是要把定时用在很多场合的,就我现在而言,只是想用这个时间来做一个定时开关的(可任意设定开通和关断时间的那种,类似于闹钟吧,而且是能设定多个时间的那种)。不能只用于方波的产生啊。
    我的理解是,单片机内的定时器与时钟芯片相具有同等的精确性(有人还想咬晶振的话,请参照上面的第二段)(非自动重载方式,在定时溢出之前and自动重载方式却可以无限定时)。至于这个定时之后的事情嘛,那是cpu要做的事情了,与定时器和时钟芯片无关。
    所以请大家不要再在中断响应时间上大吐口水了。对于软件延时,小生确实不敢重用,毕竟一个系统中要是不用中断的话,确实做不出什么大文章。当然啦,有人还非要较真,定时1uS(12M晶振)之类的,那个确实该用软件延时啦。
    既然是定时,那就必然会在定时时间到后做一些事情啦。cpu或主动或被动获取这个时间。
    时钟芯片,我觉得是cpu主动获取的吧,不过这里还有个疑问,cpu该怎么获取呢,难道cpu要把时钟芯片的时间取过来,实时的与定时时间相比较呢?或者是时钟芯片有定时报警之类的东西,这样的话(就是cpu被动了),是不是要通过中断告诉cpu,定时时间到,要是这样的话,不就是也有中断响应时间的问题吗?(希望得到大家的解惑)
    单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。
    我的初衷和【32楼】 bitter rain 类似。
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
    而且多一个芯片,就会多一部分成本啊。当然啦,人工费,软件费,还有其他一些想得到的想不到的费用都不计。单就是器件费用而言的。
little_Monkey
5楼-- · 2020-02-09 05:23
我的理解是,单片机内的定时器与时钟芯片相具有同等的精确性(有人还想咬晶振的话,请参照上面的第二段)(非自动重载方式,在定时溢出之前and自动重载方式却可以无限定时)。至于这个定时之后的事情嘛,那是cpu要做的事情了,与定时器和时钟芯片无关。
--------------------------------非自动重装模式一样要考虑中断后CPU响应时间和赋初值的时间,

时钟芯片,我觉得是cpu主动获取的吧,不过这里还有个疑问,cpu该怎么获取呢,难道cpu要把时钟芯片的时间取过来,实时的与定时时间相比较呢?或者是时钟芯片有定时报警之类的东西,这样的话(就是cpu被动了),是不是要通过中断告诉cpu,定时时间到,要是这样的话,不就是也有中断响应时间的问题吗?(希望得到大家的解惑)
--------------------------------------------------------------------------比较,先比较小时,小时匹配再比较分钟,这样比较的次数最少,效率高,最多比较次数也才23+59次而已,带闹钟的时钟芯片也有,闹钟时间到来以后CPU响应的时间不会超过1S吧?闹钟可是一分钟之内都有效的,忽略

单片机内的定时器嘛,好像就只有定时中断一种吧。既然定时准确,自动重载方式中,又无误差累计,还有什么要计较的吗?既然都用定时器啦,那肯定是mS级别以上的吧,差那么1~4个周期的中断响应时间又不伤大雅,否则,您还是用软件延时吧。
--------------------------------------
每次1个周期的误差(按12M算是1us),假设定时250us,那么就是1/250的误差了,当250min后就会有1min的误差,每天就是5分多的误差,很可观而不是无伤大雅。。


要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
-----------------------------------------------------
听说过CPU死机,跑飞的,没听过时钟芯片跑飞,死机的(孤陋寡闻了,呵呵),而且时钟芯片的耗电比CPU可是小很多的,特别是在掉电以后
takashiki
6楼-- · 2020-02-09 05:58
回复楼主:
本帖我以前的一些回复有些偏激,因为某人的某些语气受不了。即使使用T2来定时,也同样是需要进出中断的,我那个例子只是讲T2定时器具有时钟输出功能,同样说明使用T2可以进行16位自动重载而不至计时不精确。

下面是我的一些个人看法,不见得正确。

晶振是需要考虑的,原因在于单片机一般采样的都是高频晶振,而时钟芯片一般采用的32768Hz的表振,精度是不一样的。很少有人在单片机上使用高精度的晶振,所以,不可一概而论。

本人习惯于芯片数量越少越好,习惯而已。要是我选择,我绝对不会选择外部时钟芯片,我会选择带有RTC的单片鸡。现在的单片机种类多得很,适用于不同用途的总是可以选到的,我会为不同的项目选择各自合适的芯片,而不是单一一种包打天下。

一周热门 更多>