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

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是怎么算的吧!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
77条回答
balance
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 类似。
    要是用时钟芯片,会不会降低系统的稳定性呢?毕竟多了一部分电路,且在单片机外部,在工控场合会不会容易受到干扰而计时不准呢?
    而且多一个芯片,就会多一部分成本啊。当然啦,人工费,软件费,还有其他一些想得到的想不到的费用都不计。单就是器件费用而言的。

一周热门 更多>